在前面的几次课里,我们讲了独立按键的使用,大家知道,独立按键的特点是一个按键要占用一个口位,如果按键比较多,用这种方法势必要占去较多宝贵的端口资源,如果还考虑诸如数码管的输出控制以及其他传感器的使用等等,很可能会使得端口资源不够用,毕竟我们用的这款单片机总共只有32个端口可用。为了节省资源,我们要在按键数量不减的前提下想办法缩减它占用端口的数量。这里我们给大家介绍一种称为“矩阵按键”的设计技术。
比如我需要使用16个按键,如果使用独立按键就得安排16个口位,但采用“矩阵按键”的设计技术则只需要8个口位,也就是一个端口就够用了。在我们的开发板上既有按键也有矩阵按键的设计,开发板总共有六排按键,从上到下前4排是矩阵按键,后两排是独立按键。这里的矩阵按键用的是P1口,它的电路设计原理图如图1所示。
图1矩阵按键的电路设计原理图 图2 矩阵按键与单片机端口的连接
比如我需要使用16个按键,如果使用独立按键就得安排16个口位,但采用“矩阵按键”的设计技术则只需要8个口位,也就是一个端口就够用了。在我们的开发板上既有按键也有矩阵按键的设计,开发板总共有六排按键,从上到下前4排是矩阵按键,后两排是独立按键。这里的矩阵按键用的是P1口,它的电路设计原理图如图2所示。
图中有4条横线和4条列线,我们把按键的两个脚就分别跨接到相互交叉位置的行线和列线之间,就像图1的右下角示意的样子。每条行线和列线都有两端,我们把其中的一端直接连接到单片机端口上,如图2所示,在另一端串一个上拉电阻挂到电源上,样子如图1所示。而且在图1中,我们排了16个按键,至于给这些按键取什么键名、按什么顺续等等都由你自己根据需要去设定的。我们这里就按从左到右、从上到下的顺序给这16个按键分别取名为0、1、2、3……9、A、B、C、D、E、F。
当按照图1设计好了按键的硬件电路以后,问题又来了:当我按下其中的某个按键,怎么让单片机知道我按下的就是那个按键呢?毕竟它不像独立按键那样直接查端口的信号状态就知道按键是否按下。矩阵按键的每个按键都是跨接在两个端口上的,这么说来,就需要相关的两个口位配合起来查。检测矩阵按键的方法有多种,我这里给大家介绍介绍矩阵按键的“反转法”按键识别。
从视频的讲解可以看出,反转发发查按键思路是:对端口先输出一组信号去查看按下的按键是在哪列,再输出另一组信号来查看按下的按键是在哪行,如果行和列都知道了,那么它的位置就确定了,也就是有唯一的键值来标识。我把它们列在下面,如表1所示。需要说明的是,如果有按键按下,我们也很容易得到这种状态的组合数为0xff。
表1 按键与信号的组合数表
| 按键 | 组合数 | 按键 | 按键 | 组合数 |
| K1 | 0xee | K9 | 0xeb | |
| K2 | 0xde | K10 | 0xdb | |
| K3 | 0xbe | K11 | 0xbb | |
| K4 | 0x7e | K12 | 0x7b | |
| K5 | 0xed | K13 | 0xe7 | |
| K6 | 0xdd | K14 | 0xd7 | |
| K7 | 0xbd | K15 | 0xb7 | |
| K8 | 0x7d | K16 | 0x77 | |
| 无按键按下的组合数为:0xff | ||||
有了这个表,我们就不必去纠结怎么计算按键在哪行那列了,因为它是一一对应的!下面我按照前面的设计给每个键配上键名和键值,如表2所示。
表2 为每个矩阵按键配给的键名和键值表
| 按键 | 组合数 | 键名 | 键值 | FAN | 按键 | 组合数 | 键名 | 键值 |
| K1 | 0xee | 0 | 0 | K9 | 0xeb | 8 | 8 | |
| K2 | 0xde | 1 | 1 | K10 | 0xdb | 9 | 9 | |
| K3 | 0xbe | 2 | 2 | K11 | 0xbb | A | 10 | |
| K4 | 0x7e | 3 | 3 | K12 | 0x7b | B | 11 | |
| K5 | 0xed | 4 | 4 | K13 | 0xe7 | C | 12 | |
| K6 | 0xdd | 5 | 5 | K14 | 0xd7 | D | 13 | |
| K7 | 0xbd | 6 | 6 | K15 | 0xb7 | E | 14 | |
| K8 | 0x7d | 7 | 7 | K16 | 0x77 | F | 15 | |
| 无按键按下的组合数为:0xff 键值也取:0xff | ||||||||

