?? key.txt
字號:
一個按鍵的多次擊鍵組合判別技巧
有時在設計中,往往要用一個按鍵來輸入多種信息。如:單擊/雙擊/三擊、短擊/長擊、
還有各種組合擊鍵方式。可以用以下程序來做。
如果按鍵閉合時間<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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -