按键扫描

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.1.1 按键扫描
运用定时中断实现按键扫描,就是将一个按键过程抽象为4个状态: S0状态:按键保持为高,即按键没有被按下。

S1状态:按键确实被按下,与S0状态结合,完成按键按下的去抖。

S2状态:按键保持低电平,即按键被按下状态的累积,在此可以对某一变量计数。

S3状态:按键被释放,与S2结合,完成释放去抖,另外判别是不是长按。

对于按键的一般的单击应用,我们通过定时扫描按键针对不同的响应要求可以将一次按键理解为S0→S1→S2(按下响应)或者S1→S2→S3(弹起响应)即可。

根据这个思想,每个按键的判断至少需要3个状态,而且其中两个状态为按下状态。

以下是两个按键单击判断的键扫描的流程和具体程序,采用按下响应,该程序每10ms 运行1次。

键扫描
保存之前和再前键值
读取当前键值
有键按下?
当前键值=之前键值?
再前键值=0?
Y
Y
键处理返回Y
N N N
KEY_VAL
EQU R2 ;当前键值,用于存放S2状态 KEY_BACK
EQU 60H ;之前键值,用于存放S1状态 KEY_PRE
EQU R7 ;在前键值,用于存放S0状态 ;KEY_CNT EQU R6 ;按下时间计数器,用于连击判断
KEY_PORT EQU P2 ;定义P2键盘接口
;*******************键扫描程序*******************
KEY_SCAN: MOV KEY_PRE,KEY_BACK
MOV KEY_BACK,KEY_VAL
LCALL READ_KEY
MOV A,KEY_VAL
JZ KSR
CJNE A,KEY_BACK,KS2
CJNE KEY_PRE,#0,KS
;SJMP KS1
KS: ;INC KEY_CNT
;CJNE KEY_CNT,#5,KSR
KS1: LCALL KEY_HANDLE
KS2: ;MOV KEY_CNT,#0
KSR: RET
;************读键码程序*********************
READ_KEY: MOV A,KEY_PORT
ORL A,#0FCH
CPL A
JZ RK1 ;判断是否有按键
JB K0,RK2 ;判断是否K0键按下
MOV KEY_VAL,#1
SJMP RKR
RK1: MOV KEY_VAL,#0
SJMP RKR
RK2: JB K1,RKR ;判断是否K1键按
MOV KEY_VAL,#2
RKR: RET
小提示:
上述程序如果将注释掉的程序用上,就实现了连击键功能,其中KEY_CNT 用来存放按键定时计数,本例人为计数5次即按下50ms就触发一次键处理。

这种按键扫描方法是真正工程上实际可以使用的程序,具有很强的实用性。

相关文档
最新文档