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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機按鍵掃描消抖經典算法實現以及Proteus實例仿真對比

[復制鏈接]
跳轉到指定樓層
樓主
按鍵掃描消抖經典算法實現以及Proteus實例仿真對比

  • 算法實現函數:
  1. unsigned char Trg;
  2. unsigned char Cont;
  3. void KeyRead( void )
  4. {
  5.     unsigned char ReadData = P1^0xff;   // 注解1
  6.     Trg = ReadData & (ReadData ^ Cont);   // 注解2
  7.     Cont = ReadData;                      // 注解3
  8. }
復制代碼
  • Trg(triger) 代表的是觸發,Cont(continue)代表的是連續按下。

  • 注解1:讀P1的端口數據,取反,然后送到ReadData 臨時變量里面保存起來。

  • 注解2:用來計算觸發變量的。一個位與操作,一個異或操作,我想學過C語言都應該懂吧?Trg為全局變量,其它程序可以直接引用。

  • 注解3:用來計算連續變量。
  • 上述實現算法不僅適用于端口以總線方式來讀取判斷,也同樣適用于獨立IO口信號的判斷和處理,具體實現函數如下:
    1. unsigned char Trg;
    2. unsigned char Cont;
    3. void KeyRead( void )
    4. {
    5.     unsigned char ReadData = P10^0x01;   //
    6.     Trg = ReadData & (ReadData ^ Cont);   //
    7.     Cont = ReadData;                     /
    8.     }
    復制代碼

  • 1. 沒有按鍵的時候
  • 沒有按下時,IO口為高電平,就是P10為0x01,ReadData讀端口并且和0x01進行取反,很顯然,P10^0x01的值就是 0x00。
  • Trg = ReadData & (ReadData ^ Cont); (初始狀態下,Cont也是為0的)很簡單的數學計算,因為ReadData為0,則它和任何數“相與”,結果也是為0。
  • Cont = ReadData; 保存Cont 其實就是等于ReadData為0。
2. 第一次IO口按鍵按下的情況:
  • 端口沒有觸發時,IO口狀態為0x01,ReadData讀端口并且取反,很顯然,就是 0x01 。

  • Trg = ReadData & (ReadData ^ Cont); 因為這是第一次按下,所以Cont是上次的值,應為為0。那么這個式子的值也不難算,也就是 Trg = 0x01 & (0x01^0x00) = 0x01。
  • Cont = ReadData = 0x01;
    1. ReadData = 0x01;
    2. Trg = 0x01;//Trg只會在這個時候對應位的值為1,其它時候都為0
    3. Cont = 0x01;<span style="background-color: rgb(255, 255, 255); color: rgb(79, 79, 79); font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-weight: normal;"></span>
    復制代碼

3. IO口按鍵按著不松(長按鍵)的情況:
  • 端口數據為0xfe,ReadData讀端口并且取反是 0x01 。

  • Trg = ReadData & (ReadData ^ Cont); 因為這是連續按下,所以Cont是上次的值,應為為0x01。那么這個式子就變成了 Trg = 0x01 & (0x01^0x01) = 0x00
Cont = ReadData = 0x01
  1.         ReadData = 0x01;
  2.         Trg = 0x00;
  3.         Cont = 0x01;
復制代碼
因為現在按鍵是長按著,所以MCU會每個一定時間(20ms左右)不斷的執行這個函數,那么下次執行的時候情況會是怎么樣的呢?

  • ReadData = 0x01;這個不會變,因為按鍵沒有松開.
  • Trg = ReadData & (ReadData ^ Cont) = 0x01 & (0x01 ^ 0x01) = 0 ,只要按鍵沒有松開,這個Trg值永遠為 0.
  • Cont = 0x01;只要按鍵沒有松開,這個值永遠是0x0.
4. 按鍵松開的情況:端口數據為0xff,ReadData讀端口并且取反是 0x00 。
  • Trg = ReadData & (ReadData ^ Cont) = 0x00 & (0x00^0x01) = 0x00;
  • Cont = ReadData = 0x00;
    1.         ReadData = 0x00;
    2.         Trg = 0x00;
    3.         Cont = 0x00;
    復制代碼
    回到了初始狀態,也就是沒有按鍵按下的狀態.
Proteus仿真


  • 代碼:
    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. unsigned char Trg;
    7. unsigned char Cont;
    8.     static char count=1;
    9. void KeyRead( void )
    10. {
    11.     unsigned char ReadData = KeyValue^0x01;   // 注解1
    12.     Trg = ReadData & (ReadData ^ Cont);   // 注解2
    13.     Cont = ReadData;                     // 注解3
    14.         
    15. }

    16. void main() {
    17.                 P3=0XFF;
    18.     P0=segment[0]; //開始運行顯示0
    19.     while(1) {
    20.                         KeyRead();
    21.         if(Trg==1) {
    22.             P0=segment[count];
    23.             count++;
    24.             if(count>=10) {  //超過0~9,數碼管顯示回到0
    25.                 count=0;
    26.             }
    27.         }
    28.     }
    29. }
    30. //void main() {//這是沒有經過消抖處理的代碼
    31. //                P3=0XFF;
    32. //    P0=segment[0]; //開始運行顯示0
    33. //    while(1) {
    34. //               
    35. //        if(KeyValue==0) {
    36. //            P0=segment[count];
    37. //            count++;
    38. //            if(count>=10) {  //超過0~9,數碼管顯示回到0
    39. //                count=0;
    40. //            }
    41. //        }
    42. //    }
    43. //}
    復制代碼
  • 這種算法摒棄了使用延時的常規做法。
  • 仿真文件和程序建附件


全部資料51hei附件下載:
按鍵掃描消抖算法實現.zip (61.47 KB, 下載次數: 33)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:34149 發表于 2021-9-11 19:12 | 只看該作者
樓主辛苦了,值得學習!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美激情久久久 | 日韩精品1区2区 | 精品亚洲一区二区三区 | 国产无套一区二区三区久久 | 国产精品高清在线 | 91精品一区二区三区久久久久久 | 日韩伦理一区二区三区 | 天天操 天天操 | 久久中文一区二区 | 天天干天天操天天爽 | av黄色在线观看 | 免费av播放 | 国产成人精品一区二区三区网站观看 | 精品中文字幕视频 | 国产精品区二区三区日本 | 亚洲免费在线观看 | 亚洲精品二区 | 亚洲欧美激情精品一区二区 | 日韩欧美电影在线 | 亚洲韩国精品 | 天天躁日日躁狠狠躁白人 | 97avcc| 国产精品激情小视频 | 国产精品久久久爽爽爽麻豆色哟哟 | 秋霞影院一区二区 | 午夜欧美| 成人日韩 | 国产又色又爽又黄又免费 | 欧美一区二区 | 欧美日韩成人网 | 草久在线视频 | 一区二区在线免费观看 | 精品国产精品三级精品av网址 | 欧美精品一区二区三区在线 | 精品国产伦一区二区三区观看说明 | 国产不卡在线 | 久久精品国产99国产精品 | 色屁屁在线观看 | 日韩欧美一级精品久久 | 国产精品www | 中文在线一区二区 |