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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2254|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 美女一区二区在线观看 | 一级国产精品一级国产精品片 | 日批免费看 | 国产精品揄拍一区二区久久国内亚洲精 | 精品一区二区三区四区五区 | 在线a视频| 国产真实精品久久二三区 | 欧美成人一区二免费视频软件 | www.成人久久 | 精品久草 | 日韩欧美精品 | 久久在线免费 | 99re在线视频 | 国产精品夜间视频香蕉 | 91色视频在线观看 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 91精品久久久| www.久久久.com| 国产精品视频久久 | 精品日韩在线观看 | 91秦先生艺校小琴 | 九九综合 | 免费日本视频 | 精品国产亚洲一区二区三区大结局 | 亚洲 欧美 另类 综合 偷拍 | 神马久久久久久久久久 | 国产精品1区 | 日韩久久久久 | 亚洲综合无码一区二区 | 在线观看国产h | 人妖无码 | 亚洲精品视频免费观看 | 97久久超碰 | 99久久99热这里只有精品 | 一区二区三区福利视频 | 综合一区二区三区 | 欧美在线视频二区 | 成人性视频免费网站 | 特黄特色大片免费视频观看 | 超黄毛片 | 免费福利视频一区二区三区 |