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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4313|回復: 2
收起左側

單片機按鍵消抖經典算法,親測很好用,不信自己試試,分享就是快樂!

  [復制鏈接]
ID:114701 發表于 2020-7-12 23:52 | 顯示全部樓層 |閱讀模式
/*功能:實現按鍵計數,4位數碼管上顯示計數值,   實驗目的:按鍵穩定消抖,按鍵按下一次只執行一次操作,*/

單片機源程序如下:
  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; //矩陣按鍵的一條列線,此程序將KEYGND=0,模擬出3個獨立按鍵的到地
  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)  //這里的松手檢測很好用,值得記住,在定時中斷函數中每20ms調用一次KeyScan(),非常完美,基本不會不影響其程序運行,
  18. {                   //按下只產生一次操作
  19.      static bit KeyOnOff = 0;  //這里一定要定義為靜態變量或者全局變量
  20.      if(K1==0||K2==0||K3==0)             //  判斷是否有按鍵按下
  21.       {
  22.         if(KeyOnOff == 0)         //  自鎖變量
  23.          {
  24.              KeyOnOff = 1;   // 屏蔽這句話,將沒有松手檢測,數字加的快
  25.              if(K1==0) //按K1加數
  26.              {
  27.                 count++;
  28.              }
  29.              if(K2==0)  //按K2減數
  30.              {
  31.                 count--;
  32.              }
  33.              if(K3==0)  //按K3歸零
  34.              {
  35.                 count=0;
  36.              }
  37.           }
  38.       }
  39.      else
  40.       {
  41.         KeyOnOff = 0;    //  當沒有按鍵按下時  解鎖
  42.       }
  43. }
  44. /*********************毫秒延時函數************************************/
  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. /**************************數據處理和刷新顯示函數*********************/
  53. void disp_count()  //數碼管顯示函數
  54. {
  55.         uint8 i=0;        
  56.         dis[0]=count%10;       //計數器顯示用刷新函數
  57.         dis[1]=count/10%10;    //計數器顯示用刷新函數
  58.         dis[2]=count/100%10;    //計數器顯示用刷新函數
  59.         dis[3]=count/1000%10;   //計數器顯示用刷新函數
  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. /*************定時器初始化函數*************/
  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. /*****************************************主函數*******************************/
  97. void main()
  98. {
  99.     P0=0xff;  //4位數碼管段碼
  100.     P2=0xff;  //4位數碼管位碼
  101.     KEYGND=0;
  102.     InitTimer0(); //定時器初始化函數
  103.     while(1)
  104.     {

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

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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本一区二区三区四区 | 亚洲天天干 | 天天操天天干天天曰 | 日韩影音| 久久久久国产一区二区三区四区 | 国产网站在线播放 | 国产专区在线 | 一区二区视频在线观看 | 欧美一级二级在线观看 | 国产美女在线观看 | 成年网站在线观看 | 99国产视频 | 91久久精品一区二区二区 | 精品久久久久久久久久久久 | 免费在线视频一区二区 | 国产在线激情视频 | 欧美精品一区二区三区在线 | 日韩欧美在线播放 | 中文字幕免费中文 | 国产高清在线精品 | 成人av观看 | 日本国产一区二区 | 91黄在线观看 | 一区二区三区四区不卡视频 | 免费视频中文字幕 | 老头搡老女人毛片视频在线看 | 国产一区二区三区久久久久久久久 | av三级在线观看 | 超碰成人在线观看 | 国产精品久久久久久福利一牛影视 | 伊人二区| 一级免费毛片 | 久久99久久 | 国产高清一区二区三区 | 国产亚洲欧美另类一区二区三区 | 黑人精品欧美一区二区蜜桃 | 欧美激情一区 | 日日干夜夜操 | 国产精品大片在线观看 | 亚洲国产二区 | 久久九 |