3.5 矩阵式键盘的识别

矩阵式键盘由多个键排列而成,键开关被排列成M(行)×N(列)的矩阵结构,每个键开关位于行和列的交叉处。其连接示意图如图3-20所示。

图3-20 矩阵式键盘工作原理示意图

课件 矩阵式键盘扫描与识别方法

视频 矩阵式键盘扫描与识别方法

图3-20所展示的是4×4矩阵式键盘,共有16个键位,只用了P1口的8根口线[一般来讲M(行)×N(列)矩阵式键盘所需要的口线数为M+N条]。与独立式键盘相比,更加节省系统的I/O口资源。无论是独立式键盘还是矩阵式键盘,其检测方法都是通过检测对应口线是否为低电平来判断按键是否被按下。但是矩阵式键盘的检测要比独立式键盘复杂得多。

矩阵式键盘的检测主要有两种方法:一种是逐行扫描法;另一种是行列反转法。

1.逐行扫描法

观察图3-20所示的4×4矩阵式键盘,可以看到,在接口电路中有4条行线和4条列线分别接到每个按键开关的左右两端。其中,4条行线的连接口线工作在输出方式,4条列线的连接口线工作在输入方式。

图3-21 逐行扫描法的工作流程

逐行扫描法的工作流程如图3-21所示。

首先CPU对4条行线置0,然后CPU从列线上读入数据,若读入的数据全为1,表示无键按下,则结束扫描。只要读入的数据中有一个不为1,则表示有键被按下。

接着,CPU先使第0行为0,其余3行为1,读入全部列,若全为1,表示按键不在此行;接着向下扫描,使第1行为0,其余各行为1,再读入全部列,若全为1,表示按键不在此列;然后重复上述步骤。直至第N行为0时,第M列也为0,则表明该按键位于第N行第M列。

2.行列反转法

使用逐行扫描法需要进行整个键盘的多次扫描,判断过程较为复杂。使用行列反转法可以克服这些问题,并加快按键的检测速度。

使用行列反转法的步骤如下:

(1)使矩阵式键盘连接行线的口线工作在输出方式,连接列线的口线工作在输入方式。CPU先向全部行线上输出0,然后读取列线上的电平。若有按键被按下,必然有一个列线为低电平;否则,表示没有按键被按下,不必再进行检测。

(2)若检测到某个列线为低电平之后,重新设置键盘行线的连接口线工作于输入方式,列线工作于输出方式,并将刚刚得到的列线值再次从列线上输出,此时检测所有行线上的电平,必然得到一个行线为低电平的行线值。

(3)将得到的行线值与列线值组合在一起,即为该按键的编码值。将得到的键值与事先准备好的所有按键的键值编码比较,就知道哪个按键被按下了。

比如第2行第3列的按键被按下,采用行列反转法,其工作过程见表3-3。

表3-3 行列反转法工作过程表

【课堂练习】4×3矩阵式键盘的行列反转法检测。使用4×3矩阵式键盘与51单片机的P1口相连,按键后,在共阴极数码管上会显示所按键位代表的数字。电路连接如图3-22所示。

图3-22 编码键盘的使用

【分析】这里使用的是自定义的4×3矩阵式键盘,其内部结构与普通的4×4矩阵式键盘基本一样,只是少了一列。使用行列反转法进行键盘扫描,先画出键盘连接的示意图如图3-22所示。下面仍以4×4矩阵式键盘为例进行分析,只是在计算结果时要去掉最右侧一列。现在假设按下的键位是数字5这个键,先使P1口的值为0xf0(即低4位接行检测线,高4位接列检测线)。数字5键按下后,P1.1与P1.5连通,P1.1原为低电平,因此P1.5也变成了低电平,其他的不变。此时,获取列检测线上的值为1101B并保存起来。接着改变P1口的输入/输出状态,将低4位变为输出,高4位变为输入;然后将刚获取的列检测线值,输入P1口的高4位,同样因为P1.1与P1.5已经相连,所以瞬间P1.1也由原来的高电平变为低电平,其他各口线不改变,此时获取行检测线上的值为1101B。现在将获取到的列检测线值和行检测线值组合在一起,形成1字节,即11011101B,转换成十六进制为0xdd,这就是数字5键对应的键盘编码值。按照上面的分析,写出该键盘上各键的编码值,见表3-4。在程序中只要将获取到的编码与表3-4进行比较即可得到该次按键的键名所代表的数值。

表3-4 4×3矩阵式键盘的编码表

要将按键对应的键名数值在数码管上显示出来,还需要为数码管设定一下段选码表,将段选码表与键盘的键名数字在位置上一一对应起来,就可以实现按下某一键,立刻在数码管上显示出相应的数字来。

参考程序如下:

程序中scanKey( )这个函数就是行列反转法的代码实现,该函数返回的数值就是当前按键值在整个键盘编码中的位置,结合数码管模块的动态显示程序,能实现更多、更复杂信息的录入显示功能。