您的位置: 网站首页 > 电子与嵌入式 > 单片机原理与应用 > 第8章 单片机的输入/输出接口 > 【8.4 键盘接口技术】

8.4 键盘接口技术

 

键盘是微机应用系统中使用最广泛的一种数据输入设备。在设计键盘接口时,要解决去抖动问题:由于按键被按下和弹起的瞬间,按键有短暂的抖动(时断时通),为了有效地检测按键,查询按键时必须让开这段时间,这就是去抖动。一般采用延迟10ms20ms的方法实现。

从结构上分,主要有按键式键盘和旋钮式键盘两类。按键式键盘实际是一组按键开关的集合,包括机械式、薄膜式、电容式和霍尔效应按键等。机械式按键开关利用触点的闭合和断开来表征按键的状态,价格低廉,但会产生触点抖动。薄膜式按键由3层塑料或橡胶夹层组成,顶层每一行键和底层每一列键下面都有一条印制银导线,在压键时将顶层导线压过中层的小孔与底层的导线接触。这种按键可以做成很薄的密封单元,寿命可达100万次。新型的按键式键盘采用了无触点的静电容量检测方式,通过检测相应的静电容量值的变化来实现。操作键盘只需轻轻触摸按键,而不需要采用“击打”的方式,键盘的使用寿命得到显著延长。电容式按键在压键时,可由特制的放大电路检测到电容的变化,没有机械触点被氧化的问题,寿命可达2 000万次。霍尔效应按键的原理是活动电荷在磁场中的偏转效应,没有机械触点,具有良好的密封性,但是价格昂贵,寿命超过1亿次。

按照产生代码的方式不同,键盘可分为编码键盘和非编码键盘两种。前者采用硬件电路来去除键抖动,实现键的自动编码,占用CPU时间少,但电路较复杂,主要有BCD码键盘和ASCII码键盘。非编码键盘仅提供键的开关状态,键代码的产生等需要由软件来完成。

8.4.1  键盘接口概述

MCS-51单片机通常采用机械触点式按键键盘,CPU通过检测键盘机械触点断开和闭合时电压信号的变化来确定按键的状态。按键的闭合与否,反映在电压上就是呈现出高电平或低电平,如果高电平表示断开的话,则低电平就表示闭合,因而通过对电平高低状态的检测,可以确定按键是否按下。

由于机械触点的弹性作用,在闭合及断开的瞬间,电压信号伴随有一定时间的抖动,抖动时间与按键的机械特性有关,一般为5ms10ms。按键稳定闭合时间的长短则由操作者的按键动作决定,一般为零点几秒到几秒的时间。

为了保证CPU一次按键动作既不重复也不遗漏,必须消除抖动的影响。消除按键抖动的措施有硬件消除和软件消除两种方法。根据抖动信号的特点,通常采用软件消除的办法。实现方法是,在程序执行过程中检测到有键按下时,先调用一段延时(约10 ms)子程序,然后判断该按键的电平是否仍保持在闭合状态,如果是则确认有键按下。

8.4.2  键盘的硬件接口

MCS-51单片机在扩展键盘接口时,可以利用I/O口直接与键盘连接。如果还需扩展显示器电路,可通过Intel 825581558279等接口芯片连接。具体采用何种方式,需要根据实际需求来分配资源。在设计硬件接口时,应注意与接口芯片的时序配合,还需考虑地址分配。

按照键盘按键的结构形式,可分为独立式和矩阵式两种。

1.独立式按键

独立式按键就是各个按键相互独立,分别接一条输入线,各条输入线上的按键工作状态不会影响其他输入线的工作状态。因此,通过检测输入线的电平状态,可以判断哪个按键被按下。

独立式按键电路配置灵活,软件设计简单。缺点是每个按键需要一根输入口线,在按键数量较多时,占用大量的输入口资源,电路结构显得很繁杂,只适用于按键较少或操作速度较高的场合。

2.矩阵式键盘

矩阵式键盘由行线和列线组成,按键位于行、列的交叉点上,如图8-15所示。图8-15是一个3×3的行、列结构,可以构成一个有9个按键的键盘。同理,一个4×4的行、列结构可以构成一个含有16个按键的键盘等。显然,在按键数目较多的场合,矩阵式键盘与独立式按键键盘相比,可节省很多I/O口。

按键设置在行、列线的交点上,行、列线分别连接到按键开关的两端。图8-15中,行线通过上拉电阻接到高电平。无按键动作时,行线处于高电平状态。当有按键按下时,行线电平状态由与此行线相连的列线电平决定:列线电平如果为低,则行线电平为低;列线电平如果为高,则行线电平也是高的。这是识别矩阵键盘按键是否被按下的特征。

