背景介绍:
4*4矩阵键盘
8 根线能获取 16 个键的状态,在需要多个按键的场合特别适用。
Sugar 因授课需要在网上查了不少讲解矩阵键盘的资料,觉得可以再努努力让这个知识更易懂一点。
下面就来看看 Sugar 怎么努力的吧。
矩阵键盘是什么
矩阵键盘就是按一定规律连在一起的一堆开关。
Sugar 从深圳优信电子买到的矩阵键盘长成这样的(Sugar 买过不少散电子元件,优信从未出过错,所以在这里提个名)。
这一堆开关的连接情况是这样的:
矩阵键盘怎么用
矩阵键盘需要接到单片机上用。
一、怎么连线
网上能找到的是接到 STM32、Arduino 和 C51 单片机上的。Sugar 今天给出个不同的:接到 ESP8266 物联网模块上用。接法如下图:
实物连接如下图:
注意:GPIO16 在 ESP8266 内部没有上拉电阻,所以要外接上拉电阻,上图中 Sugar 接了一个 10k 的色环电阻当作 GPIO16 的上拉电阻。其余接口(GPIO12、GPIO13、GPIO14)可配置内部上拉,配置方式是(以 Arduino 开发为例):
pinMode(12, INPUT_PULLUP);
pinMode(13, INPUT_PULLUP);
pinMode(14, INPUT_PULLUP);
二、怎么使用
1、默认状态下,让输出口统一输出低电平,如下图:
不难看出行引脚(1、2、3、4 引脚)都是低电平,因为没有按键按下,所以列引脚(5、6、7、8 引脚)被上拉都是高电平。这样在读取 GPIO12、GPIO13、GPIO14、GPIO16 的时候都会读到高电平。
2、当有按键被按住的时候(例如按下 K7)如下:
聪明的你一定会发现,按矩阵键盘的连接方式,不论按下 K3、K7、K11 或 K15 都会导致 GPIO14 读到低电平。也就是说在 GPIO14 读到低电平时并不能确定是哪一行的按键被按住了,所以需要进一步操作来确认:究竟是哪一行的按键被按住了。
3、逐行扫描确定按键的方法是:输出端(GPIO4、GPIO0、GPIO2 和 GPIO15)依次输出低电平,每次输出后都去读一下输入端,直到输入端读到低电平为止。系列图示如下:
我们看到在逐行扫描过程中,只有当扫描到被按住的键所在行列的时候,输入端才会读到低电平。那么我们就可以通过记录行号
和列号
来确定是哪一个键被按住了。
把上面的图片连起来,整体的过程是这样的:
怎么编程
Sugar 在 VSCode 下使用 platformio 写代码,用的是 Arduino 库。
为了避免像很多网上的程序那样使用过多的移位操作,Sugar 使用 union struct
的方式来标记行号
与列号
,如下:
typedef union{
struct{
uint8_t r1 : 1;
uint8_t r2 : 1;
uint8_t r3 : 1;
uint8_t r4 : 1;
uint8_t c1 :<