有时在设计中,往往要用一个按键来输入多种信息。如:单击/双击/三击、短击/长击、还有各种组合击键方式。可以用以下程序来做。
如果按键闭合时间《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
电动汽车智能充电桩设计方案及其设计要求探索
国内连接器市场竞争与发迹了,如何在行业做到脱颖而出?
KTS-462R15L 免棱镜测程
单相交流电机常见的电缆故障介绍
电子管计算机原理_电子管计算机的运算速度
一个按键的多次击键组合应该如何判别详细技巧程序概述
明朔科技成为智慧路灯引领者,已应用于国内30个省级区域
手术机器人面临的伦理风险及应对措施
华为全新折叠屏产品Mate V
浅析时序数据库的流计算支持
中教照明:专注于校园健康照明领域
电源线滤波器的错误安装有哪些
3D玻璃预计2018年内达到2.235亿片 三款新iPhone有望全都支持无线充电
3PAR将其云计算支持扩展至红帽服务器虚拟化
无人工厂来了?粮食加工产线远程自动控制解决方案
5G部署迎来规模商用阶段未来发展可期
直角坐标机器人的结构组成及在铝锭搬运中的应用
中关村新元科技首发“五宝”的五大行业机器人 已经在几省开始使用
研究发现:93%的云计算环境都易有遭受网络攻击的风险
MPXM2010的压力测控系统及其精度改进发方法