8-15  矩阵式键盘结构

8.4.3  独立式按键接口设计

独立式按键的接口设计可采用查询或中断方式。

1.查询方式典型电路

此电路中按键直接与单片机的I/O口线相接,如图8-16所示,通过读Pl口,判定各个I/O口线(P1.0P1.7)的电平状态,即可识别按下的按键。

8-16  独立式按键查询方式电路

图中各按键都接有上拉电阻,是为了保证按键断开时,相应的口线有确定的高电平。由于P1口内部有上拉电阻,这些电阻可省去。

2.中断方式典型电路

中断方式电路如图8-17所示。

按键直接与单片机的I/O口线(如P1口)相接,同时通过“线或”电路连接至外部中断引脚。当有按键按下时,即触发中断,在中断服务程序中,通过判断P1口各条线的电平状态,即可识别出按下的按键。

8-17  独立式按键中断方式电路

3.独立式按键接口电路设计

独立式按键的硬件电路如图8-18所示。采用基于三态缓冲器74LS244的独立式按键,可构成8个按键的键盘接口电路,图8-18中为4个按键。

8-18  采用三态缓冲器扩展I/O口电路

如图8-18所示电路中以单片机P2.7和读信号的逻辑或作为三态门的选通控制线,把4个按键当作外部RAM某一地址来对待,则按键地址为7FFFH,通过读片外RAM的方法,识别按键的工作状态。由于P0口可以位寻址,所以也可单独读某一个按键的状态。由于P0口内部无上拉电阻,为保证按键断开时各I/O口线有确定的高电平,均通过上拉电阻接高电平。

软件设计可采用查询方式检测按键的状态,如果P0.0P0.3各位中有低电平,则对应的按键被按下,利用延时来消除抖动,相应的程序段如下。

KEYPRO:MOV DPTR,#7FFFH         ;送按键地址

         MOVX  A,@DPTR           ;读键盘状态

ANL    A,#0FH                ;屏蔽高4

MOV  R2,A                ;保存键盘状态值

LCALL DL10MS            ;延时10 ms消抖

MOVX  A,@DPTR            ;再读键盘状态

ANL  A,#0FH              ;屏蔽高3

CJNE  A,R2,EXIT          ;若两次结果不一样,按键无效

CJNE  A,#0EH,TO­_2        ;K1键未按下,转TO_2

LJMP  KEY1               ;K1键按下,转处理子程序KEY1

TO_2:CJNE  A,#0DH,TO_3        ;K2键未按下,转TO_3

LJMP  KEY2               ;K2按下,转键2处理

TO_3:CJNE  A,#0BH,TO_4        ;K3键未按下,转TO_4

LJMP  KEY3               ;K3按下,转键3处理

TO_4:CJNE  A,#07H,EXIT        ;K4键未按下,返回

LJMP  KEY4               ;K4键按下,转键4处理

EXIT:RET                      ;重键或无键按下,返回

可见,独立式按键的识别和编程比较简单,常在按键数目较少的场合使用。

8.4.4  行列式键盘接口设计

行列式键盘又叫矩阵式键盘。用I/O接口组成行、列结构,按键设置在行列的交点上。例如用2×2的行列结构可构成4个键的键盘,4×4行列结构可构成16个键的键盘。因此,在按键数量较多时,可以节省I/O接口线。

1.键盘工作方式

微机应用系统中,键盘扫描只是CPU工作的内容之一。CPU在忙于各项工作任务时,如何兼顾键盘扫描,既保证不失时机的响应键操作,又不过多占用CPU时间。因此,要根据应用系统中CPU的忙闲情况以及系统是否要求及时地响应键盘来选择键盘的工作方式。键盘的工作方式有查询方式、中断扫描方式等。

1)查询工作方式。

查询工作方式是利用CPU在完成其他工作的空余,调用键盘扫描子程序来响应键输入要求。在执行其他功能程序时,CPU不再响应键输入要求,故可能不能及时地响应键盘。如果系统要求非常及时地处理键盘事务,则此方式不合适,必须采用中断方式。

2)中断工作方式。

计算机应用系统工作时,并不经常需要键输入。由于单片机的资源有限,当设计较为复杂的系统时,必须提高CPU的工作效率和系统的响应速度,可以采用中断扫描工作方式。即只有在键盘有键按下时,CPU才执行键盘扫描,执行该键功能程序。

