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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13033|回復: 31
收起左側

如何用單片機定時器進行按鍵消抖

  [復制鏈接]
ID:219181 發表于 2017-8-27 16:06 | 顯示全部樓層 |閱讀模式
我這個是0~9999的循環按鍵加減,按一下加/減一,長按連續加減,但是短按加的時候會連續加幾下,減的話會反應慢很多。不確定是不是消抖沒做好,求各位大神指教!!。!

  1. #includ<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit Seg_W1  = P2^1;               
  5. sbit Seg_W4  = P2^2;
  6. sbit Seg_W3  = P2^3;
  7. sbit Seg_W2  = P1^7;

  8. sbit key1    =  P3^4;//加
  9. sbit key2    =  P2^6;//減

  10. code uint biao[]=        {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};      
  11. uint array[]={0,1,2,3,4,5,6,7,8,9};

  12. uchar displayDelayCount = 0;
  13. uchar displayIndex = 0;
  14. uint displayData =240;
  15. uint delay = 0;

  16. void delayms(unsigned int x)                              
  17. {
  18. unsigned int i;
  19. while(x--)
  20. {
  21. for(i=0;i<113;i++);
  22. }
  23. }
  24. void xianshi(void
  25. {
  26.       
  27.         if(displayDelayCount >0
  28.         {
  29.                 displayDelayCount = 0;
  30.                 if(displayIndex < 3)
  31.                 {
  32.                         displayIndex ++;
  33.                 }
  34.                 else
  35.                 {
  36.                         displayIndex = 0;               
  37.                 }
  38.                 if(displayIndex == 0)      
  39.                 {      
  40.                         Seg_W1 = Seg_W2 = Seg_W3 = Seg_W4 = 0        ;
  41.                         P1=0X7F;
  42.                         P1=biao[displayData%10]
  43.                         Seg_W1=1;
  44.                 }

  45.                 if(displayIndex == 1)      
  46.                 {
  47.                         Seg_W1 = Seg_W2 = Seg_W3 = Seg_W4 = 0        ;
  48.                         P1=0X7F;
  49.                         P1=biao[displayData/10%10];
  50.                         Seg_W2=1;                       
  51.                 }

  52.                 if(displayIndex == 2)               
  53.                 {
  54.                         Seg_W1 = Seg_W2 = Seg_W3 = Seg_W4 = 0        ;
  55.                         P1=0X7F;
  56.                         P1=biao[displayData/100%10];
  57.                         Seg_W3=1;                       
  58.                 }
  59.                
  60.                 if(displayIndex == 3)
  61.                 {
  62.                         Seg_W1 = Seg_W2 = Seg_W3 = Seg_W4 = 0        ;
  63.                         P1=0X7F;
  64.                         P1=biao[displayData/1000%10];
  65.                         Seg_W4=1;
  66.                 }
  67.         }
  68. }

  69. #define         NO_AJ  1
  70. #define         UP     2
  71. #define         DOWM   3

  72. uchar anjian_yansi = 0;
  73. uchar anjianhuoqu(void)
  74. {
  75.         {
  76.                 if(!key1)
  77.                 {
  78.                 }
  79.                 else if(!key2)
  80.                 {
  81.                 }
  82.                 else
  83.                         anjian_yansi = 0;               
  84.         }
  85.       
  86.         if(anjian_yansi == 0)
  87.         {
  88.                 if(!key1)
  89.                 {
  90.                         anjian_yansi = 100;
  91.                         return UP;
  92.                 }
  93.                 else if(!key2)
  94.                 {
  95.                         anjian_yansi = 100;
  96.                         return DOWM;
  97.                 }
  98.                 else
  99.                         return NO_AJ;
  100.         }
  101.         else
  102.                         return NO_AJ;
  103. }

  104. void anjian ()
  105. {      
  106.         if(anjianhuoqu() == UP)
  107.         {
  108.                 displayData++;
  109.         }
  110.         else if(anjianhuoqu() == DOWM)
  111.         {
  112.                 displayData--;
  113.         }
  114. }      
  115. void time0()interrupt 1     //¶¨ê±¼ÆêyÆ÷£¬èë¿ú1
  116. {
  117.         TH0=(65535-5000)/256;
  118.         TL0=(65535-5000)%256;
  119.         displayDelayCount++;
  120.         delay++;
  121.          if(anjian_yansi > 0)
  122.                         anjian_yansi --;
  123. }

  124. void main()
  125. {
  126.         EA=1;     
  127.         ET0=1;     
  128.         TMOD=0X01;
  129.         TH0=(65535-5000)/256;
  130.         TL0=(65535-5000)%256;   
  131.         TR0=1;
  132.       
  133.         while(1)
  134.         {        key1=key2=key3=key4=1;
  135.                 xianshi();
  136.                 anjian ();
  137.         }      
  138. }
復制代碼


回復

使用道具 舉報

ID:190832 發表于 2017-8-27 21:44 | 顯示全部樓層
你的29行少了一個‘)’

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:229626 發表于 2017-8-28 00:52 | 顯示全部樓層
外部可以加個104電容

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:111634 發表于 2017-8-28 08:07 | 顯示全部樓層

回帖獎勵 +2

消抖期間,是不需要執行其他任務的,因此用延時程序,而不是用寶貴的定時器資源。
回復

使用道具 舉報

ID:219181 發表于 2017-8-28 10:58 | 顯示全部樓層
zl2168 發表于 2017-8-28 08:07
消抖期間,是不需要執行其他任務的,因此用延時程序,而不是用寶貴的定時器資源。

可以說說具體該怎么做嗎?謝謝大神
回復

使用道具 舉報

ID:198530 發表于 2017-8-28 11:45 | 顯示全部樓層
一般都是延時消抖,就檢測一次如果按鍵按下就延時然后再檢測一下按鍵還是按下就執行

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:229690 發表于 2017-8-28 14:08 | 顯示全部樓層
謝謝樓主分享
回復

使用道具 舉報

ID:229711 發表于 2017-8-28 15:59 | 顯示全部樓層
消抖用條延時函數就可以實現了
回復

使用道具 舉報

ID:111634 發表于 2017-8-28 16:46 | 顯示全部樓層
本帖最后由 zl2168 于 2017-8-28 16:53 編輯
sinho 發表于 2017-8-28 10:58
可以說說具體該怎么做嗎?謝謝大神

介紹你一本書:《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。其中:
第6章  鍵盤
6.1  獨立式按鍵
實例69  74HC373并行輸入8位按鍵狀態
實例70  74HC165串行輸入8位按鍵狀態
實例71  CC4021串行輸入8位按鍵狀態
實例72  CC4014串行輸入8位按鍵狀態
實例73  74HC148編碼輸入8位按鍵狀態
實例74  按鍵擴展shif t功能
6.2  矩陣式鍵盤
實例75  4×4矩陣式鍵盤
實例76  8279擴展8×8鍵盤
實例63 8279擴展鍵盤和顯示.rar (63.08 KB, 下載次數: 11)
8279.jpg
實例77  74HC595+165擴展8×8鍵盤
實例64 74LS595 165擴展8×8鍵盤.rar (65.5 KB, 下載次數: 9)
595-165.jpg
實例78  電子密碼鎖
電子密碼鎖1.rar (1.13 MB, 下載次數: 9)
電子密碼鎖Proteus仿真.jpg
都有按鍵消抖內容
回復

使用道具 舉報

ID:219181 發表于 2017-8-28 18:07 | 顯示全部樓層
zl2168 發表于 2017-8-28 16:46
介紹你一本書:《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41 ...

好的!謝謝
回復

使用道具 舉報

ID:225822 發表于 2017-8-29 11:41 | 顯示全部樓層
if(p34==0)
{
     delay(200);        //延時消抖
   if(p34==0)
     {
         while(!p34);        /////等待按鍵松手
      SendByte(5);
      }
}

void delay (unsigned int Z)//延時程序    Z倍    MS
{
        unsigned int  x,y;
        for(x=Z;x>0;x--)
        for(y=110;y>0;y--) ;
}

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:229889 發表于 2017-8-29 16:02 | 顯示全部樓層
用一個延時就行
回復

使用道具 舉報

ID:123289 發表于 2017-8-31 21:19 | 顯示全部樓層
不同意地板的觀點!
做了許許多多產品,所有鍵的消抖,沒有一次是用延時做的,全部用定時器。
1、用延時會占用CPU時間。
2、用定時器,只需在順便“插一個掃鍵”即可,還不耽誤其它任務對此定時器的使用。
回復

使用道具 舉報

ID:230352 發表于 2017-9-1 09:42 | 顯示全部樓層
像這樣        if(key==0)         {                 delay(10);                 if(key==0)                         {                                 wela=1;                                 P0=0xc0;                              wela=0;                                 dula=1;                                 P0=0x01;                                 dula=0;                         }         }

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:219181 發表于 2017-9-4 23:37 | 顯示全部樓層
yzwzfyz 發表于 2017-8-31 21:19
不同意地板的觀點!
做了許許多多產品,所有鍵的消抖,沒有一次是用延時做的,全部用定時器。
1、用延時 ...

教我的人也是這么說的,所以大神知道怎么消嗎?是在中斷加個變量?
回復

使用道具 舉報

ID:231116 發表于 2017-9-5 13:10 | 顯示全部樓層
使用延時消抖.不要用定時器
回復

使用道具 舉報

ID:231116 發表于 2017-9-5 13:14 | 顯示全部樓層
sinho 發表于 2017-9-4 23:37
教我的人也是這么說的,所以大神知道怎么消嗎?是在中斷加個變量?

在中斷中加入一個比較按鍵狀態的程序就行
回復

使用道具 舉報

ID:230915 發表于 2017-9-5 14:22 | 顯示全部樓層
我是新手,前幾天也狠狠搞了下消抖,感覺效果還行,代碼不在這,說下當初的思路,請指教:

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:230915 發表于 2017-9-5 15:11 | 顯示全部樓層
我是新手,前幾天剛搞過消抖,代碼不在這,說下思路,請大家指教:
1.  不用延時函數,這不是個好東西;
2.  I/O口變低一定是按鍵被按下,啟動計數器,我是以10ms計一次數;
3.  賦第一次健值,我用的5個鍵,第一個鍵按下就是10,第三個按下就是30,判別是哪個鍵按下;
3、啟動計數器后再檢測按鍵是否釋放,按鍵釋放后,取計數值,按計數值時間長短做區分。
4.  關閉計數器,第二次賦健值,比如第二個短按是21,第二個長按是22;
5、該清零的變量都清零。等待按鍵再次按下;
6、給不同健值分配事件。

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:231182 發表于 2017-9-5 16:28 來自手機 | 顯示全部樓層
加一個延時函數消抖試一下

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:219181 發表于 2017-9-5 17:50 | 顯示全部樓層
gaochang000000 發表于 2017-9-5 15:11
我是新手,前幾天剛搞過消抖,代碼不在這,說下思路,請大家指教:
1.  不用延時函數,這不是個好東西;
...

不錯,受教了,待會嘗試一下
回復

使用道具 舉報

ID:231291 發表于 2017-9-6 01:09 | 顯示全部樓層
可以使用程序消抖,這個程序不難找,就不復述了,也可以用大電容,在硬件方面消抖

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:231444 發表于 2017-9-6 17:04 | 顯示全部樓層
liang ci yanshi jiu ke yi le
回復

使用道具 舉報

ID:230667 發表于 2017-9-6 17:56 | 顯示全部樓層
這有個硬件消抖的電路

硬件消抖電路

硬件消抖電路

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:219181 發表于 2017-9-9 12:57 | 顯示全部樓層
tiexiedaqin 發表于 2017-9-6 17:56
這有個硬件消抖的電路

好的,謝謝
回復

使用道具 舉報

ID:454000 發表于 2019-1-31 20:48 | 顯示全部樓層

能用軟件解決的問題最好不要用硬件來解決

評分

參與人數 5黑幣 +175 收起 理由
Trump1438 + 35
#include51.h + 35
刀刀見紅 + 35
areyouok + 35
jinsheng7533967 + 35

查看全部評分

回復

使用道具 舉報

ID:660895 發表于 2021-6-9 17:48 | 顯示全部樓層
zl2168 發表于 2017-8-28 08:07
消抖期間,是不需要執行其他任務的,因此用延時程序,而不是用寶貴的定時器資源。

兄弟是不是寫反了,沒有的話好好回去翻翻書
回復

使用道具 舉報

ID:160500 發表于 2021-6-10 12:40 | 顯示全部樓層
按鍵消抖動,完全看你自己的程序來決定使用軟件延時還是定時器,或者中斷。要根據你的程序要求決定。首先你要做好程序規劃
回復

使用道具 舉報

ID:916624 發表于 2021-6-13 15:18 | 顯示全部樓層
可以看一下我寫的獨立按鍵和矩陣按鍵的程序

按鍵.7z

21.88 KB, 下載次數: 13

回復

使用道具 舉報

ID:937124 發表于 2021-6-13 17:49 | 顯示全部樓層
覺得是長按短按的區分問題;
回復

使用道具 舉報

ID:57657 發表于 2021-6-14 13:45 | 顯示全部樓層
定時器中斷檢測按鍵是否按住并進行毫秒計數,松開清0。
25毫秒為有效按鍵,1000毫秒為長按按鍵。
回復

使用道具 舉報

ID:883031 發表于 2021-6-15 09:18 | 顯示全部樓層
做一個20ms或者再大點的定時器,每中斷一次檢測一下按鍵狀態,不用軟件延時也可以。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产.com| 欧美日韩在线观看一区二区三区 | 国产精品中文字幕在线播放 | 久久麻豆精品 | 亚洲91视频 | 国产视频中文字幕在线观看 | tube国产 | 欧美日韩一区二区三区视频 | 欧美一区二区在线观看 | 在线免费国产 | 久久久久国产 | 国产激情视频在线免费观看 | 不卡的av一区 | av免费成人 | 久久国产美女视频 | 人干人人 | 久久久这里只有17精品 | 九九爱这里只有精品 | 久久综合狠狠综合久久 | 亚洲欧美日韩精品久久亚洲区 | 日本理论片好看理论片 | 亚洲精品久久区二区三区蜜桃臀 | 欧美高清免费 | 狠狠久久综合 | 精品久久久久一区二区国产 | 成人看片在线观看 | 久久亚洲天堂 | 国产人免费人成免费视频 | av片在线播放 | 国产精品一区二区在线 | 欧美激情欧美激情在线五月 | 国产色在线 | 精品www| 久久影音先锋 | 成人h动漫亚洲一区二区 | 爱操av | 在线观看成人小视频 | 九九热在线视频 | 国产 日韩 欧美 在线 | 久久这里只有精品首页 | 羞羞网站在线观看 |