TX-1C 51 单片机开发板学习】第 5 讲-独立键盘、矩阵键盘检测原理与实现
最编程
2024-04-13 22:47:29
...
键盘的分类
- 编码键盘
键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘.
- 非编码键盘
而靠软件编程来识别的称为非编码键盘;在单片机组成的各种系统中,用的最多的是非编码键盘。也有用到编码键盘的。
非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。
TX-1C单片机键盘电路
键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘.
而靠软件编程来识别的称为非编码键盘;在单片机组成的各种系统中,用的最多的是非编码键盘。也有用到编码键盘的。
非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。
4个独立按键
4个独立按键: S2-S5
按键 | 标识 | 接口 |
---|---|---|
S2 | LCDEN | P3_4 |
S3 | RS | P3_5 |
S4 | WR | P3_6 |
S5 | RD | P3_7 |
矩阵键盘
注意:实际上板子上的矩阵键盘是接在P3口
代码实现
以下为练手代码,未完全按课程抄写,代码在SDCC环境下编译(与keil环境和语法有差异,keil不能直接编译),完整代码需要参考git仓库。 -> 代码地址
点击直接点亮LED
//点击直接点亮LED
void keybord_show_led(void)
{
unsigned char p3Value;
while (1)
{
//将P3口直接输入给P1 LED口
//键盘s2-s5直连的d5-d8
p3Value = P3;
P1 = p3Value;
}
}
循环显示数字
//循环显示数字
void keybord_show_num(void)
{
P0 = 0x2B; //101011B
P2_7 = 1; //开启位选 //低电位显示,数码管位置与二进制是反的
P2_7 = 0; //关闭位选
char i = 0;
do
{
P0 = TBL_DIGITAL_DISPALY[i];
P2_6 = 1; //开启段选
P2_6 = 0; //关闭段选
//以下两阻塞模拟按键按下抬起的操作
//P3_5对应S3按键,点下为低电平
//高电阻塞
while (P3_5)
{
//延时消抖
//delay(1);
}
//延时消抖
delay(50);
//低电阻塞
while (!P3_5)
{
//延时消抖
//delay(1);
}
//延时消抖
delay(50);
i++;
if (i >= 10)
{
i = 0;
}
} while (1);
}
根据矩阵键盘显示数字
实现思路,扫描4个低电位,再去高电位匹配
//根据矩阵键盘显示数字
void keybord_show_4x4(void)
{
//重置段选位选
P2_6 = P2_7 = 0;
P0 = 0x2A; //101010B
P2_7 = 1; //开启位选 //低电位显示,数码管位置与二进制是反的
P2_7 = 0; //关闭位选
char keys[] = {0b1110, 0b1101, 0b1011, 0b0111};
while (1)
{
//执行矩阵键盘扫描
for (char i = 0; i < sizeof(keys); i++)
{
P3 = keys[i] | 0b11110000;
char p3data = P3; //要把值取出来使用,否则可能会有问题
char h_data = p3data >> 4;
for (char j = 0; j < sizeof(keys); j++)
{
if (h_data == keys[j])
{
unsigned int digital_index = i * 4 + j;
P0 = TBL_DIGITAL_DISPALY[digital_index];
P2_6 = 1; //开启段选
P2_6 = 0; //关闭段选
//P2_3为蜂鸣器
P2_3 = 0; //开启
delay(10); //约为20ms
P2_3 = 1; //关闭
//跳出两层循环,采用goto
goto LBL_END_KBD_SCAN;
}
}
}
//标签,结束扫描
LBL_END_KBD_SCAN:
continue; //只为让编译器不报警告
}
}