键盘矩阵
- 键盘矩阵是由多个按键组成的矩阵,这些按键排列在行和列之间。在键盘矩阵中,每个按键的位置由其所在的行和列决定。当按键被按下时,相应的行和列会被检测到,从而确定被按下的按键的位置。
键盘矩阵代码
我的想法是直接读取
方法一
#include <REGX52.H> // STC89C52单片机头文件
#define uchar unsigned char
#define uint unsigned int
#define KEYS_PER_ROW 4 // 每行按键个数预留定义
#define ROWS 4 // 键盘行数
// 定义键盘矩阵的行列位置
int keypad[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// 键值对应数据,方便扫描判断
unsigned char keypad_data[4][4] = {
{0x31, 0x32, 0x33, 0x41},
{0x34, 0x35, 0x36, 0x42},
{0x37, 0x38, 0x39, 0x43},
{0x2A, 0x30, 0x23, 0x44},
};
// 延时函数,用于键盘扫描去抖动
void delayms(uint ms){
uint i;
while(ms--)
for(i = 0;i < 123;i++);
}
// 键盘扫描函数
int keyscan()
{
// 记录上一次扫描值
static int scan = 0xff;
int i,j;
// 当扫描值变化时进行判断
if (scan != P3) {
for (i = 0; i < ROWS; ++i) {
for (j = 0; j < KEYS_PER_ROW; ++j) {
// 遍历按键值矩阵,找到与扫描值相同的键
if (scan == keypad_data[i][j])
return keypad[i][j]; // 返回键盘矩阵中的键值
}
}
}
// 恢复扫描值
scan = P3 = 0xff;
delayms(3); // 去抖动
scan = P3;
return '\0'; // 无键按下时返回0
}
void main()
{
int key_id = '\0';
// 循环调用扫描函数
while(1){
key_id = keyscan();
}
}
代码解释:
包含头文件<REGX52.H>:这是一个STC89C52单片机的头文件。
定义宏uchar和uint:它们分别表示无符号字符和无符号整数。
定义键盘矩阵的行列位置:这里定义了一个4x4的键盘矩阵,每个元素是一个字符,代表一个按键。例如,第一行代表键盘的’1’,‘2’,‘3’和’A’键。
定义键值对应数据:这里定义了一个和键盘矩阵同样大小的数组,用来存储每个按键对应的编码值。例如,‘1’对应于0x31。
定义延时函数delayms:这个函数用来产生毫秒级别的延时,用于键盘扫描时的去抖动。
定义键盘扫描函数keyscan:这个函数用来扫描键盘,当扫描值变化时,遍历按键值矩阵,找到与扫描值相同的键,并返回这个键的值。如果找不到对应的键,或者上一次扫描的值和这次相同(即没有键被按下),那么就返回空字符’\0’。
主函数main:在这个函数中,使用一个无限循环来调用键盘扫描函数。当有键被按下时,扫描函数会返回对应的键值,这个值会被存储在key_id变量中。如果没有键被按下,那么key_id将保持为空字符’\0’。
这个程序的主要功能是读取用户的键盘输入,当有键被按下时,它会把对应的键值存储起来,然后可以用来驱动其他设备或者执行特定的操作。