在连按的处理过程中,要考虑3个时间常数:
1、连按响应时间常数(首次值),该值用于区分连按/单按。
a)当按键闭和的时间<该参数时,判为单按;
b)当按键闭和的时间>该参数时,判为连按;
2、连按缓冲时间常数(最大值)。
在连按操作刚开始时,按键响应速度较慢,这个参数就是用于决定每次动作之间的最大时间。
3、连按缓冲时间常数(最小值)
在连按的过程中,响应的速度越来越快,但也不能无限快。这个参数就是用于决定每次动作之间的最小时间。
还有一个要考虑的问题是,可能并不是所有按键都具有连按功能。这时,可用一个标志位来区分。在读键子程序中返回键值的同时,也返回这个标志,告诉键盘监控程序是否要做连按处理。
下面的一段例程中,可以识别单按/连按,并可处理加速度问题。只要在主程序中调用即可。程序中的延时用现实程序来代替。
;********************************
;按键处理模块
;********************************
;时间常数定义
KEY_T == 250 ;连按响应时间常数(首次值)
KEY_TMAX == 120 ;连按缓冲时间常数(最大值)
KEY_TMIN == 30 ;连按缓冲时间常数(最小值)
;********************************
KEYWK:
MOV A,@KEY_T
MOV KEY_JS,A ;连按计数器置初值
BC TT1,KEY ;清连按标志
MOV A,@KEY_TMAX-KEY_TMIN
MOV KEY_JSJS,A ;连按加速计数器置初值
CALL READKEY ;读键
JBS R3,C ;有键按下跳
RET
FCALL MOVLCD ;显示延时
CALL READKEY ;读键
JBS R3,C ;确实有键按下跳
RET
;====确实有键按下
MOV KEY_BUF,A ;保存键值
KEY1:
FCALL MOVLCD ;显示延时
CALL READKEY ;读键
JBS R3,C ;键未释放跳
JMP KEY5
;====连按判断
JBS TT1,KEY_EN ;连按功能有效跳
JMP KEY1 ;禁止连按跳
JBC TT1,KEY ;不是连按跳
JMP KEY2
DJZ KEY_JS ;连按计数器-1=0跳
JMP KEY1
BS TT1,KEY ;置连按标志
JMP KEY1
;====连按处理
KEY2:
CALL DOKEY ;执行按键功能
MOV WK_MODE,A ;刷新模式
;连按加速计数器-1
DJZ KEY_JSJS
JMP $+2
INC KEY_JSJS
;连按计数器置延时值
MOV A,@KEY_TMIN
ADD A,KEY_JSJS
MOV KEY_JS,A ;连按计数器置延时值
KEY4:
FCALL MOVLCD ;显示延时
DJZ KEY_JS ;连按计数器-1=0跳
JMP KEY4
JMP KEY1
;====单按处理
KEY5:
FCALL MOVLCD ;显示延时
CALL READKEY ;读键
JBC R3,C ;键确实已释放跳
JMP KEY1
JBC TT1,KEY ;不是连按跳
RET
;按键发声
BS TT1,KEY_SP ;开蜂鸣器
FCALL MOVLCD
CALL DOKEY ;执行按键功能
MOV WK_MODE,A ;刷新模式
BC TT1,KEY_SP ;关蜂鸣器
FCALL MOVLCD
RET
;********************************
;读键子程序
;出口: A=键号值(0=无,1=K2定时,2=K3功率选择,3=K4水温上调,4=K5水温下调,
; 5=K6时钟上调,6=K7时钟下调,7=K8时段设置)
; C: (0=无,1=有)
; TT1,KEY_EN: 当前键连按有效标志(0=禁止连按,1=可连按)
; (K4/K5/K6/K7有连按功能)
;********************************
READKEY:
BS R3,C
;不可连按的按键
BC TT1,KEY_EN
JBS R7,6 ;K2未闭合跳
RETL @01 ;返回A=01
JBS R7,0 ;K3未闭合跳
RETL @02 ;返回A=02
JBS R7,5 ;K8未闭合跳
RETL @07 ;返回A=07
;可连按的按键
BS TT1,KEY_EN
JBS R7,1 ;K4未闭合跳
RETL @03 ;返回A=03
JBS R7,2 ;K5未闭合跳
RETL @04 ;返回A=04
JBS R7,3 ;K6未闭合跳
RETL @05 ;返回A=05
JBS R7,4 ;K7未闭合跳
RETL @06 ;返回A=06
BC R3,C
RETL @00 ;返回A=00
----结束