一个按键的多次击键组合应该如何判别详细技巧程序概述

电子说

1.2w人已加入

描述

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

按键

  如果按键闭合时间《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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分