采用4*4的矩阵按键,做按键检测显示,用P1口从低位到高位分别接a、b、c、d、e、f、g、dp的一位共阳数码管,P1.0、P1.1、P1.2、P1.3分别接第一到第4行按键,P2.0、P2.1、P2.2、P2.3分别接第一列到第四列。 请实现当无按键按下时,数码管熄灭。当有按键按下时,分别显示对应按键值,矩阵按键从左到右,从上到下,分别为k0~k15,键值也分别为0~15。
时间: 2023-07-04 11:07:32 浏览: 74
这是一个比较典型的矩阵按键检测的应用场景,可以通过定时扫描矩阵按键来实现。
具体实现步骤如下:
1. 定义按键对应的值,即将矩阵按键编号转化为实际的按键值。
2. 在主程序中,使用循环来扫描矩阵按键。在每次扫描开始时,将P2口所有输出设置为高电平,P1口所有输出设置为低电平。然后依次将P2口的每个输出置为低电平,在每个输出置为低电平之后,读取P1口的输入,判断是否有按键按下。
3. 如果有按键按下,则根据按键对应的值,在数码管上显示相应的数字。如果没有按键按下,则将数码管熄灭。
下面是具体的代码实现:
```C
#include <STC89C5xRC.H>
#define uchar unsigned char
#define uint unsigned int
uchar key_val[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; // 定义按键对应的值
void delay(uint z) {
uint x, y;
for (x = z; x > 0; x--)
for (y = 110; y > 0; y--);
}
void display(uchar val) { // 在数码管上显示数字
uchar code table[] = { // 数码管显示表
0xc0, // 0
0xf9, // 1
0xa4, // 2
0xb0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xf8, // 7
0x80, // 8
0x90, // 9
0x88, // A
0x83, // b
0xc6, // C
0xa1, // d
0x86, // E
0x8e // F
};
P1 = table[val];
}
uchar scan_key() { // 扫描矩阵按键
uchar i, j, k, val = 0xff;
for (i = 0; i < 4; i++) {
P2 = ~(1 << i);
for (j = 0; j < 4; j++) {
k = P1 & (1 << j);
if (!k) {
delay(10); // 延时去抖动
if (!(P1 & (1 << j))) {
val = i * 4 + j;
break;
}
}
}
if (val != 0xff) break;
}
return val;
}
void main() {
uchar val;
while (1) {
val = scan_key(); // 扫描矩阵按键
if (val != 0xff) display(key_val[val]); // 显示按键值
else P1 = 0xff; // 数码管熄灭
}
}
```
阅读全文