矩阵键盘在Arduino项目中的应用

矩阵键盘是一种常用于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,可以试着给每个列信号并从每个行读取。如果从行读取到相同的值,那就意味着它们对应的键被按下了,否则就释放了。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485