51单片机按下按键显示对应的数码管键值,要求有键盘扫描以及数码管显示函数
时间: 2023-07-03 15:17:53 浏览: 101
51单片机+数码管+16个按键组成按键按下数码管显示按键编号的原理图和源程序和proteus仿真
5星 · 资源好评率100%
好的,我来回答你的问题。
以下是51单片机按下按键显示对应的数码管键值,带有键盘扫描以及数码管显示函数的代码实现:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1 = P2^0;
sbit key2 = P2^1;
sbit key3 = P2^2;
sbit key4 = P2^3;
sbit dp = P1^7;
sbit d1 = P1^6;
sbit d2 = P1^5;
sbit d3 = P1^4;
sbit d4 = P1^3;
uchar code table[] = {
0x3f, 0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c,
0x39, 0x5e, 0x79, 0x71
};
uchar keyValue = 0;
void delay(uint xms) {
uint i, j;
for(i = xms; i > 0; i--) {
for(j = 110; j > 0; j--);
}
}
void keyScan() {
if(key1 == 0) {
delay(5);
if(key1 == 0) {
while(!key1);
keyValue = 1;
}
} else if(key2 == 0) {
delay(5);
if(key2 == 0) {
while(!key2);
keyValue = 2;
}
} else if(key3 == 0) {
delay(5);
if(key3 == 0) {
while(!key3);
keyValue = 3;
}
} else if(key4 == 0) {
delay(5);
if(key4 == 0) {
while(!key4);
keyValue = 4;
}
}
}
void display() {
d1 = d2 = d3 = d4 = 1;
switch(keyValue) {
case 1:
d1 = 0;
P0 = table[1];
break;
case 2:
d2 = 0;
P0 = table[2];
break;
case 3:
d3 = 0;
P0 = table[3];
break;
case 4:
d4 = 0;
P0 = table[4];
break;
default:
d1 = d2 = d3 = d4 = 1;
P0 = 0x00;
break;
}
}
void main() {
while(1) {
keyScan();
display();
}
}
```
这段代码实现了按下按键后显示对应的数码管键值,其中包括键盘扫描函数和数码管显示函数。
在主函数中,我们不断地调用keyScan和display函数,其中keyScan函数用于扫描按键,如果检测到有按键按下,则将对应的键值存储在keyValue变量中;display函数用于根据keyValue变量的值在数码管中显示对应的数字。
需要注意的是,为了保证数码管中的数字显示清晰,我们需要在数码管的最高位(即P1.7)上加上小数点,所以我们在代码中定义了一个dp变量,并在display函数中将其赋值给P1.7。
希望能够帮到你!
阅读全文