有時(shí)在設(shè)計(jì)中,往往要用一個(gè)按鍵來輸入多種信息。如:?jiǎn)螕?雙擊/三擊、短擊/長(zhǎng)擊、還有各種組合擊鍵方式。可以用以下程序來做。
如果按鍵閉合時(shí)間《500MS,判斷為一次短擊(0);
如果按鍵閉合時(shí)間》500MS,判斷為一次長(zhǎng)擊(1);
兩次擊鍵時(shí)間間隔應(yīng)《700MS,如果按鍵釋放后700MS內(nèi)無鍵按下,則結(jié)束讀鍵。
讀鍵完畢返回一個(gè)鍵號(hào)值KEY_NUM。其意義如下:
KEY_NUM 意義
00000000 無鍵按下過
00000001 無意義
00000010 單次短擊
00000011 單次長(zhǎng)擊
00000100 短擊 + 短擊
00000101 短擊 + 長(zhǎng)擊
00000110 長(zhǎng)擊 + 短擊
00000111 長(zhǎng)擊 + 長(zhǎng)擊
…… ……
10000000 7次短擊
11111111 7次長(zhǎng)擊
上表中的KEY_NUM值的規(guī)律是,從左向右看,第一個(gè)“1”后面的每一位代表一次擊鍵;“0”代表短擊,“1”代表長(zhǎng)擊。掌握該規(guī)律后,我們可將任何一個(gè)8位的二進(jìn)制數(shù)“翻譯”成一種擊鍵組合。例如:01010101,代表的是:短+長(zhǎng)+短+長(zhǎng)+短+長(zhǎng)。
該程序最多可識(shí)別7次連續(xù)擊鍵,共254種組合。但并非每個(gè)程序中用得上。在大多數(shù)程序中,能判斷雙擊即可以了,這時(shí)可將程序中的ZHBIT定義為2。同理,如果要判斷3次按鍵,將ZHBIT定義為3即可。
當(dāng)ZHBIT=“1”時(shí),程序僅能判斷一次擊鍵,包括2種組合(短擊/長(zhǎng)擊);當(dāng)ZHBIT=“2”時(shí),程序還能判斷兩次擊鍵,包括6(2+4)種組合(短擊/長(zhǎng)擊/(短+短)/(短+長(zhǎng))/(長(zhǎng)+短)/(長(zhǎng)+長(zhǎng)));以次類推,當(dāng)ZHBIT=“3”時(shí),程序能判斷三次擊鍵,包括14(2+4+8)種組合。
ZHBIT 組合種類
1 2
2 2+4=6
3 2+4+8=14
4 2+4+8+16=30
5 2+4+8+16+32=62
6 2+4+8+16+32+64=126
7 2+4+8+16+32+64+128=254
下面這段程序摘自小匠的一個(gè)智能充電器程序(MCU是EM78P458),如下:
;********************************
;讀鍵子程序
;出口: KEY_NUM =鍵號(hào)值
;中間: KEY_DL =計(jì)數(shù)器
;說明:
/*
短擊:鍵按下時(shí)間《500MS
長(zhǎng)擊:鍵按下時(shí)間》500MS
兩次按鍵間隔時(shí)間《700MS
鍵號(hào)定義:
KEY_NUM=“00000000”: 無鍵按下
KEY_NUM=“00000001”: 無意義
KEY_NUM=“00000010”: 單次短擊
KEY_NUM=“00000011”: 單次長(zhǎng)擊
KEY_NUM=“00000100”: 短擊 + 短擊
KEY_NUM=“00000101”: 短擊 + 長(zhǎng)擊
KEY_NUM=“00000110”: 長(zhǎng)擊 + 短擊
KEY_NUM=“00000111”: 長(zhǎng)擊 + 長(zhǎng)擊
。..
。..
KEY_NUM=“11111110”: 長(zhǎng)擊 + 長(zhǎng)擊 + 長(zhǎng)擊 + 長(zhǎng)擊 + 長(zhǎng)擊 + 長(zhǎng)擊 + 短擊
KEY_NUM=“11111111”: 長(zhǎng)擊 + 長(zhǎng)擊 + 長(zhǎng)擊 + 長(zhǎng)擊 + 長(zhǎng)擊 + 長(zhǎng)擊 + 長(zhǎng)擊
*/
ZHBIT EQU 2 ;按鍵組合位(選擇范圍1~7)
;********************************
READKEY:
CLR KEY_NUM ;清鍵號(hào)
JKOFF READKEYF ;鍵未按下跳
BS KEY_NUM,0 ;“1” -》 鍵號(hào)低位
;=================
READKEYA:
CLR KEY_DL ;清計(jì)數(shù)器
READKEYB:
CALL DL10MS
INC KEY_DL
MOV A,@50
SUB A,KEY_DL
JBC R3,C
JMP READKEYC ;計(jì)數(shù)器溢出跳
JKON READKEYB ;鍵未釋放跳
BC R3,C ;C=“0”
JMP READKEYD
;=================
READKEYC:
WDTC ;喂狗
JKON READKEYC ;鍵未釋放跳
BS R3,C ;C=“1”
READKEYD:
RLLC KEY_NUM ;鍵號(hào)左移一位,C -》 鍵號(hào)低位
JBC KEY_NUM,ZHBIT ;按鍵檢測(cè)未完成繼續(xù)
RET
;=================
CLR KEY_DL ;清計(jì)數(shù)器
READKEYE:
CALL DL10MS
INC KEY_DL
MOV A,@70
SUB A,KEY_DL
JBC R3,C
READKEYF:
RET ;計(jì)數(shù)器溢出返回
JKOFF READKEYE ;鍵未按下跳
JMP READKEYA ;再次檢測(cè)
;=================
;鍵閉合跳(宏)
;=================
JKON MACRO ADDRESS
JBS R5,KEY ;鍵斷開跳
FJMP ADDRESS ;鍵閉合跳
CALL DL10MS ;延時(shí)去抖動(dòng)
JBS R5,KEY ;鍵斷開跳
FJMP ADDRESS ;鍵閉合跳
ENDM
;=================
;鍵斷開跳(宏)
;=================
JKOFF MACRO ADDRESS
JBC R5,KEY ;鍵閉合跳
FJMP ADDRESS ;鍵斷開跳
CALL DL10MS ;延時(shí)去抖動(dòng)
JBC R5,KEY ;鍵閉合跳
FJMP ADDRESS ;鍵斷開跳
ENDM
責(zé)任編輯 LK
-
程序
+關(guān)注
關(guān)注
117文章
3825瀏覽量
82535 -
按鍵
+關(guān)注
關(guān)注
4文章
227瀏覽量
57983
發(fā)布評(píng)論請(qǐng)先 登錄
按鍵學(xué)習(xí) 按鍵漫談+單個(gè)按鍵多次擊鍵的檢測(cè)方法
按鍵高級(jí)使用:短按、長(zhǎng)按、連續(xù)、雙擊、組合鍵實(shí)現(xiàn)
一個(gè)按鍵的多次擊鍵組合判別技巧匯編程序
基于狀態(tài)機(jī)的單片機(jī)按鍵短按長(zhǎng)按功能的實(shí)現(xiàn)

PID程序算法的詳細(xì)資料概述免費(fèi)下載
用兩個(gè)IO口檢測(cè)5個(gè)按鍵的程序詳細(xì)資料免費(fèi)下載

如何為單片機(jī)的按鍵加一個(gè)鎖防止多次觸發(fā)實(shí)例資料和程序免費(fèi)下載

應(yīng)該如何學(xué)習(xí)STM32資料概述

單片機(jī)C程序設(shè)計(jì)的六個(gè)實(shí)例詳細(xì)講解

STM32 獨(dú)立按鍵掃描功能大全-支持連擊、組合連擊、任意連擊

RT-Thread大會(huì):如何實(shí)現(xiàn)4個(gè)按鍵的手勢(shì)組合?

評(píng)論