3.4.2 按键与键盘矩阵原理

3.4.2 按键与键盘矩阵原理

1.键盘的构成

键盘是单片机系统中最常用的一种输入设备,数据、内存地址、命令及指令地址等都可以通过键盘输入系统。键盘接口按不同标准有不同分类方法。

根据按键接口是否进行硬件编码,键盘可分成编码键盘和非编码键盘。编码键盘能自动提供对应被按键的编码信息(如ASCII码),并能同时产生一个选通脉冲来通知微处理器,还具有处理抖动和多键串键的保护电路。这种键盘的优点是使用方便,但需要较多的硬件,价格较贵。非编码键盘全部工作都依靠程序来实现,包括按键的识别、按键代码的产生、消去抖动和防止串键等,所需的硬件较少,价格也便宜。单片机系统中主要采用非编码键盘方式。

此外,根据排布方式,键盘还可分成独立方式(一组相互独立的按键)和矩阵方式(以行列组成矩阵);根据读入键方式,键盘可分成直读方式和扫描方式;根据CPU响应方式,键盘可分成查询方式和中断方式。各种不同方式的键盘适用于不同的系统。当按键较少时,一般采用独立方式,而当按键较多时,采用矩阵方式。采用独立方式时,CPU响应方式可以是查询方式,也可以是中断方式;采用矩阵方式时,CPU响应方式一般是查询方式。

2.按键引起的弹跳(抖动)现象

常用键盘的按键实际上就是一个机械开关结构,被按下时,由于机械触点的弹性及电压突跳等原因,在触点闭合或断开的瞬间会出现电压弹跳(抖动)。如图3.17(a)所示,当键按下时,按键从开始接上至接触稳定要经过数毫秒的抖动时间,按键松开时也同样。这种抖动可能会引起一次按键被读入多次的情况,必须消除抖动。消除抖动有硬件或软件的方法,通常在键数较少时,可用硬件去抖动,如图3.17(b)所示的RS触发器,或用最简单的RC滤波器等。键数较多时,常用软件去抖动,在检测出键闭合后,执行一个延时程序来产生数毫秒的延时,让前沿抖动消失后再检测键的闭合;在检测到键松开后,也要进行数毫秒的延时,让后沿抖动消失后再检测下一次键的闭合。

图3.17 按键弹跳及反弹跳电路

3.键盘的确认及接口硬件、软件任务

从按键到键的功能被执行主要包括两项工作:一是键的识别,即在键盘中找出被按的是哪个键,二是键功能的实现。第一项工作使用接口电路实现,第二项工作通过执行中断服务程序或子程序来完成。此节只讨论第一项工作,即按键识别问题。

按键识别是以软硬件结合的方式来完成的,具体哪些由硬件完成,哪些由软件完成,要看键盘接口电路的情况。一般来说,硬件复杂,软件就简单,硬件简单,软件就会复杂。

键盘接口除了要用一定的方法消除按键抖动外,对于非编码键盘还应包含怎样识别键盘中所按键的含义(键码)等问题,综合起来主要问题如下。

(1)检测是否有键按下。

(2)若有键按下,判定是哪一个键。

(3)确定被按下的键的含义。

(4)反弹跳(去抖动)。

(5)不管一次按键持续的时间有多长,仅采用一个数据。

(6)防止串键。串键是指同时有一个以上的键被按下而造成的编码出错,不同的情况有不同的处理办法。

①“两键同时按下”时,最简单的处理方法是当只有一个键被按下时才读取键盘的输出,并且认为最后仍被按下的键是有效的键。这种方法常用于软件扫描键盘场合。另一种方法是当第一个键未松开时,按第二键不起作用。这种方法常借助于硬件来实现。

②“n个键同时按下”时,或者不理会所有被按下的键,直至只剩下一个键按下时为止;或者将键的信息存入内部键盘输入缓冲器,对其进行逐个处理,这种方法成本较高。

4.独立式键盘接口

独立式键盘接口采用直接读入方式工作,直接读入方式键盘接口是一个输入接口,输入接口主要功能是解决数据输入的缓冲(选通)问题。

1)直接由单片机I/O输入

独立式键盘实际上就是一组独立的按键,这些按键一端直接与单片机的I/O口连接,每个按键独占一条I/O口线,单片机的输入口线经电阻接+5V电源,键盘的另一端接地,无键按下时单片机的输入口线状态皆为高电平,当有键按下时,该键对应单片机的输入口变为低电平,即可判定按键的位置。

按键开关是利用机械触点的闭合或断开实现电路转换的开关。

如图3.18所示,按下开关将导致输入端口的电压由Vcc变为0V。其中,图3.18(a)适用于对接内部有上拉电阻的端口引脚,图3.18(b)适用于对接内部没有上拉电阻的端口引脚,如本电路所用到的P0口。

图3.18 按键开关在端口的连接

所有机械开关的触点在闭合或断开时都会产生抖动。抖动时间长短和开关的机械特性有关,一般为5~10 ms。

为了确保单片机对一次按键动作只确认一次按键有效,必须消除按键抖动的影响。消除按键抖动可以采用硬件消抖和软件消抖的办法。