电路上,中断方式是在行(列)扫描键盘基础上,将每一列(或行)经过相与后,送到CPU外部中断输入端(或)。中断扫描工作方式的键盘接口如图8-19b)所示。

程序上,与扫描相似,不同处在于要将键盘扫描程序作为对应中断的服务程序,也就是要将其地址设置为中断向量。

3)键盘扫描方式。

当键盘有键按下时,要对键盘进行扫描,以判定是哪一个键按下。通常扫描方式有两种,即扫描法和反转法。根据扫描方法不同,行列式键盘又分为两种,一种为行(列)扫描键盘,另一种为线反转键盘。

2.键盘按键识别

1)扫描法。

扫描法是在判定有键按下后逐列(或逐行)置低电平,同时读入行(或列)的状态,如果行(或列)的状态出现非全1状态,这时0状态的行、列交点的键就是所按下的键。

扫描法的特点是逐列(或逐行)扫描查询。这时相应行(或列)应有上拉电阻接高电平。如图8-19a)所示,行线上拉电阻接VCC,列线逐列扫描。

行(列)扫描键盘的工作原理如下所述。

如图8-19所示,按键设置在行列交点上,行列线分别连接到按键开关的两端。行线由上拉电阻接VCC

键盘有无按键被按下判别方法如下所述。

将行线设置为输入方式。

列线送全0

读行线,若全为1,则意味着无键被按下(由于行线被上拉电阻拉到高电平);若不全为l,则表示有键被按下。

延迟15ms20ms,去抖动。

现在根据读出的行线值,可以确定被按下键的行号。但不知道是哪一列,接下来采用“列扫描法”解决这一问题。

先让第0列输出为0,其他列线输出均为高,读行线,若不为全1,则按下键就在该列,找到了被按下键的行列号,退出;若为全l,修改为下一列为0,其他列为全1,重复该步直到所有列都被扫描完。

若扫描完所有列,但没有找到行,则说明键已经被释放,没有找到有效的按键,退出。

a)查询方式键盘接口                  b)中断方式键盘接口

8-19  扫描式键盘

查询工作方式只有在CPU空闲时才能调用键盘子程序。因此,在设计应用系统软件方案时,必须考虑这种键盘扫描子程序的编程调用应能满足键盘响应要求。

2)反转法。

扫描法要逐列(行)扫描查询,当按下的键在最后行(列)时,这要经过多次扫描才能获得键值/键号。在上述行(列)键盘的基础上,对每个行(列)线增加一个上拉电阻,构成了反转键盘。用反转法,只要经过两个步骤就可获得键值。反转法同样有程序查询和中断两种方式,原理如图8-20所示。

a)查询方式键盘接口                      b)中断方式键盘接口

8-20  线反转式键盘

下面就中断方式介绍反转法的两个步骤。

将行编程为输入线,列编程为输出线,并使I/O输出数据为0FH(即保证输出信号D7D40000D3D01111)。若有键按下,则与门的输出端变为低电平,向CPU申请中断,表示键盘中有键按下。与此同时,D3D0的数据输入到内存中的某一单元(N)中存放。其中0位对应的是被按下键的行位置,然后转入第步。

将第步中的传送方向反转过来,即将列编程为输入线,行编程为输出线,使I/O口输出的数据为0F0H(即D7D41111D3D00000),然后读入I/O口数据,并送入内存(N+1)单元中存放,该数据的D7D4位中0电平对应的位是按下键的列位置。

3.通用并行扩展I/O口键盘接口

如果因扩展外围电路导致MCUI/O端口紧张,键盘接口就要通过通用I/O扩展芯片的I/O口线来构成,如81558255等。图8-21是由8155扩展I/O口构成的4×8的行列式键盘接口。

如果改成8255扩展口则其键盘电路接口以及键盘扫描子程序结构完全相似。硬件部分,同样可以使用PA口、PC口或其他口线,并在主程序中把列线设置成输出,行线设置输入。与8031的接口部分遵循8255扩展要求。软件部分可以完全套用图8-218155行列式键盘的扫描子程序。只要把程序中8155A口、C口地址改为8255的相应口线地址即可。

下面以图8-218155扩展I/O口组成的行列式键盘为例,介绍编程扫描工作方式的工作过程与键盘扫描子程序。从图8-21中可以看出,PA端口地址可以设为7F01HPC端口地址可以设为7F03H。如图8-22所示为键盘扫描子程序框图。

在该键盘中,键值与键号相一致,依次排列为031,共32个键,由一个8位口和一个4位口组成4×8的行列式键盘。

