220 likes | 362 Views
一、 键输入过程与软件结构. 图 9.1 MCS – 51 单片机键输入过程. 键按下. 键稳定. 前沿抖动. 前沿抖动. 图 9.2 键合断时的电压抖动. 二、 键盘接口和键输入软件中应解决的几个问题 1 .消除键抖动. 2 .键编码及键值. 顺序排列键编码--如图 9.3 所示。这种方法,键值的形成要根据 I/O 线的状态作相应处理。键码可按下式形成: 键码 = 行首键码 + 列号. 0 列 1 列 2 列 3 列. +5V. 0 行 1 行 2 行 3 行. 图 9.3 行列式键盘的编码与键值. 顺序排列编码.
E N D
一、 键输入过程与软件结构 图9.1 MCS–51单片机键输入过程
键按下 键稳定 前沿抖动 前沿抖动 图9.2 键合断时的电压抖动 二、 键盘接口和键输入软件中应解决的几个问题 1.消除键抖动
2.键编码及键值 顺序排列键编码--如图9.3所示。这种方法,键值的形成要根据I/O线的状态作相应处理。键码可按下式形成: 键码=行首键码+列号
0列1列 2列3列 +5V 0行 1行 2行 3行 图9.3 行列式键盘的编码与键值 顺序排列编码
3.键盘的监测方法 对于计算机应用系统,键盘扫描只是CPU工作的一部分,键盘处理只是在有键按下时才有意义。对是否有键按下的信息输入方式有中断方式与查询方式两种。
三、 独立式按键 1.独立式按键接口结构 图9.4 独立式按键的接口电路示意图 (a) 中断方式;(b) 查询方式
2.独立式按键的软件结构 下面是查询方式的键盘程序。K0~K7为功能程序入口地址标号,其地址间隔应能容纳JMP指令字节,PROM0~PROM7分别为每个按键的功能程序。设I/O为P1口。 START:MOV A,#0FFH ; MOV P1,A ;置P1口为输入状态 MOV A,P1 ;键状态输入 JNB ACC.0,K0 ;检测0号键是否按下,按下转 JNB ACC.1,K1 ;检测1号键是否按下,按下转
JNB ACC.2,K2 ;检测2号键是否按下,按下转 JNB ACC.3,K3 ;检测3号键是否按下,按下转 JNB ACC.4,K4 ;检测4号键是否按下,按下转 JNB ACC.5,K5 ;检测5号键是否按下,按下转 JNB ACC.6,K6 ;检测6号键是否按下,按下转 JNB ACC.7,K7 ;检测7号键是否按下,按下转 JMP START ;无键按下返回,再顺次检测 K0:AJMP PROM0 K1:AJMP PROM1 K7:AJIMP PROM7 ;入口地址表 …
PROM0:……………………… ;0号键功能程序 ……………………… JMP START ;0号键功能程序执行完返回 PROM1:……………………… ;0号键功能程序 ……………………… JMP START ;1号键功能程序执行完返回 ……………………… ;7号键功能程序 PROM7: ……………………… JMP START ;7号键功能程序执行完返回 …
0列1列 2列3列 +5V 0行 1行 2行 3行 图9.5键盘的组成 四、行列式(矩阵)键盘(省I/O口) 行列式键盘又叫矩阵式键盘。用I/O口线组成行、列结构,按键设置在行列的交点上。例如4×4的行列结构可组成16个键的键盘。因此,在按键数量较多时,可以节省I/O口线。
1.行列式键盘的接口 行列式键盘的接口方法有许多,例如直接接口于单片机的I/O口上;利用扩展的并行I/O接口;用一种可编程的键盘、显示接口芯片8279进行接口等。 其中,利用扩展的并行I/O接口方法方便灵活,在单片机应用系统中比较常用(实验箱8255)。 2.原理 按键设置在行、列线的交点上,行、列线分别连接到按键开关的两端。行线通过上拉电阻接+5 V,被箝位在高电平状态。
2.键盘工作方式 编程扫描和中断扫描
8255 PA7 … … +5V PA1 PA0 PB0 PB1 … … PB7 …… +5V 图9.6 8×8键盘连接 1)编程扫描方式 CPU在完成其它工作的空余来响应键输入要求。
键盘中有无键按下是由列线送入全扫描字,读入行线状态来判别的。其方法是:PA口输出00H,即所有列线置成低电平,然后将行线电平状态读入累加器A中。如果有键按下,总会有一根行线电平被拉至低电平,从而使行输入状态不全为"1"。键盘中有无键按下是由列线送入全扫描字,读入行线状态来判别的。其方法是:PA口输出00H,即所有列线置成低电平,然后将行线电平状态读入累加器A中。如果有键按下,总会有一根行线电平被拉至低电平,从而使行输入状态不全为"1"。 键盘中哪一个键按下是由列线逐列置低电平后,检查行输入状态,称为逐列扫描。其方法是:从PA0开始,依次输出"0",置对应的列线为低电平,然后从PC口读入行线状态,如果全为"1",则所按下之键不在此列;如果不全为"1",则所按下的键必在此列,而且是与0电平行线相交的交点上的那个键。 求取键码
+5V & INT1 80C51 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 图9.7中断连接方式 2)中断扫描方式
中断工作方式: 提高CPU的效率,可采用中断工作方式。 这种工作方式是当键盘上有键按下时,向CPU发一个中断请求信号,CPU响应中断后,在中断服务程序中扫描键盘,执行键功能程序。
KEY 有键闭合吗? 调用延时 子程序6ms N Y 二次调用延时子程序12ms 有键闭合吗? N Y 判断闭合键键码 闭合键释放吗? N Y 转键码处理 返回 图9.8软件消除抖动和识别键码流程图 3.键盘接口举例:
键盘扫描子程序如下: KEY1:ACALL KS1 ;调用判断有无键按下子程序 JNZ LK1 ;有键按下时,(A)≠ 0转消抖延时 AJMP KEY1 ;无键按下返回 LK1:ACALL TM12S ;调12 ms延时子程序 ACALL KS1 ;查有无键按下,若有则真有键按下 JNZ LK2 ;键(A)≠ 0逐列扫描 AJMP KEY1 ;不是真有键按下,返回 LK2;MOV R2,#0FEH ;初始列扫描字(0列)送入R2 MOV R4,#00H ;初始列(0列)号送入R4
LK4:MOV DPTR,#7F01H ;DPTR指向8155PA口 MOV A,R2 ;列扫描字送至8155PA口 MOVX @DPTR,A INC DPTR ;DPTR指向8155PC口 INC DPTR MOVX A,@DPTR ;从8155 PC口读入行状态 JB ACC.0,LONE ;查第0行无键按下,转查第1行 MOV A,#00H ;第0行有键按下,行首键码#00H→A AJMP LKP ;转求键码 LONE:JB ACC.1,LTWO ;查第1行无键按下,转查第2行 MOV A,#08H ;第1行有键按下,行首键码#08H→A AJMP LKP ;转求键码
LTWO:JB ACC.2,LTHR ;查第2行无键按下,转查第3行 MOV A,#10H ;第2行有键按下,行首键码#10H→A AJMP LKP ;转求键码 LTHR:JB ACC.3,NEXT ;查第3行无键按下,转该查下一列 MOV A,#18H ;第3行有键按下,行首键码#18H→A LKP:ADD A,R4 ;求键码,键码=行首键码+列号 PUSH ACC ;键码进栈保护 LK3:ACALL KS1 ;等待键释放 JNZ LK3 ;键未释放,等待 POP ACC ;键释放,键码→A RET ;键扫描结束,出口状态(A)=键码
NEXT:INC R4 ;准备扫描下一列,列号加1 MOV A,R2 ;取列号送累加器A JNB ACC.7,KEND ;判断8列扫描否?扫描完返回 RL A ;扫描字左移一位,变为下一列扫描字 MOV R2,A ;扫描字送入R2 AJMP LK4 ;转下一列扫描 KEND:AJMP KEY1 KS1:MOV DPTR,#7F01H ;DPTR指向8155PA口 MOV A,#00H ;全扫描字→A MOVX @DPTR,A ;全扫描字送往8155PA口
INC DPTR ;DPTR指向8155PC口 • INC DPTR • MOVX A,@DPTR ;读入PC口行状态 • CPL A ;变正逻辑,以高电平表示有键按下 • ANL A,#0FH ;屏蔽高4位,只保留低4位行线值 • RET ;出口状态:(A)≠0时有键按下 • TM12ms:MOV R7,#18H ;延时12 ms子程序 • TM: MOV R6,#0FFH • TM6 : DJNZ R6,TM6 • DJNZ R7,TM • RET