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

標題: 51單片機實現單按鍵單擊、雙擊、長按功能 [打印本頁]

作者: defu_yin1512    時間: 2016-3-8 11:53
標題: 51單片機實現單按鍵單擊、雙擊、長按功能
自己整理的單按鍵程序,請大家指正,附件里有詳細的注釋

Pro.rar

1.83 KB, 下載次數: 587, 下載積分: 黑幣 -5


作者: admin    時間: 2016-3-10 18:06
下面是樓主的程序 :
  1. #include "keyboard.h"

  2. /***************************************************************************
  3. 程序功能:一個按鍵的單擊、雙擊、長按。三種按鍵方式,然后做不同的處理。
  4.                                         這里以P1口的LED變化作為測試
  5.                                         單擊:點亮P1口的第一個LED(低電平點亮)
  6.                                         雙擊:點亮P1口的第二個LED(低電平點亮)
  7.                                         長按:點亮P1口上的8個LED(低電平點亮)
  8. ***************************************************************************/

  9. static unsigned char key_driver(void)
  10. {
  11.         static unsigned char key_state_buffer1 = key_state_0;
  12.         static unsigned char key_timer_cnt1 = 0;
  13.         unsigned char key_return = key_no;
  14.         unsigned char key;
  15.         
  16.         key = key_input;  //read the I/O states
  17.         
  18.         switch(key_state_buffer1)
  19.         {
  20.                 case key_state_0:
  21.                         if(key == 0)
  22.                                 key_state_buffer1 = key_state_1;
  23.                                 //按鍵被按下,狀態轉換到按鍵消抖和確認狀態//
  24.                         break;
  25.                 case key_state_1:
  26.                         if(key == 0)
  27.                         {
  28.                                 key_timer_cnt1 = 0;
  29.                                 key_state_buffer1 = key_state_2;
  30.                                 //按鍵仍然處于按下狀態
  31.                                 //消抖完成,key_timer開始準備計時
  32.                                 //狀態切換到按下時間計時狀態
  33.                         }
  34.                         else
  35.                                 key_state_buffer1 = key_state_0;
  36.                                 //按鍵已經抬起,回到按鍵初始狀態
  37.                         break;  //完成軟件消抖
  38.                 case key_state_2:
  39.                         if(key == 1)
  40.                         {
  41.                                 key_return = key_click;  //按鍵抬起,產生一次click操作
  42.                                 key_state_buffer1 = key_state_0;  //轉換到按鍵初始狀態
  43.                         }
  44.                         else if(++key_timer_cnt1 >= 100)  //按鍵繼續按下,計時超過1000ms
  45.                         {
  46.                                 key_return = key_long;  //送回長按事件
  47.                                 key_state_buffer1 = key_state_3;  //轉換到等待按鍵釋放狀態
  48.                         }
  49.                         break;
  50.                 case key_state_3:  //等待按鍵釋放
  51.                         if(key == 1)  //按鍵釋放
  52.                                 key_state_buffer1 = key_state_0;  //切回按鍵初始狀態
  53.                         break;
  54.         }
  55.         return key_return;
  56. }

  57. /***************************************************************************
  58. 函數功能:中層按鍵處理函數,調用底層函數一次,處理雙擊事件的判斷,
  59.                                         返回上層正確的無鍵、單擊、雙擊、長按四種狀態
  60. 本函數由上層循環調用,間隔10ms
  61. ***************************************************************************/
  62. unsigned char key_read(void)
  63. {
  64.         static unsigned char key_state_buffer2 = key_state_0;
  65.         static unsigned char key_timer_cnt2 = 0;
  66.         unsigned char key_return = key_no;
  67.         unsigned char key;
  68.         
  69.         key = key_driver();
  70.         
  71.         switch(key_state_buffer2)
  72.         {
  73.                 case key_state_0:
  74.                         if(key == key_click)
  75.                         {
  76.                                 key_timer_cnt2 = 0;  //第一次單擊,不返回,到下個狀態判斷是否會出現雙擊
  77.                                 key_state_buffer2 = key_state_1;
  78.                         }
  79.                         else
  80.                                 key_return = key;  //對于無鍵、長按,返回原事件
  81.                         break;
  82.                 case key_state_1:
  83.                         if(key == key_click)  //又一次單擊,時間間隔小于500ms
  84.                         {
  85.                                 key_return = key_double;  //返回雙擊事件,回到初始狀態
  86.                                 key_state_buffer2 = key_state_0;
  87.                         }
  88.                         else if(++key_timer_cnt2 >= 50)
  89.                         {
  90.                                 //這里500ms內肯定讀到的都是無鍵事件,因為長按大于1000ms
  91.                                 //在1s前底層返回的都是無鍵
  92.                                                                         
  93.                                 key_return = key_click;  //500ms內沒有再次出現單擊事件,返回單擊事件
  94.                                 key_state_buffer2 = key_state_0;  //返回初始狀態
  95.                                        
  96.                         }
  97.                         break;
  98.         }
  99.         
  100.         return key_return;
  101. }
復制代碼

作者: 騰飛的龍    時間: 2016-3-11 15:32
看不懂,不過值得學習!謝謝分享
作者: vincentmax3    時間: 2017-9-1 14:44
看不懂,不過值得學習!謝謝分享
作者: AIvy    時間: 2017-11-12 16:36
admin 發表于 2016-3-10 18:06
下面是樓主的程序 給大家省點黑幣:

這個仿真怎么做
作者: xmch    時間: 2017-11-22 22:20
感謝分享。。。
作者: panlongdian    時間: 2017-11-28 01:54
剛在學習51,還看不太懂,謝謝你們
作者: roggie    時間: 2017-11-28 16:04
Timer0_init()函數和key_init()函數怎么不寫?

作者: tt98    時間: 2017-11-29 06:57
看看編程思路,學習下!
作者: 殘念    時間: 2017-12-22 09:35
值得學習,很有幫助啊,謝謝樓主
作者: abcd7471    時間: 2018-1-2 00:41
下載來看看是什么
作者: 萬人無往    時間: 2018-1-10 00:36
學習一個
作者: ronchi    時間: 2018-2-9 09:11
學習一個
作者: 大力做大力愛    時間: 2018-2-9 13:32
非常感謝管理員 又省了一筆黑幣   我非常崇拜管理員  你絕對是一個很牛逼的人
作者: bhjyqjs    時間: 2018-2-9 16:53
好貼!狀態機方式處理鍵盤,非常穩定的!
作者: aacccc    時間: 2018-3-14 09:38
好東西,謝謝
作者: nemo_zeng    時間: 2018-3-18 17:53
多謝分享,新人表示感謝
作者: wuxishun    時間: 2018-3-18 23:57
謝謝分享
作者: qxdqx    時間: 2018-4-19 20:08
謝謝!!!!!!
作者: jmkl128    時間: 2018-4-20 06:35
很不錯,謝謝了
作者: ninteen_orange    時間: 2018-6-18 20:58
謝謝分享
作者: zhinanzhen    時間: 2018-6-23 16:52
下載了,很好!!!!
作者: 春風電子    時間: 2018-7-16 19:48
謝謝,真好需要這個!
作者: chaoself    時間: 2018-7-17 16:25
這個頭文件怎么在主程序調試?麻煩高手寫一下主程序
作者: starry999    時間: 2018-11-29 08:56
很好,學習到了 。。。
作者: bhjyqjs    時間: 2018-11-30 09:55
程序寫的非常好,而且樓主有個好習慣,注釋很詳細,棒!
作者: 海上狂飆    時間: 2019-4-14 00:05
唉,沒有往下看就下了,不過還是謝謝了
作者: 風158    時間: 2019-4-14 11:31
謝謝樓主,謝謝管理員。
作者: 小七七七    時間: 2019-4-14 17:00
感謝分享
作者: 51小白白白    時間: 2020-3-1 23:50
最后判斷應該是"小于"50吧
作者: 芒果愛晴天    時間: 2020-7-7 18:59
admin 發表于 2016-3-10 18:06
下面是樓主的程序 給大家省點黑幣:

