两个IO端口连接一个矩阵键盘

使用两个I/O端口连接4×3的矩阵键盘

矩阵键盘是微处理器基本的输入设备,搭建一个矩阵键盘最常规的方法需要使用多个微处理器I/O端口,然后往MCU中编写一个扫描算法程序来识别是哪一个键被按下。这种方法的一个缺点是它需要大量的I/O端口。例如,要连接一个4×3的矩阵键盘需要7个数字I/O引脚。当MCU的端口少或者不够用时就出问题了。
针对这个问题有两种可行的解决方案:很容易想到使用I/O扩展芯片或者用电阻网络分配一个唯一的电压值给每一个按键,然后使用一个模拟引脚来读取电压值来确定是哪一个按键被按下。每个解决方法都有自己的缺点。
因多数I/O扩展需要一个特殊的通讯协议(例如:I2C或SPI)来完成读写数据的操作,MCU得有相关的通信模型来支持,或者用户必须编写实现相关的通讯协议程序,这明显会增加处理器的系统开销。另外,使用电阻网络给每一个按键分配唯一的电压的缺点是当需要很多按键时,电压之间分布紧凑,一旦温度发生变化将会导致误读。再者开关的抖动在其中也起很大的作用,这种方法的另一个最主要的不足是:我们使用的MCU必须有模拟输入引脚。
下面介绍的这种方法可以克服以上所有的问题并且还有很多优点:无论连接多大规模的键盘只需要2个I/O端口;不需要特殊的通讯协议;也无需模拟输入端口。这个设计思路基于两片非常通用且便宜的CD4017计数器。

图1展示4×3矩阵键盘的电路原理图。
R1,R4,R5和R6用于限流,R7,D4,D5,D6组成一个或门。

图2描述了如何读取4×3矩阵键盘的键值。
一个计数器用于控制键盘的行,另一个用于控制键盘的列。
MCU产生一个时钟脉冲信号作为计数器的脉冲输入来控制键盘的列。开始时,行计数器和列计数器的0号输出端口都是高电平,由于不断接受到脉冲信号列计数器的计数值增加。当接受到第四个时钟脉冲时,列计数器复位同时以此作为一个脉冲来控制行计数器。每次列计数器复位,行计数器的计数值增加直到接收到第五个脉冲时复位。在产生脉冲信号的同时MCU应该设置一个计数变量给脉冲计数。键盘的输出端接到MCU的一个外部中断引脚。
只有当一个按键被按下,这时按键所对应的行列都处在低电平,才会触发中断。如果行列中只有一个处在低电平不会触发中断。
当中断发生时,这时MCU读取计数值,根据计数值来判断是哪一个位置的按键被按下。
MCU中的时钟计数变量,随脉冲的产生而递增,它的数值与按键的次序对应,流程图见图2。
注意,尽管这个示例展示了一个4×3的矩阵键盘,通过利用4017其他的输出端口,你可以最多读取一个10×10的键盘。另外你也可以根据需要,级联更多的4017来扩展更大的规模的矩阵键盘。
本文来自果壳网