历史上的今天
今天是:2025年01月15日(星期三)
2018年01月15日 | 按键的多次击键组合判别技巧汇编源程序
2018-01-15 来源:eefocus
有时在设计中,往往要用一个按键来输入多种信息。如:单击/双击/三击、短击/长击、
还有各种组合击键方式。可以用以下程序来做。
如果按键闭合时间<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
上一篇:串口自动波特率设置程序
史海拾趣
|
CE编译Directx Show播放声音,代码正常,但不能创建COM组件(问题复杂,请仔细看描述) 这几天我可被CE5头都搞大了? 先是 PlatForm Builder 编译的CE 不能播放音乐。 http://topic.eeworld.net/u/20100118/21/f22dfbcd-987f-4651-b1df-4a578fae77a2.html。编译能通过,但一播放就退出! 重装系统才解决!(这个问题解决了,但没有搞 ...… 查看全部问答> |
|
香版主您好,我手上有EKSTM32F107VC-PKT的开发板,这个板子资料只能从网上找一些,官方的好像没有,这两天在弄以太网的程序,根据http://www.stmsky.com/bbs/thread-2956-1-1.html这个帖子上的修改步骤调试程序,一改程序debug后就不能正常进 ...… 查看全部问答> |
|
本来只是想的实现一个开关的,但是最近自己拖拉了所以再加上点功能吧,这个功能就是广告灯的左右移动,不过我加了一个可以开关控单灯的输入。本来准备430也是一样的不过今天拿到开发板发现没有那么多LED⊙﹏⊙,所以就直接用数码管了。 #include ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 03:53 编辑 最近一直在调ADS1115这款AD,用I/O口模拟的I2C时序,结果总是不理想。读出来的数字我表示看不出规律,输入什么都不接有的时候是满值65535,有的时候乱跳。下面是我的程序,大家看下。我感觉我写的时 ...… 查看全部问答> |
|
首先简单介绍一下这个系统,该系统由矩阵键盘、电源模块、PSOC4、lcd12864、舵机2个、亚克力板2块黑色、支架一套、角度传感器一个、语音模块 介绍系统的功能:可以任意设置平台倾斜的角度,只需使用按键输入你想设定的方向即可,平台会根据角度传 ...… 查看全部问答> |