樓主的頭像好生眼熟啊,好人一生平安
作者: yangbulasi    時間: 2020-9-9 16:13
包含了一個特殊的頭文件,難搞
作者: 行知ing    時間: 2021-12-4 15:47
看起來邏輯很細密,贊一個
作者: dj3365191    時間: 2021-12-4 16:52
編譯通不過,提示:
Rebuild started: Project: 按鍵
Rebuild target 'Target 1'
compiling 按鍵.C...
按鍵.C(2): warning C318: can't open file 'keyboard.h'
按鍵.C(14): error C202: 'key_state_0': undefined identifier
按鍵.C(16): error C202: 'key_no': undefined identifier
按鍵.C(19): error C202: 'key_input': undefined identifier
按鍵.C(23): error C202: 'key_state_0': undefined identifier
按鍵.C(25): error C202: 'key_state_1': undefined identifier
按鍵.C(28): error C202: 'key_state_1': undefined identifier
按鍵.C(32): error C202: 'key_state_2': undefined identifier
按鍵.C(38): error C202: 'key_state_0': undefined identifier
按鍵.C(41): error C202: 'key_state_2': undefined identifier
按鍵.C(44): error C202: 'key_click': undefined identifier
按鍵.C(45): error C202: 'key_state_0': undefined identifier
按鍵.C(49): error C202: 'key_long': undefined identifier
按鍵.C(50): error C202: 'key_state_3': undefined identifier
按鍵.C(53): error C202: 'key_state_3': undefined identifier
按鍵.C(55): error C202: 'key_state_0': undefined identifier
按鍵.C(68): error C202: 'key_state_0': undefined identifier
按鍵.C(70): error C202: 'key_no': undefined identifier
按鍵.C(77): error C202: 'key_state_0': undefined identifier
按鍵.C(78): error C202: 'key_click': undefined identifier
按鍵.C(81): error C202: 'key_state_1': undefined identifier
按鍵.C(86): error C202: 'key_state_1': undefined identifier
按鍵.C(87): error C202: 'key_click': undefined identifier
按鍵.C(89): error C202: 'key_double': undefined identifier
按鍵.C(90): error C202: 'key_state_0': undefined identifier
按鍵.C(97): error C202: 'key_click': undefined identifier
按鍵.C(98): error C202: 'key_state_0': undefined identifier
Target not created.
Build Time Elapsed:  00:00:00
作者: heicad    時間: 2021-12-4 17:47
dj3365191 發表于 2021-12-4 16:52
編譯通不過,提示:
Rebuild started: Project: 按鍵
Rebuild target 'Target 1'

你沒有把頭文件放進去,當然會報錯了,你看我幫你整理了一下 工程

51hei.png (20.16 KB, 下載次數: 98)

51hei.png

c樣本51hei.7z

13.86 KB, 下載次數: 35, 下載積分: 黑幣 -5


作者: dj3365191    時間: 2021-12-5 10:16
heicad 發表于 2021-12-4 17:47
你沒有把頭文件放進去,當然會報錯了,你看我幫你整理了一下 工程

謝謝指教
作者: luhonglang    時間: 2022-4-9 16:40
學習學習,編程思路很好。
作者: lhtlhtl    時間: 2022-5-19 19:03
編程思路很好。
作者: CHUANLIUBUXI    時間: 2024-7-31 10:07
admin 發表于 2016-3-10 18:06
下面是樓主的程序 :






歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产成人91 | 麻豆av免费 | 第一福利视频导航 | 免费看色片| 日韩久久久| 久久久午夜 | 国产三级在线 | 日韩精品在线一区 | 亚洲成人精品在线 | av网站免费看 | 日日夜夜精品免费 | 青草国产 | 午夜视频在线播放 | 亚洲一区在线观看视频 | 日本免费黄色 | 国产色网站 | 九九热视频在线 | 亚洲精品视频免费观看 | 欧美午夜片 | 国产精品无遮挡 | 一级黄色片视频 | 亚洲欧美精品一区二区 | 久久精品视频网站 | 成年人国产 | 这里只有精品视频在线观看 | 99久久久 | av一区二区三区在线观看 | 国产视频一区二区三区四区 | 免费成人深夜夜国外 | 99国产在线观看 | 青青青草视频 | 毛片91 | 在线视频福利 | 人人综合 | 日本少妇中文字幕 | www一级片 | 高清视频一区二区 | 国产男女无遮挡猛进猛出 | 国产h在线观看 | 男男成人高潮片免费网站 | 免费av网站在线观看 |