久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2182|回復: 6
打印 上一主題 下一主題
收起左側

在用單片機外部中斷控制數碼管增減時按鍵按下數碼管會閃爍,各位大佬為什么?

[復制鏈接]
跳轉到指定樓層
樓主
ID:973385 發表于 2021-10-19 17:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include <STC89C5xRC.H>
  2. void Delay20us()        //@11.0592MHz
  3. {
  4.     unsigned char i;
  5.     i = 52;
  6.     while (--i);
  7. }

  8. void Delay10ms()        //@11.0592MHz
  9. {
  10.     unsigned char i, j;
  11.     i = 108;
  12.     j = 145;
  13.     do
  14.     {
  15.         while (--j);
  16.     } while (--i);
  17. }

  18. int i, k=1, t, j, sum;

  19. const unsigned char seg_code[] = {    0x3F,/*0*/ 0x06,/*1*/ 0x5B,/*2*/ 0x4F,/*3*/ 0x66,/*4*/ 0x6D,/*5*/ 0x7D,/*6*/ 0x07,/*7*/    0x7F,/*8*/ 0x6F,/*9*/};

  20. void main(){
  21. IT0 = 1;
  22. EX0 = 1;
  23. IT1 = 1;
  24. EX1 = 1;
  25. EA = 1;
  26. while(1){
  27. j=sum;
  28. for(k=1;j>=10;k++){
  29. j/=10;
  30. }
  31. t=sum;
  32. for(i = 0;i < k;i++){
  33.         P2 = i<<2;
  34.         P0 = seg_code[t%10];
  35.         Delay20us();
  36.         P0 = 0x00;
  37.         t/=10;
  38.         }
  39.     }
  40. }

  41. void int0() interrupt 0{
  42. Delay10ms();
  43. if(P32 == 0){
  44. sum++;
  45. if(sum>9999)sum=0;
  46.     }
  47. }

  48. void int1() interrupt 2{
  49. Delay10ms();
  50. if(P33 == 0){
  51. sum--;
  52. if(sum<0)sum=9999;
  53.     }
  54. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:313048 發表于 2021-10-19 18:02 | 只看該作者
中斷里面不應該放置 while,它會將main函數中的while打斷,導致你的掃描中斷
回復

使用道具 舉報

板凳
ID:466505 發表于 2021-10-19 18:02 | 只看該作者
按鍵后延時導致的吧
回復

使用道具 舉報

地板
ID:130230 發表于 2021-10-19 18:02 | 只看該作者
外部中斷里面不要放延時函數,程序響應外部中斷的過程中無法刷新數碼管。如果非得用延時,可以把數碼管刷新放定時器中斷里面,然后把定時器中斷的優先級調高。
回復

使用道具 舉報

5#
ID:57657 發表于 2021-10-19 20:58 | 只看該作者
無論是什么程序,至少開啟一個定時器中斷
按鍵消抖、流水燈、數碼管動態掃描、延時任意毫秒什么的, 全部交給定時器中斷去處理。

軟件延時少用或不用
回復

使用道具 舉報

6#
ID:973385 發表于 2021-10-19 21:59 | 只看該作者
謝謝各位,不過我還沒學定時器,不過我改了一下,這樣也能比較好的解決,等我學到了應該就可以看懂吧
void int0() interrupt 0{
if(P32 == 0)
Delay5ms();
if(P32 == 0){
sum++;
if(sum>9999)sum=0;
        }
}

void int1() interrupt 2{
if(P33 == 0)
Delay5ms();
if(P33 == 0){
sum--;
if(sum<0)sum=9999;
        }
}
回復

使用道具 舉報

7#
ID:161164 發表于 2021-10-20 11:09 | 只看該作者
只是按鍵增減顯示數值
沒必要用中斷吧?
只不過是顯示代碼寫的不好
長期占用系統資源
才不得不用中斷來補救吧

推薦這種按鍵掃描代碼:
  1. void key_Proc()
  2. {
  3.         static unsigned char Delay_XD=0;
  4.         if(P32 == 0 || P33 == 0)
  5.         {
  6.                 if(Delay_XD<0xFF)Delay_XD++;
  7.                 if(Delay_XD==250)//按反應減少
  8.                 {
  9.                         if(P32 == 0)
  10.                         {
  11.                                 sum++;
  12.                                 if(sum>9999)sum=0;
  13.                         }
  14.                         if(P33 == 0)
  15.                         {
  16.                                 sum--;
  17.                                 if(sum<0)sum=9999;
  18.                         }
  19.                 }
  20.         }
  21.         else
  22.         {
  23.                 Delay_XD = 0;
  24.         }
  25. }
復制代碼

關掉中斷,把key_Proc();放到for(k=1;j>=10;k++){}里
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本欧美国产在线观看 | 欧洲亚洲精品久久久久 | 91精品国产91久久久久久最新 | 青青久草| 久久久久久久久久久久久久久久久久久久 | 日本一区二区三区在线观看 | tube国产| 超碰在线影院 | 自拍偷拍一区二区三区 | 亚洲精品视频网站在线观看 | 一级在线| 一级片av| 亚洲一区二区三区四区五区中文 | av手机在线| 国产精品久久久久久久午夜 | 久久香焦 | 久久久久久亚洲精品 | 一级特黄色毛片 | 久久久久1 | 黄色国产在线播放 | 91视频在线网站 | 久久激情视频 | 日韩一区二区三区在线观看视频 | 亚洲福利片| 国产一区二区三区 | 久久综合一区二区 | 美人の美乳で授乳プレイ | 国产欧美日韩精品一区二区三区 | 精品日韩一区二区 | 中文字幕在线免费 | 国产精品亚洲第一区在线暖暖韩国 | 三级在线视频 | 亚洲福利av | 日韩资源 | 在线观看亚洲精品视频 | 久久精品国产99国产 | 9久久精品| 日韩精品在线免费观看视频 | 99久9| 91伊人| 视频一区二区在线观看 |