找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 26139|回復(fù): 38
收起左側(cè)

51單片機(jī)實(shí)現(xiàn)單按鍵單擊、雙擊、長(zhǎng)按功能

  [復(fù)制鏈接]
ID:72251 發(fā)表于 2016-3-8 11:53 | 顯示全部樓層 |閱讀模式
自己整理的單按鍵程序,請(qǐng)大家指正,附件里有詳細(xì)的注釋

Pro.rar

1.83 KB, 下載次數(shù): 587, 下載積分: 黑幣 -5

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2016-3-10 18:06 | 顯示全部樓層
下面是樓主的程序 :
  1. #include "keyboard.h"

  2. /***************************************************************************
  3. 程序功能:一個(gè)按鍵的單擊、雙擊、長(zhǎng)按。三種按鍵方式,然后做不同的處理。
  4.                                         這里以P1口的LED變化作為測(cè)試
  5.                                         單擊:點(diǎn)亮P1口的第一個(gè)LED(低電平點(diǎn)亮)
  6.                                         雙擊:點(diǎn)亮P1口的第二個(gè)LED(低電平點(diǎn)亮)
  7.                                         長(zhǎng)按:點(diǎn)亮P1口上的8個(gè)LED(低電平點(diǎn)亮)
  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.                                 //按鍵被按下,狀態(tài)轉(zhuǎn)換到按鍵消抖和確認(rèn)狀態(tài)//
  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.                                 //按鍵仍然處于按下?tīng)顟B(tài)
  31.                                 //消抖完成,key_timer開(kāi)始準(zhǔn)備計(jì)時(shí)
  32.                                 //狀態(tài)切換到按下時(shí)間計(jì)時(shí)狀態(tài)
  33.                         }
  34.                         else
  35.                                 key_state_buffer1 = key_state_0;
  36.                                 //按鍵已經(jīng)抬起,回到按鍵初始狀態(tài)
  37.                         break;  //完成軟件消抖
  38.                 case key_state_2:
  39.                         if(key == 1)
  40.                         {
  41.                                 key_return = key_click;  //按鍵抬起,產(chǎn)生一次click操作
  42.                                 key_state_buffer1 = key_state_0;  //轉(zhuǎn)換到按鍵初始狀態(tài)
  43.                         }
  44.                         else if(++key_timer_cnt1 >= 100)  //按鍵繼續(xù)按下,計(jì)時(shí)超過(guò)1000ms
  45.                         {
  46.                                 key_return = key_long;  //送回長(zhǎng)按事件
  47.                                 key_state_buffer1 = key_state_3;  //轉(zhuǎn)換到等待按鍵釋放狀態(tài)
  48.                         }
  49.                         break;
  50.                 case key_state_3:  //等待按鍵釋放
  51.                         if(key == 1)  //按鍵釋放
  52.                                 key_state_buffer1 = key_state_0;  //切回按鍵初始狀態(tài)
  53.                         break;
  54.         }
  55.         return key_return;
  56. }

  57. /***************************************************************************
  58. 函數(shù)功能:中層按鍵處理函數(shù),調(diào)用底層函數(shù)一次,處理雙擊事件的判斷,
  59.                                         返回上層正確的無(wú)鍵、單擊、雙擊、長(zhǎng)按四種狀態(tài)
  60. 本函數(shù)由上層循環(huán)調(diào)用,間隔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;  //第一次單擊,不返回,到下個(gè)狀態(tài)判斷是否會(huì)出現(xiàn)雙擊
  77.                                 key_state_buffer2 = key_state_1;
  78.                         }
  79.                         else
  80.                                 key_return = key;  //對(duì)于無(wú)鍵、長(zhǎng)按,返回原事件
  81.                         break;
  82.                 case key_state_1:
  83.                         if(key == key_click)  //又一次單擊,時(shí)間間隔小于500ms
  84.                         {
  85.                                 key_return = key_double;  //返回雙擊事件,回到初始狀態(tài)
  86.                                 key_state_buffer2 = key_state_0;
  87.                         }
  88.                         else if(++key_timer_cnt2 >= 50)
  89.                         {
  90.                                 //這里500ms內(nèi)肯定讀到的都是無(wú)鍵事件,因?yàn)殚L(zhǎng)按大于1000ms
  91.                                 //在1s前底層返回的都是無(wú)鍵
  92.                                                                         
  93.                                 key_return = key_click;  //500ms內(nèi)沒(méi)有再次出現(xiàn)單擊事件,返回單擊事件
  94.                                 key_state_buffer2 = key_state_0;  //返回初始狀態(tài)
  95.                                        
  96.                         }
  97.                         break;
  98.         }
  99.         
  100.         return key_return;
  101. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:79544 發(fā)表于 2016-3-11 15:32 | 顯示全部樓層
看不懂,不過(guò)值得學(xué)習(xí)!謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:230409 發(fā)表于 2017-9-1 14:44 | 顯示全部樓層
看不懂,不過(guò)值得學(xué)習(xí)!謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:248640 發(fā)表于 2017-11-12 16:36 | 顯示全部樓層
admin 發(fā)表于 2016-3-10 18:06
下面是樓主的程序 給大家省點(diǎn)黑幣:

這個(gè)仿真怎么做
回復(fù)

使用道具 舉報(bào)

ID:161033 發(fā)表于 2017-11-22 22:20 | 顯示全部樓層
感謝分享。。。
回復(fù)

使用道具 舉報(bào)

ID:139783 發(fā)表于 2017-11-28 01:54 | 顯示全部樓層
剛在學(xué)習(xí)51,還看不太懂,謝謝你們
回復(fù)

使用道具 舉報(bào)

ID:253624 發(fā)表于 2017-11-28 16:04 | 顯示全部樓層
Timer0_init()函數(shù)和key_init()函數(shù)怎么不寫(xiě)?
回復(fù)

使用道具 舉報(bào)

ID:88606 發(fā)表于 2017-11-29 06:57 | 顯示全部樓層
看看編程思路,學(xué)習(xí)下!
回復(fù)

使用道具 舉報(bào)

ID:265153 發(fā)表于 2017-12-22 09:35 | 顯示全部樓層
值得學(xué)習(xí),很有幫助啊,謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:223308 發(fā)表于 2018-1-2 00:41 | 顯示全部樓層
下載來(lái)看看是什么
回復(fù)

使用道具 舉報(bào)

ID:274077 發(fā)表于 2018-1-10 00:36 | 顯示全部樓層
學(xué)習(xí)一個(gè)
回復(fù)

使用道具 舉報(bào)

ID:283239 發(fā)表于 2018-2-9 09:11 | 顯示全部樓層
學(xué)習(xí)一個(gè)
回復(fù)

使用道具 舉報(bào)

ID:272080 發(fā)表于 2018-2-9 13:32 | 顯示全部樓層
非常感謝管理員 又省了一筆黑幣   我非常崇拜管理員  你絕對(duì)是一個(gè)很牛逼的人
回復(fù)

使用道具 舉報(bào)

ID:66287 發(fā)表于 2018-2-9 16:53 | 顯示全部樓層
好貼!狀態(tài)機(jī)方式處理鍵盤(pán),非常穩(wěn)定的!
回復(fù)

使用道具 舉報(bào)

ID:86276 發(fā)表于 2018-3-14 09:38 | 顯示全部樓層
好東西,謝謝
回復(fù)

使用道具 舉報(bào)

ID:293645 發(fā)表于 2018-3-18 17:53 | 顯示全部樓層
多謝分享,新人表示感謝
回復(fù)

使用道具 舉報(bào)

ID:243748 發(fā)表于 2018-3-18 23:57 來(lái)自手機(jī) | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:140183 發(fā)表于 2018-4-19 20:08 | 顯示全部樓層
謝謝。。。。。
回復(fù)

使用道具 舉報(bào)

ID:67356 發(fā)表于 2018-4-20 06:35 來(lái)自手機(jī) | 顯示全部樓層
很不錯(cuò),謝謝了
回復(fù)

使用道具 舉報(bào)

ID:353559 發(fā)表于 2018-6-18 20:58 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:326489 發(fā)表于 2018-6-23 16:52 | 顯示全部樓層
下載了,很好。。!
回復(fù)

使用道具 舉報(bào)

ID:257260 發(fā)表于 2018-7-16 19:48 | 顯示全部樓層
謝謝,真好需要這個(gè)!
回復(fù)

使用道具 舉報(bào)

ID:269211 發(fā)表于 2018-7-17 16:25 | 顯示全部樓層
這個(gè)頭文件怎么在主程序調(diào)試?麻煩高手寫(xiě)一下主程序
回復(fù)

使用道具 舉報(bào)

ID:431327 發(fā)表于 2018-11-29 08:56 | 顯示全部樓層
很好,學(xué)習(xí)到了 。。。
回復(fù)

使用道具 舉報(bào)

ID:66287 發(fā)表于 2018-11-30 09:55 | 顯示全部樓層
程序?qū)懙姆浅:,而且樓主有個(gè)好習(xí)慣,注釋很詳細(xì),棒!
回復(fù)

使用道具 舉報(bào)

ID:475236 發(fā)表于 2019-4-14 00:05 | 顯示全部樓層
唉,沒(méi)有往下看就下了,不過(guò)還是謝謝了
回復(fù)

使用道具 舉報(bào)

ID:343102 發(fā)表于 2019-4-14 11:31 | 顯示全部樓層
謝謝樓主,謝謝管理員。
回復(fù)

使用道具 舉報(bào)

ID:511752 發(fā)表于 2019-4-14 17:00 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:687831 發(fā)表于 2020-3-1 23:50 來(lái)自手機(jī) | 顯示全部樓層
最后判斷應(yīng)該是"小于"50吧
回復(fù)

使用道具 舉報(bào)

ID:506075 發(fā)表于 2020-7-7 18:59 | 顯示全部樓層
admin 發(fā)表于 2016-3-10 18:06
下面是樓主的程序 給大家省點(diǎn)黑幣:

樓主的頭像好生眼熟啊,好人一生平安
回復(fù)

使用道具 舉報(bào)

ID:245820 發(fā)表于 2020-9-9 16:13 | 顯示全部樓層
包含了一個(gè)特殊的頭文件,難搞
回復(fù)

使用道具 舉報(bào)

ID:251029 發(fā)表于 2021-12-4 15:47 | 顯示全部樓層
看起來(lái)邏輯很細(xì)密,贊一個(gè)
回復(fù)

使用道具 舉報(bào)

ID:143767 發(fā)表于 2021-12-4 16:52 | 顯示全部樓層
編譯通不過(guò),提示:
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
回復(fù)

使用道具 舉報(bào)

ID:262 發(fā)表于 2021-12-4 17:47 | 顯示全部樓層
dj3365191 發(fā)表于 2021-12-4 16:52
編譯通不過(guò),提示:
Rebuild started: Project: 按鍵
Rebuild target 'Target 1'

你沒(méi)有把頭文件放進(jìn)去,當(dāng)然會(huì)報(bào)錯(cuò)了,你看我?guī)湍阏砹艘幌?工程
51hei.png

c樣本51hei.7z

13.86 KB, 下載次數(shù): 35, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

ID:143767 發(fā)表于 2021-12-5 10:16 | 顯示全部樓層
heicad 發(fā)表于 2021-12-4 17:47
你沒(méi)有把頭文件放進(jìn)去,當(dāng)然會(huì)報(bào)錯(cuò)了,你看我?guī)湍阏砹艘幌?工程

謝謝指教
回復(fù)

使用道具 舉報(bào)

ID:189875 發(fā)表于 2022-4-9 16:40 | 顯示全部樓層
學(xué)習(xí)學(xué)習(xí),編程思路很好。
回復(fù)

使用道具 舉報(bào)

ID:933601 發(fā)表于 2022-5-19 19:03 | 顯示全部樓層
編程思路很好。
回復(fù)

使用道具 舉報(bào)

ID:1044755 發(fā)表于 2024-7-31 10:07 | 顯示全部樓層
admin 發(fā)表于 2016-3-10 18:06
下面是樓主的程序 :

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表