单片机矩阵键盘原理图及代码详解(单片机矩阵键盘实验报告)

矩阵键盘原理

矩阵键盘是由多个按键组成的,在单片机应用中常用于输入控制和菜单选择。在矩阵键盘中,每个按键被排列在矩阵状的列表中。行和列被连到单片机的GPIO端口上,按键被映射到对应的行和列上。因此,只要单片机扫描每个行,然后读取每个列的状态,就可以获得按键的按下状态。

假设单片机有N行和M列,那么按键矩阵中共有NxM个开关可以控制,每个开关可以连接到单片机的一个GPIO引脚上。在矩阵键盘中,只有一个按键被按下,该按键的行和列即被短接。

为了避免GPIO引脚的数量过多,可将几个行和列连接到同一组GPIO引脚上。当单片机扫描每个行时,将此组GPIO引脚设置为输出,并将该行连接到此组GPIO引脚。然后,单片机逐个地读每个列的输入状态,以便确定哪个按键被按下。此时,将该组GPIO引脚设置为输入,同时将下一个行连接到该组GPIO引脚。因此,通过逐个控制行和列的方式,可以轻松地实现矩阵键盘。

矩阵键盘原理图

矩阵键盘的原理图分为两个部分:输入部分和输出部分。输入部分包括行扫描,输出部分包括列扫描。

在输入部分,M个列以及每个列中的一个开关被接到单片机的M个GPIO引脚上。另外的N个行接到N个外部电阻上,以便将N行和1个GPIO引脚连接起来。这个GPIO引脚分别在每个行扫描的过程中输出0电平,以启用对应行的输入。

在输出部分,N个行、每个行中的开关、以及外部电阻被接到N个GPIO引脚上。这些引脚被设置成输入状态,并且每个GPIO引脚逐个地获取行数据。如果某个引脚读取到了逻辑高电平,那么这个开关就被按下了。

代码详解

实现矩阵键盘扫描需要一些代码。首先,需要枚举每个行,并将其连接到矩阵键盘的某个行。连接状态会被输出到单片机的GPIO端口上。接下来,需要读取矩阵键盘的每个列,以便检测是否有按键按下。最后,要把行扫描信号切换到下一个行。

单片机矩阵键盘原理图及代码详解(单片机矩阵键盘实验报告)

下面是一个简单的示例程序,可以用于扫描一个4×4的矩阵键盘:

```
#include

unsigned char code KEYTable[] = { // key value table
0x44, 0x43, 0x42, 0x41, // row 0 (P4.4-P4.7)
0x34, 0x33, 0x32, 0x31, // row 1 (P3.4-P3.7)
0x24, 0x23, 0x22, 0x21, // row 2 (P2.4-P2.7)
0x14, 0x13, 0x12, 0x11 // row 3 (P1.4-P1.7)
};

#define LatchPort P0
#define RowsPort P2

void Delay10ms(void) {
unsigned char i, j;

i = 58;
j = 170;
do
{
while (--j);
} while (--i);
}

unsigned char GetKey(void) { // get key value
unsigned char RowsVal, ColsVal, rowIndex;

for (rowIndex = 0; rowIndex < 4; rowIndex++) { // scan rows
RowsPort = ~(1 << rowIndex); // set row active
ColsVal = LatchPort; // read columns
if (ColsVal != 0xFF) break; // check if any key is pressed
}
RowsPort = 0x00; // reset row state to idle

if (rowIndex == 4) return 0xFF; // no key pressed

// find which key is pressed and return its value
ColsVal = ~(ColsVal);
RowsVal = KEYTable[rowIndex];
return RowsVal & ColsVal;
}

void main() {
unsigned char keyVal;

while (1) {
keyVal = GetKey();
if (keyVal != 0xFF) { // check if any key is pressed
P0 = keyVal; // set key value to P0
Delay10ms();
while (GetKey() != 0xFF); // wait for key release
}
}
}
```

在这个代码中,矩阵键盘的每个按键代表一个键值。将这些键值保存在数组KEYTable中。在主程序中,首先定义了一个变量keyVal,它用于存储检测到的按键值。然后运行一个while循环,该循环不断扫描矩阵键盘,并检测是否有按键按下。

实际上,整个程序的关键是GetKey()函数。它的工作方式如下:

在该函数内部,首先将行作为输入标志传递到RowsPort,以启用单片机GPIO端口。然后,读取LatchPort值,以检查每个列中是否有按键按下。如果检测到按键按下,ColsVal即包含一个值(bits为0),表示按下了一个按键。此时,RowsPort被重置为零,以便返回输入状态。

然后,如果没有任何数据从GetKey函数返回,则表示没有按键被按下。

如果键被按下,则按键值被传递到P0中,同时延迟10毫秒,以等待按键抖动消失。在等待期间,检测到的按键值持续存储在keyVal变量中。如果在等待期间持续检测到按键,则退出while循环并返回到矩阵键盘扫描循环。

该示例程序只是一个简单的例子,无法用于实际的应用程序。但是,它演示了如何使用单片机来实现矩阵扫描,这是构建更高级电路和应用的重要基础。

本文来自投稿,不代表亲测学习网立场,如若转载,请注明出处:https://www.qince.net/mcu4lf.html

郑重声明:

本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。 若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。

我们不承担任何技术及版权问题,且不对任何资源负法律责任。

如遇到资源无法下载,请点击这里失效报错。失效报错提交后记得查看你的留言信息,24小时之内反馈信息。

如有侵犯您的版权,请给我们私信,我们会尽快处理,并诚恳的向你道歉!

(0)
上一篇 2023年4月25日 下午7:59
下一篇 2023年4月25日 下午8:00

猜你喜欢