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

標(biāo)題: 單片機(jī)按鍵消抖經(jīng)典算法,親測很好用,不信自己試試,分享就是快樂! [打印本頁]

作者: zouminglu    時(shí)間: 2020-7-12 23:52
標(biāo)題: 單片機(jī)按鍵消抖經(jīng)典算法,親測很好用,不信自己試試,分享就是快樂!
/*功能:實(shí)現(xiàn)按鍵計(jì)數(shù),4位數(shù)碼管上顯示計(jì)數(shù)值,   實(shí)驗(yàn)?zāi)康模喊存I穩(wěn)定消抖,按鍵按下一次只執(zhí)行一次操作,*/

單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. typedef unsigned char uint8;
  4. #include<reg52.h>
  5. #include<intrins.h>
  6. typedef unsigned char uint8;                          
  7. typedef unsigned int uint16;                           
  8. typedef unsigned long uint32;

  9. sbit KEYGND=P3^4; //矩陣按鍵的一條列線,此程序?qū)EYGND=0,模擬出3個(gè)獨(dú)立按鍵的到地
  10. sbit K1 = P3^5;
  11. sbit K2 = P3^6;
  12. sbit K3 = P3^7;
  13. sbit LED = P1^7;
  14. uint8 code seg[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //0-9段碼
  15. uint8 dis[4]={0,0,0,0};//位顯緩存
  16. uint16 count=0,ms;

  17. void KeyScan(void)  //這里的松手檢測很好用,值得記住,在定時(shí)中斷函數(shù)中每20ms調(diào)用一次KeyScan(),非常完美,基本不會(huì)不影響其程序運(yùn)行,
  18. {                   //按下只產(chǎn)生一次操作
  19.      static bit KeyOnOff = 0;  //這里一定要定義為靜態(tài)變量或者全局變量
  20.      if(K1==0||K2==0||K3==0)             //  判斷是否有按鍵按下
  21.       {
  22.         if(KeyOnOff == 0)         //  自鎖變量
  23.          {
  24.              KeyOnOff = 1;   // 屏蔽這句話,將沒有松手檢測,數(shù)字加的快
  25.              if(K1==0) //按K1加數(shù)
  26.              {
  27.                 count++;
  28.              }
  29.              if(K2==0)  //按K2減數(shù)
  30.              {
  31.                 count--;
  32.              }
  33.              if(K3==0)  //按K3歸零
  34.              {
  35.                 count=0;
  36.              }
  37.           }
  38.       }
  39.      else
  40.       {
  41.         KeyOnOff = 0;    //  當(dāng)沒有按鍵按下時(shí)  解鎖
  42.       }
  43. }
  44. /*********************毫秒延時(shí)函數(shù)************************************/
  45. void delay1ms(unsigned char n)   
  46. {
  47.     unsigned char a,b,c;
  48.                 for(c=n;c>0;c--)
  49.     for(b=102;b>0;b--)
  50.         for(a=3;a>0;a--);
  51. }

  52. /**************************數(shù)據(jù)處理和刷新顯示函數(shù)*********************/
  53. void disp_count()  //數(shù)碼管顯示函數(shù)
  54. {
  55.         uint8 i=0;        
  56.         dis[0]=count%10;       //計(jì)數(shù)器顯示用刷新函數(shù)
  57.         dis[1]=count/10%10;    //計(jì)數(shù)器顯示用刷新函數(shù)
  58.         dis[2]=count/100%10;    //計(jì)數(shù)器顯示用刷新函數(shù)
  59.         dis[3]=count/1000%10;   //計(jì)數(shù)器顯示用刷新函數(shù)
  60.         
  61.         if(dis[3]==0)
  62.         {
  63.                  dis[3]=0x0a;  //高位為零不顯示,
  64.                  if(dis[2]==0)
  65.                  {
  66.             dis[2]=0x0a;  //高位為零不顯示,
  67.             if(dis[1]==0)
  68.             {
  69.                 dis[1]=0x0a;  //高位為零不顯示,
  70.             }
  71.                  }
  72.         }

  73.         for (i=0;i<4;i++)
  74.         {
  75.                         switch(i)           
  76.             {
  77.                 case 0: P0=0Xff; P2=0xfe;break;  //這里的P0=0XFF的目的是消除鬼影
  78.                 case 1: P0=0Xff; P2=0xfd;break;         //這里的P0=0XFF的目的是消除鬼影
  79.                 case 2: P0=0Xff; P2=0xfb;break;  //這里的P0=0XFF的目的是消除鬼影
  80.                 case 3: P0=0Xff; P2=0xf7;break;  //這里的P0=0XFF的目的是消除鬼影
  81.             }
  82.                         P0=seg[dis[i]];
  83.                         delay1ms(1);
  84.         }
  85. }

  86. /*************定時(shí)器初始化函數(shù)*************/
  87. void InitTimer0(void)
  88. {
  89.     TMOD = 0x01;
  90.     TH0 = 0xfc;  //TH0=0xfc,TL0=0x66組合是1毫秒的初值
  91.     TL0 = 0x66;  //
  92.     EA = 1;
  93.     ET0 = 1;
  94.     TR0 = 1;
  95. }   

  96. /*****************************************主函數(shù)*******************************/
  97. void main()
  98. {
  99.     P0=0xff;  //4位數(shù)碼管段碼
  100.     P2=0xff;  //4位數(shù)碼管位碼
  101.     KEYGND=0;
  102.     InitTimer0(); //定時(shí)器初始化函數(shù)
  103.     while(1)
  104.     {

  105.         disp_count();  //數(shù)碼管顯示函數(shù)
  106.         delay1ms(1);   
  107.     }
  108. }

  109. /************************************INT0定時(shí)中斷函數(shù)****************************/
  110. void Timer0Interrupt(void) interrupt 1
  111. {
  112.     TH0 = 0xfc;
  113.     TL0 = 0x66;
  114.                 ms++;      
  115.         if(ms%20==0) //每20ms執(zhí)行一次按鍵檢測
  116.         {
  117.            KeyScan();
  118.         }
  119.                
  120. }  
復(fù)制代碼


作者: 51hei團(tuán)團(tuán)    時(shí)間: 2020-7-13 15:29
很好的思路,值得學(xué)習(xí)
作者: BG6BXN    時(shí)間: 2020-7-13 15:38
經(jīng)典!收藏了。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久久性色精品国产免费观看 | 正在播放亚洲 | 欧美a∨ | 日韩中文在线视频 | av一区二区三区四区 | 麻豆一区一区三区四区 | 欧美不卡视频一区发布 | 一级免费a| 国产精品欧美一区喷水 | 欧美一级在线 | 美女在线一区二区 | 国产精品特级毛片一区二区三区 | 神马久久久久久久久久 | 欧美一区二区三区在线 | 久久新 | av大片| 亚洲精品久久 | 国产精品资源在线 | 成人不卡视频 | 在线免费观看色 | 视频一区在线观看 | 最近中文字幕第一页 | 国产在线a视频 | 国产美女一区二区 | 久久久久久国产精品mv | 国产在线一区二区三区 | 91国内视频在线 | 久草网在线视频 | 欧美一级黄带 | 免费视频一区二区 | 一级国产精品一级国产精品片 | 一级片av | 欧美区在线观看 | 日韩av免费在线观看 | 亚洲国产一区二区三区, | 毛片网站在线观看 | 久草网站| 日韩一区不卡 | 亚洲精品成人av久久 | 99精品国自产在线 | 欧美激情国产精品 |