在键盘扫描子程序中完成下述几个功能。

1)判断键盘上有无键按下。其方法为:PA口输出全扫描字00H,读PC口状态,若PC0PC3为全1,则无按键按下;若不全为1,则有键按下。

2)去键的机械抖动影响。其方法是在判断有键按下后,软件延时一段时间再判断键盘状态,如果仍为有键按下状态,则认为有一个确定的键按下,否则按键抖动处理。

3)求按下键的键号。按照行列式键盘工作原理,图8-2132个键的键值应对应作如下分布(按PAPC口二进制代码,X为任意值)。

FEXE     FDXE     FBXE     F8XE      EFXE     DFXE     BFXE     7FXE

FEXD     FDXD     FBXD     F8XD     EFXD     DFXD     BFXD     7FXD

FEXB     FDXB     FBXB     F8XB      EFXB     DFXB     BFXB     7FXB

FEX8     FDX8     FBX8      F8X8      EFX8      DFX8     BFX8      7FX8

其相对应的键号如图8-21所示,这种顺序排列的键号按照行首键号与列号相加的办法处理,每行的行首键号依次为081624,列号依列线顺序为07。在上述键值中,从“0”电平对应的位可以找出行首键号与相应的列号。闭合的键号为:

N=行首键号+列号

4)键闭合一次仅进行一次键功能操作。其方法是等待键释放以后,再将键号送入累加器A中。

 

8-21  8155扩展I/O口组成的行列式键盘              8-22  键扫描子程序框图

子程序出口状态为(A=键号。

键盘扫描子程序清单如下所示(8155的初始化,置PA口为基本输出口、PC口为基本输入口,放在主程序中)。

KEY1:   ACALL   KS1             ;调用判断有无键按下子程序

JNZ     LK1             ;有键按下时,转消抖延时子程序

AJMP    KEY1            ;无键按下返回

LK1:   ACALL   T12ms           ;12ms延时子程序

ACALL   KS1             ;查有无键按下,若有则为键真实按下

JNZ     LK2             ;键按下(A≠0转逐行扫描

AJMP    KEY1            ;不是键按下返回

LK2:   MOV     R2,#0FEH        ;首列扫描字入R2

MOV     R3,#00H         ;首列号入R3

LK4:   MOV     DPTR,#7F01H     ;列扫描字送至8155PA

MOV     A,R2           

MOVX    @DPTR,A        

INC     DPTR            ;指向8155PC

INC     DPTR           

MOVX    A,@DPTR         ;8155PC口读入行状态

JB      ACC.0LONE     ;0行无键按下,转查第1

MOV     A,#00H          ;0行有键按下,该行首键号#00HA

AJMP    LKP             ;转求键号

LONE:   JB      ACC.1,LTHR      ;1行无键按下,转查第2

MOV     A#08H         ;1行有键按下,该行首键号#08HA

AJMP    LKP            

LTWO:   JB      ACC.2,LTHR      ;2行无键按下,转查第3

MOV     A,#10H          ;2行有键按下,该行首键号#10HA

AJMP    LKP            

LTHR:   JB      ACC.3,NEXT      ;3行无键按下,该查下一列

MOV     A,#18H          ;3行有键按下,该行首键号#18HA

LKP:   ADD     A,R4            ;求键号:键号=行首键号+列号

PUSH    ACC             ;键号进行栈保护

LK3:   ACALL   KSl             ;等待键释放

JNZ     LK3             ;未释放,等待

POP     ACC             ;键释放,键号为A

RET                     ;键扫描结束,出口状态(A=键号

NEXT:   INC     R4              ;列号加1

MOV     A,R2            ;判断8列扫描完没有

JNB     ACC.7,KND       ;8列扫描完返回

RL      A               ;扫描字左移一位,转变为下一列扫描字

MOV     R2,A            ;扫描字入R2

AJMP    LK4             ;转下一列扫描

KND:   AJMP    KY1            

KSl:   MOV     DPTR,#7F01H

MOV     A,#00H          ;全扫描字#00H

MOVX    @DPTRA        ;全扫描字入PA

INC     DPTR            ;指向PC

INC     DPTR           

MOVX    A,@DPTR         ;读入PC口行状态

CPL     A               ;变正逻辑,以高电平表示有键按下

ANL     A,#0FH          ;屏蔽高4

RET                     ;出口状态:(A≠0时有键按下

T12ms:   MOV     R7,#18H         ;延迟12ms子程序

TM:   MOV     R6,#0FFH   

TM6:   DJNZ    R6,TM6   

DJNZ    R7,TM      

RET