软件消抖采取的办法是:延时消抖,检测到有键被按下时,延时10 ms后再读取对应的P0.n引脚,如果第二次和第一次读取的结果一致,那么认为该键确实被按下了。

2)用TTL电路作为输入接口

当单片机的I/O口不能满足键盘输入需要时,就要进行I/O扩展,最简单的I/O扩展是使用中小规模集成电路芯片。按键的识别,可采用查询方式实现,根据按键码,执行相应子程序,从而完成相应的键功能。

若采用中断控制传送方式进行简单的键盘输入口扩展,当有键被按下时,产生中断请求,CPU响应中断,执行中断服务程序来完成键功能。

5.矩阵键盘接口

当非编码键盘的按键较多,采用独立式键盘占用I/O口线太多时,可采用矩阵式(也称为行列式)键盘。行列式键盘用m条I/O口线组成行输入口,用n条I/O口线组成列输出口,在行列线的每一个交点处,设置一个按键,组成一个矩阵,如图3.19所示。矩阵键盘所需要的连线数为行数+列数,如4×4的16键矩阵键盘需要8条线与单片机相连。

1)矩阵键盘扫描原理

矩阵键盘接口一般采用扫描读入方式工作,扫描式键盘接口是一个输入/输出口,行是输入口,而列是输出口,输入口的主要功能是解决数据输入的缓冲(选通)问题,而输出口的主要功能是进行数据保持能力(锁存)。

图3.19 4×4矩阵键盘与对应的键编码

图3.19所示的为一个4×4的矩阵键盘电路逻辑图,为判定有无键被按下(闭合键)及被按下的键的位置,可使用的方法有扫描法和翻转法两种,其中以扫描法使用较为普遍。因此以扫描法为例,说明查找闭合键的方法。

2)扫描法识别键盘的步骤

(1)首次是判断有无键被按下。依次拉低行线(或列线),检查各列线(或行线)电平的变化,如果某列线(或行线)电平由高变平变为低电平,则可确定此行与交叉点处的键被按下。

(2)去抖动。经扫描确定有键按下后,紧接着要进行去抖动处理。一般为简单起见多采用软件延时的方法,调用软件延时程序(延时10 ms),然后再判断键盘状态,如果两次判断得到的闭合键一致,则认为有一个确定的键被按下了,否则当作按键抖动处理,根据闭合键所在的行和列推算按键的键号。

(3)键码计算。按键确定之后,下一步是计算闭合键的键码,并通过跳转指令(如JMP指令)把程序转到闭合键所对应的子程序,进行字符、数据的输入或命令的处理。若直接使用该闭合键的行、列值组合产生键码,这样会使各子程序的入口地址比较散乱,给JMP指令的使用带来不便。所以通常都是以键的排列顺序安排键号,图3.19所示的键号是按从左到右从上向下的顺序编排的。这样安排,使键码既可以根据行号查表求得,也可以通过计算得到。按图3.19所示的键码编排规律,各行首键号依次是00H、04H、08H、0CH,如列号按0~3顺序,则键码的计算公式为

键码=行首键号+列号

根据键号定义的功能对键值进行相应的处理。

在这种矩阵式非编码键盘的单片机系统中,对键的识别通常采用两步扫描判别法。下面说明两步扫描判别法识别是哪一个键被按下的工作过程。

首先判别按键所在的行,由单片机P0口向键盘传送(输出)列扫描字,然后读入(输入)行线状态。其方法是:向P0口输出0FH,即列线(图3.19所示的垂直线P0.4~P0.7)输出全0,行线(图3.19所示的平行线P0.0~P0.3)输出全1,然后将P0口低4位(行线)的电平状态读到一个临时变量x_temp中。如果有键按下,总会有一条行线被拉至低电平,从而使行输入不全为1。在图3.19中,对应P0.2为低电平,即x_temp=0x0B。

然后判别按键所在的列,由单片机P0口向键盘传送(输出)行扫描字,然后读入(输入)列线状态。其方法是:向P0口输出F0H,即行线(图3.19所示平行线P0.O~PO.3)输出全0,列线(图3.19所示的垂直线P0.4~P0.7)输出全1,然后将P0口高4位(列线)的电平状态读到一个临时变量y_temp中。如果有键按下,总会有一条列线被拉至低电平,从而使行输入不全为1。在图3.19中,对应P0.6为低电平,即y_temp=0xB0。

将行和列的状态“或”运算得到OxBB,再把该值取反得到该位置键值位0x44,对应的二进制数为01000100B。如表3.1所示,该键值对应第3行第3列的按键。

表3.1 键值与行列对应关系

同理,求出上述16个位置的键值如表3.2所示。这种键盘的键值表示方式分散度大且不等距,还需要进一步的程序处理,依次排列键值。

表3.2 行列式键盘键值

(4)等待键释放。为了保证键的一次闭合仅进行一次处理,计算键码后,延时等待键释放。

总结上述内容,键处理的流程如图3.20所示。

图3.20 键处理的流程图