矩阵键盘是一种常用于Arduino项目中输入数字数据的设备。以手头的矩阵键盘为例,它是一个"4行x3列"的键盘,共有12个按键和7个引脚。这些引脚分别对应行和列。可以通过以下链接找到键盘的数据手册。对于键盘,按键与其对应的<行引脚,列引脚>对如下:
按键:行引脚 + 列引脚 1: 2 + 3 2: 2 + 1 3: 2 + 5 4: 7 + 3 5: 7 + 1 6: 7 + 5 7: 6 + 3 8: 6 + 1 9: 6 + 5 *: 4 + 3 0: 4 + 1 #: 4 + 5
当按下一个键,比如"1",其对应的引脚就会短路。也就是说,当给定按键的行引脚信号时,可以从该键的列引脚读取相同的值,反之亦然。如果按下键盘上的"1",会看到引脚2和3被短路。
正如注意到的,键[1..3]共享同一个行引脚,即引脚2,而键[1,4,7,*]共享同一个列引脚,即引脚3。
键盘可能在按键数量、引脚数量以及按键与引脚的映射上与不同。因此,如果有一个键盘并且没有任何文档,应该首先使用万用表找出按键与引脚之间的关系。
在本节中,将尝试以键盘为例,解释如何将矩阵键盘连接到Arduino板上。键盘结构可能与不同,但同样的规则适用。
键盘上有7个引脚,因此将Arduino板上从2到8的7个数字引脚专门用于此。首先,将键盘的行引脚连接到Arduino上。但要注意引脚的顺序。键盘的行1引脚(即引脚2)将连接到Arduino的数字引脚2,依此类推。键盘的所有连接如下:
键盘引脚 => Arduino数字引脚 2 (行1) => 2 7 (行2) => 3 6 (行3) => 4 4 (行4) => 5 3 (列1) => 6 1 (列2) => 7 5 (列3) => 8
现在,已经准备好测试库了。别忘了,默认配置是按照上面解释的键盘。如果键盘与不同,硬件设置和软件配置必须适应。如何进行新的软件配置在基本使用下面解释。
对矩阵键盘有什么期望?简单。哪个键被按下,哪个键被释放?
让开始吧。
当将库放入Arduino IDE的库文件夹中时,就可以使用它了。首先,包含库并创建一个实例。
#include
Keypad2 kp(1);
// 创建默认键盘。
在设置中,指定回调函数用于按下和释放事件。
void setup() {
Serial.begin(9600);
// 初始化串行
kp.setPressCallback(kpPressCallback);
// 设置键盘回调函数
}
回调函数的实现:
void kpPressCallback(char c, uint8_t state) {
Serial.print(c);
Serial.print("\n");
Serial.print(state == KP2_KEYUP ? "up" : "down");
Serial.println();
}
别忘了在主循环中监控键盘。
void loop() {
kp.update();
}
键盘可能没有与默认的布局(按键数量、引脚、按键&引脚关系)相同。当然,在这种情况下,必须通过调用setLayout函数提供新的配置。其原型在头文件中:
// 初始化硬件布局,键盘和Arduino
// 如果没有调用,默认布局应在构造函数中使用
// 参数:
// 1-行数
// 2-列数
// 3-键盘布局
// 4-按键状态(每个键2位)
// 5-行引脚
// 6-列引脚
// 7-内部上拉使用(0为外部上拉)
void setLayout(int rowc, int colc, char **layout, uint8_t *keyState, int *rowp, int *colp, uint8_t useInternalPullup);
库的默认配置(描述键盘):
// 默认布局
const char kp2DefaultLayout[4][3] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
// 每个键2位存储其状态
// 12*2/8 = 3字节用于默认布局
const uint8_t kp2DefaultStateHolder[3] = {0, 0, 0};
const int kp2RowPins[4] = {2, 3, 4, 5};
// 分别连接到键盘引脚2,7,6,4
const int kp2ColPins[3] = {6, 7, 8};
// 分别连接到键盘引脚3,1,5
// 默认布局结束
当在本节开始时用1(true)调用构造函数时,幕后所做的就是用默认参数调用setLayout函数,如下所示:
if (useDefaultLayout) {
this->setLayout(4, 3, (char **)kp2DefaultLayout, (uint8_t *)kp2DefaultStateHolder, (int *)kp2RowPins, (int *)kp2ColPins, 1);
}
如果配置与默认配置不同,必须用适当的参数调用setLayout函数。在这种情况下,会做的是:
- 从头文件复制默认值并粘贴到代码中:)
- 根据新键盘编辑默认值
- 重命名参数名称
让研究一个例子。假设键盘是一个带有十六进制值的矩阵键盘。4x4十六进制矩阵键盘就是这样的:
1 | 2 | 3 | 4
5 | 6 | 7 | 8
9 | 0 | A | B
C | D | E | F
因此必须有8个引脚用于4行和4列。假设引脚与行&列的关系如下:
引脚 | 行/列 1 | row1 2 | row3 3 | row2 4 | row4 5 | col2 6 | col4 7 | col1 8 | col3
必须在Arduino板上分配8个数字引脚。假设引脚[2..9]被分配。参数应该是:
// 十六进制键盘布局
const char layout[4][4] = {
{'1', '2', '3', '4'},
{'5', '6', '7', '8'},
{'9', '0', 'A', 'B'},
{'C', 'D', 'E', 'F'}
};
// 每个键2位存储其状态
// 16*2/8 = 4字节用于状态
const uint8_t stateHolder[4] = {0, 0, 0, 0};
const int rowPins[4] = {2, 3, 4, 5};
// 分别连接到键盘引脚1,3,2,4
const int colPins[4] = {6, 7, 8, 9};
// 分别连接到键盘引脚7,5,8,6
// 十六进制键盘布局结束
已经准备好了硬件,进行了连接,准备了布局配置,准备创建一个实例:
#include
Keypad2 kp(0);
// 将配置为十六进制键盘
在设置函数中,调用setLayout:
this->setLayout(4, 4, (char **)layout, (uint8_t *)stateHolder, (int *)rowPins, (int *)colPins, 1);
就是这样。已经准备好使用十六进制键盘了。作为一个注释,stateHolder是内部使用的。只是给库一些内存来追踪按键。
看到了很多关于矩阵键盘的上拉和在电路上放置它们的讨论。实际上,不需要它们,只需使用内置的上拉!
按键检测算法是'扫描行和列'。正如在介绍部分所说的,当按下一个键时,行和列引脚就会短路。通过将行引脚设置为INPUT,列引脚设置为OUTPUT,可以试着给每个列信号并从每个行读取。如果从行读取到相同的值,那就意味着它们对应的键被按下了,否则就释放了。