广告

原创 一个按键的多次击键组合判别技巧汇编源程序(转贴)

2006-11-12 00:30 13163 0 分类: MCU/ 嵌入式

一个按键的多次击键组合判别技巧


此文作者不祥,如有知其作者,请告知。



有时在设计中,往往要用一个按键来输入多种信息。如:单击/双击/三击、短击/长击、
还有各种组合击键方式。可以用以下程序来做。
如果按键闭合时间<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

广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
hendiao 2011-04-11 17:21
基于STM32的智能汽车前灯系统计划
STM32项目/学习计划表项目名称 请点击以下链接更新您的个人资料(包括“职位,部门,单位名称,地址,邮编,电子邮箱,电话”),以便我们能及时联系您并快速发送开发套件。http://space.edn...
hendiao 2011-04-11 17:21
基于STM32的GPS公交报站系统
STM32项目/学习计划表项目名称 请点击以下链接更新您的个人资料(包括“职位,部门,单位名称,地址,邮编,电子邮箱,电话”),以便我们能及时联系您并快速发送开发套件。http://space.edn...
hendiao 2011-04-11 17:21
基于STM32的GPRS/GSM抄表系统
STM32项目/学习计划表项目名称 请点击以下链接更新您的个人资料(包括“职位,部门,单位名称,地址,邮编,电子邮箱,电话”),以便我们能及时联系您并快速发送开发套件。http://space.edn...
hendiao 2011-04-11 17:20
建立在GSM/GPRS的家庭智能报警和控制系统的初步想法
STM32项目/学习计划表项目名称 请点击以下链接更新您的个人资料(包括“职位,部门,单位名称,地址,邮编,电子邮箱,电话”),以便我们能及时联系您并快速发送开发套件。http://space.edn...
hendiao 2008-11-27 11:42
用三极管实现3V与5V混合系统中逻辑器接口问题(原创)
3V与5V混合系统中逻辑器接口问题在电路设计当中,往往会遇到电压匹配问题,因为电路中往往不只只有一个电平信号,大部分包括3.3V,5V或者12V,但是有时候需要用到3.3V和5V的通信或者对联,这其中...
hendiao 2008-11-27 11:41
adsl modem和PC通过RS232的接口
这是一个朋友给我看得电路这个电路时modem和PC的连接图在PC端,用到了RS232的5个信号,modem端则只用到了RXD、TXD和GND。我们来分析一下modem的TXD到PC端的RXD这个电路中...
我要评论
0
0
广告
关闭 热点推荐上一条 /2 下一条