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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機按鍵消抖方式總結

  [復制鏈接]
跳轉到指定樓層
樓主
電路圖如下:
MCU采用89C52單片機,晶振12MHZ。


1、沒有消除抖動的原始代碼:
  1. #include <REGX52.H>
  2. #include <intrins.h>
  3. sbit KeyValue=P3^7;
  4. unsigned char code segment[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  5. //定義數碼管顯示0~9
  6. void main(){
  7.         static char count=1;
  8.         P2=segment[0]; //開始運行顯示0
  9.         while(1){
  10.                 if(KeyValue==0){
  11.                         P2=segment[count];
  12.                         count++;
  13.                         if(count>=10){   //超過0~9,數碼管顯示回到0
  14.                                 count=0;
  15.                         }
  16.                 }
  17.         }
  18. }

復制代碼
2、延時消除抖動

存在如下缺點:

  • delay()延時函數會占用大量時間;
  • 需要while循環不斷的掃描按鍵,對單片機運算資源的浪費。
    1. #include <REGX52.H>
    2. #include <intrins.h>
    3. sbit KeyValue=P3^7;
    4. unsigned char code segment[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    5. void delay(){ //延時程序
    6.         unsigned int i=20500;
    7.         while(i--);
    8. }
    9. void main(){
    10.         static char count=1;
    11.         P2=segment[0];
    12.         while(1){
    13.                 if(KeyValue==0){//按鍵按下
    14.                         delay();//延時一段時間
    15.                         if(KeyValue==0){//重新判斷按鍵狀態
    16.                                 P2=segment[count];
    17.                                 count++;
    18.                                 if(count>=10){
    19.                                 count=0;
    20.                                 }
    21.                         }
    22.                 }
    23.         }
    24. }

    復制代碼

3、使用定時器消抖
原理說明:1次按下+1次抬起構成一個按鍵動作,當同時檢測到這兩個動作時,才完成一次按鍵操作。按下時,將按鍵值存儲為0;抬起時,將按鍵值存儲為1。在前一次的按鍵值為0的前提下,檢測當前按鍵值是否為1,如果為1,表示此次按鍵有效,否則此次按鍵無效。


缺點:會占用一個定時
  1. #include <REGX52.H>
  2. #include <intrins.h>
  3. sbit KeyValue=P3^7;
  4. bit  KeyStatus=1;
  5. unsigned char code segment[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

  6. void main(){
  7.         bit KeySave=1;
  8.         unsigned char count=0;
  9.         P2=segment[0];
  10.         /**************開啟中斷**************************/
  11.         EA=1;
  12.         TMOD=0x01;
  13.         TH0=0xF8;
  14.         TL0=0xCD;
  15.         ET0=1;
  16.         TR0=1;
  17.         while(1){
  18.                 if(KeyStatus!=KeySave){//檢測按鍵值是否改變,初始時按鍵值為1,在此檢測按鍵值是否變為0,為0則繼續
  19.                         if(KeySave==0){//如果前一次的按鍵值為0,說明本次按鍵抬起,本次按鍵有效;否則為按鍵按下操作,跳轉到最后一步,將按鍵值取反
  20.                                 count++;//對按鍵值+1
  21.                                 if (count>=10){
  22.                                         count=0;
  23.                                 }
  24.                                 P2=segment[count];
  25.                         }
  26.                         KeySave=~KeySave;
  27.                 }
  28.         }
  29. }
  30. void InterruptTimer0() interrupt 1 {
  31.         static unsigned KeyBuff=0xff;
  32.         TH0=0xF8;
  33.         TL0=0xCD;
  34.         KeyBuff=(KeyBuff<<1)|KeyValue;
  35.         switch(KeyBuff){
  36.           case 0xff:
  37.                         KeyStatus=1;
  38.                   break;
  39.           case 0x00:
  40.                         KeyStatus=0;
  41.                   break;
  42.           default:
  43.                   break;
  44.   }        
  45. }
復制代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:872412 發表于 2021-8-25 20:05 | 只看該作者
還可以搞兩個for嵌套循環! 最外層記錄按了多少次,用來處理多次連續按鍵。內層在規定時間內有按鍵動作記為真,超過規定時間記為假,這樣可以高效消抖
回復

使用道具 舉報

板凳
ID:964826 發表于 2021-9-9 09:51 來自手機 | 只看該作者
我記的網上有人利用標志位進行消抖,用延時的話有點困難
回復

使用道具 舉報

地板
ID:398219 發表于 2021-9-9 14:47 | 只看該作者
一般來說都是延時5MS,小程序上用不了多少
回復

使用道具 舉報

5#
ID:34149 發表于 2021-9-11 19:27 | 只看該作者
原理分析到位!多謝分享
回復

使用道具 舉報

6#
ID:839438 發表于 2021-9-30 10:42 | 只看該作者
其實這個就是狀態機
回復

使用道具 舉報

7#
ID:969407 發表于 2021-10-4 15:45 來自手機 | 只看該作者
挺好的啊,我自己也是這樣使用的
回復

使用道具 舉報

8#
ID:966104 發表于 2021-10-5 07:10 | 只看該作者
這樣很難嗎?               
                if(K5 == 0)        
                {
                        DelayM(20); q = ~q;                //標志位取反
                        if(q){kai_numl = kai_numl | 1;}
                                     else { kai_numl = kai_numl&0;}
                         if(q){BLK = BLK | 1;}
                                else {BLK= BLK & 0;}
                        while(K5 == 0);
                                
                }
回復

使用道具 舉報

9#
ID:970710 發表于 2021-10-9 17:04 | 只看該作者
主意不錯,站位留存一下!
回復

使用道具 舉報

10#
ID:831736 發表于 2021-10-11 16:55 | 只看該作者
if(!key)
while(1)
{
//如果有顯示程序寫一遍在這里
if(key)
  {
  //按鍵要實現的功能
  break;
  }
}
這樣寫只能按一次實現一次
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99免费在线观看视频 | 久久久精品一区二区 | 激情伊人网 | 天天综合久久网 | 久久久久久久久久久久91 | 国产69精品久久99不卡免费版 | 91视频在线 | 亚洲成人一区 | 午夜精品久久久 | 日韩在线一区二区三区 | 亚洲一区二区在线播放 | 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | 国产午夜精品一区二区三区在线观看 | 国产一级视频在线播放 | 日本一区二区不卡 | 国产资源在线视频 | 成人午夜影院 | 国产精品久久久久久亚洲调教 | 欧美日韩中文字幕在线 | 日韩伦理电影免费在线观看 | 在线看av网址| 欧美日本韩国一区二区三区 | 国产精品亚洲二区 | 久久久久久黄 | 日韩在线国产 | 亚洲天堂中文字幕 | 亚洲久久一区 | 偷拍亚洲色图 | 亚洲免费观看视频网站 | 国产激情视频在线 | 久久久久久久久久久久久九 | 玖玖玖在线观看 | 中文字幕在线免费观看 | 亚洲第一成年免费网站 | 久精品视频 | 欧美aa在线 | 午夜精品一区二区三区在线 | 欧美亚洲视频在线观看 | 精品免费在线 | 成人精品鲁一区一区二区 | 亚洲国产成人精品女人 |