矩阵键盘的工作原理和扫描确认方式

当键盘中按键数量较多时,为了减少对 I/O 口的占用,通常将按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图 9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行或列线上的电平变化可以确定哪个按键被按下。 
图 9-7 为一个 4 x 3 的行列结构,可以构成 12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个 16 键的键盘。很明显,在按键数量多的场合,矩阵键盘与独立式按键键盘相比可以节省很多的 I/O 口线。 
  矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态,因此会大量占用 MCU 的时间,所以较好的方式也是采用状态机的方法来设计,尽量减少键盘查询过程对 MCU 的占用时间。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4x4矩阵键盘是由16个按键组成的,它们被排列在一个4行4列的矩阵中。为了检测按键,我们需要使用一种称为“扫描”的技术。 在扫描过程中,我们将矩阵的每一行和每一列都连接到控制器的不同引脚上。我们首先将所有行的引脚设置为输出状态,并将它们全部设置为高电平。然后,我们逐个检查每一列的引脚,如果检测到低电平信号,则说明该列中有一个按键被按下。 接下来,我们将所有列的引脚设置为输出状态,并将它们全部设置为高电平。然后,我们逐个检查每一行的引脚,如果检测到低电平信号,则说明该行中有一个按键被按下。 通过这种方式,我们可以检测到任何按键是否被按下,而且可以确定它的位置,因为每个按键都有一个唯一的行列组合。 下面是一个简单的矩阵键盘扫描程序示例: ```C++ #define ROWS 4 #define COLS 4 int rowPins[ROWS] = { 1, 2, 3, 4 }; int colPins[COLS] = { 5, 6, 7, 8 }; char keys[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; void setup() { // 初始化行引脚 for (int i = 0; i < ROWS; i++) { pinMode(rowPins[i], OUTPUT); digitalWrite(rowPins[i], HIGH); } // 初始化列引脚 for (int i = 0; i < COLS; i++) { pinMode(colPins[i], INPUT_PULLUP); } } void loop() { // 扫描每一列 for (int col = 0; col < COLS; col++) { // 将当前列设置为低电平 pinMode(colPins[col], OUTPUT); digitalWrite(colPins[col], LOW); // 扫描每一行 for (int row = 0; row < ROWS; row++) { // 检查当前行是否有按键按下 if (digitalRead(rowPins[row]) == LOW) { // 返回按键值 char key = keys[row][col]; Serial.print(key); } } // 将当前列恢复为高电平 pinMode(colPins[col], INPUT_PULLUP); } } ``` 这个程序通过循环遍历每一列和每一行来扫描矩阵键盘,如果检测到按键被按下,则返回对应的按键值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值