有時在設計中,往往要用一個按鍵來輸入多種信息。如:單擊/雙擊/三擊、短擊/長擊、還有各種組合擊鍵方式。可以用以下程序來做。
如果按鍵閉合時間《500MS,判斷為一次短擊(0);
如果按鍵閉合時間》500MS,判斷為一次長擊(1);
兩次擊鍵時間間隔應《700MS,如果按鍵釋放后700MS內無鍵按下,則結束讀鍵。
讀鍵完畢返回一個鍵號值KEY_NUM。其意義如下:
KEY_NUM 意義
00000000 無鍵按下過
00000001 無意義
00000010 單次短擊
00000011 單次長擊
00000100 短擊 + 短擊
00000101 短擊 + 長擊
00000110 長擊 + 短擊
00000111 長擊 + 長擊
…… ……
10000000 7次短擊
11111111 7次長擊
上表中的KEY_NUM值的規律是,從左向右看,第一個“1”后面的每一位代表一次擊鍵;“0”代表短擊,“1”代表長擊。掌握該規律后,我們可將任何一個8位的二進制數“翻譯”成一種擊鍵組合。例如:01010101,代表的是:短+長+短+長+短+長。
該程序最多可識別7次連續擊鍵,共254種組合。但并非每個程序中用得上。在大多數程序中,能判斷雙擊即可以了,這時可將程序中的ZHBIT定義為2。同理,如果要判斷3次按鍵,將ZHBIT定義為3即可。
當ZHBIT=“1”時,程序僅能判斷一次擊鍵,包括2種組合(短擊/長擊);當ZHBIT=“2”時,程序還能判斷兩次擊鍵,包括6(2+4)種組合(短擊/長擊/(短+短)/(短+長)/(長+短)/(長+長));以次類推,當ZHBIT=“3”時,程序能判斷三次擊鍵,包括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
下面這段程序摘自小匠的一個智能充電器程序(MCU是EM78P458),如下:
;********************************
;讀鍵子程序
;出口: KEY_NUM =鍵號值
;中間: KEY_DL =計數器
;說明:
/*
短擊:鍵按下時間《500MS
長擊:鍵按下時間》500MS
兩次按鍵間隔時間《700MS
鍵號定義:
KEY_NUM=“00000000”: 無鍵按下
KEY_NUM=“00000001”: 無意義
KEY_NUM=“00000010”: 單次短擊
KEY_NUM=“00000011”: 單次長擊
KEY_NUM=“00000100”: 短擊 + 短擊
KEY_NUM=“00000101”: 短擊 + 長擊
KEY_NUM=“00000110”: 長擊 + 短擊
KEY_NUM=“00000111”: 長擊 + 長擊
。..
。..
KEY_NUM=“11111110”: 長擊 + 長擊 + 長擊 + 長擊 + 長擊 + 長擊 + 短擊
KEY_NUM=“11111111”: 長擊 + 長擊 + 長擊 + 長擊 + 長擊 + 長擊 + 長擊
*/
ZHBIT EQU 2 ;按鍵組合位(選擇范圍1~7)
;********************************
READKEY:
CLR KEY_NUM ;清鍵號
JKOFF READKEYF ;鍵未按下跳
BS KEY_NUM,0 ;“1” -》 鍵號低位
;=================
READKEYA:
CLR KEY_DL ;清計數器
READKEYB:
CALL DL10MS
INC KEY_DL
MOV A,@50
SUB A,KEY_DL
JBC R3,C
JMP READKEYC ;計數器溢出跳
JKON READKEYB ;鍵未釋放跳
BC R3,C ;C=“0”
JMP READKEYD
;=================
READKEYC:
WDTC ;喂狗
JKON READKEYC ;鍵未釋放跳
BS R3,C ;C=“1”
READKEYD:
RLLC KEY_NUM ;鍵號左移一位,C -》 鍵號低位
JBC KEY_NUM,ZHBIT ;按鍵檢測未完成繼續
RET
;=================
CLR KEY_DL ;清計數器
READKEYE:
CALL DL10MS
INC KEY_DL
MOV A,@70
SUB A,KEY_DL
JBC R3,C
READKEYF:
RET ;計數器溢出返回
JKOFF READKEYE ;鍵未按下跳
JMP READKEYA ;再次檢測
;=================
;鍵閉合跳(宏)
;=================
JKON MACRO ADDRESS
JBS R5,KEY ;鍵斷開跳
FJMP ADDRESS ;鍵閉合跳
CALL DL10MS ;延時去抖動
JBS R5,KEY ;鍵斷開跳
FJMP ADDRESS ;鍵閉合跳
ENDM
;=================
;鍵斷開跳(宏)
;=================
JKOFF MACRO ADDRESS
JBC R5,KEY ;鍵閉合跳
FJMP ADDRESS ;鍵斷開跳
CALL DL10MS ;延時去抖動
JBC R5,KEY ;鍵閉合跳
FJMP ADDRESS ;鍵斷開跳
ENDM
責任編輯 LK
-
程序
+關注
關注
116文章
3777瀏覽量
80855 -
按鍵
+關注
關注
4文章
223瀏覽量
57573
發布評論請先 登錄
相關推薦
評論