51单片机按键输入数码管数字代码
时间: 2023-12-03 19:43:00 浏览: 32
以下是51单片机按键输入数码管数字代码的示例,具体实现方法可能因硬件平台而异:
```c
#include <reg52.h>
// 数码管段选对应的IO口
sbit seg_a = P2^0;
sbit seg_b = P2^1;
sbit seg_c = P2^2;
sbit seg_d = P2^3;
sbit seg_e = P2^4;
sbit seg_f = P2^5;
sbit seg_g = P2^6;
sbit seg_dp = P2^7;
// 数码管位选对应的IO口
sbit dig_1 = P1^0;
sbit dig_2 = P1^1;
sbit dig_3 = P1^2;
sbit dig_4 = P1^3;
// 按键对应的IO口
sbit key_1 = P3^0;
sbit key_2 = P3^1;
sbit key_3 = P3^2;
sbit key_4 = P3^3;
unsigned char key_val[4][4] = {{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}};
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 114; j++);
}
}
void display(unsigned char dig, unsigned char val) {
// 数码管段选
switch (val) {
case '0':
seg_a = 0;
seg_b = 0;
seg_c = 0;
seg_d = 0;
seg_e = 0;
seg_f = 0;
seg_g = 1;
break;
case '1':
seg_a = 1;
seg_b = 0;
seg_c = 0;
seg_d = 1;
seg_e = 1;
seg_f = 1;
seg_g = 1;
break;
case '2':
seg_a = 0;
seg_b = 0;
seg_c = 1;
seg_d = 0;
seg_e = 0;
seg_f = 1;
seg_g = 0;
break;
case '3':
seg_a = 0;
seg_b = 0;
seg_c = 0;
seg_d = 0;
seg_e = 1;
seg_f = 1;
seg_g = 0;
break;
case '4':
seg_a = 1;
seg_b = 0;
seg_c = 0;
seg_d = 1;
seg_e = 1;
seg_f = 0;
seg_g = 0;
break;
case '5':
seg_a = 0;
seg_b = 1;
seg_c = 0;
seg_d = 0;
seg_e = 1;
seg_f = 0;
seg_g = 0;
break;
case '6':
seg_a = 0;
seg_b = 1;
seg_c = 0;
seg_d = 0;
seg_e = 0;
seg_f = 0;
seg_g = 0;
break;
case '7':
seg_a = 0;
seg_b = 0;
seg_c = 0;
seg_d = 1;
seg_e = 1;
seg_f = 1;
seg_g = 1;
break;
case '8':
seg_a = 0;
seg_b = 0;
seg_c = 0;
seg_d = 0;
seg_e = 0;
seg_f = 0;
seg_g = 0;
break;
case '9':
seg_a = 0;
seg_b = 0;
seg_c = 0;
seg_d = 0;
seg_e = 1;
seg_f = 0;
seg_g = 0;
break;
case 'A':
seg_a = 0;
seg_b = 0;
seg_c = 0;
seg_d = 1;
seg_e = 0;
seg_f = 0;
seg_g = 0;
break;
case 'B':
seg_a = 1;
seg_b = 1;
seg_c = 0;
seg_d = 0;
seg_e = 0;
seg_f = 0;
seg_g = 0;
break;
case 'C':
seg_a = 0;
seg_b = 1;
seg_c = 1;
seg_d = 0;
seg_e = 0;
seg_f = 0;
seg_g = 1;
break;
case 'D':
seg_a = 1;
seg_b = 0;
seg_c = 0;
seg_d = 0;
seg_e = 0;
seg_f = 1;
seg_g = 0;
break;
case '*':
seg_a = 1;
seg_b = 1;
seg_c = 1;
seg_d = 0;
seg_e = 0;
seg_f = 0;
seg_g = 0;
break;
case '0':
seg_a = 0;
seg_b = 0;
seg_c = 0;
seg_d = 0;
seg_e = 0;
seg_f = 0;
seg_g = 1;
break;
case '#':
seg_a = 1;
seg_b = 1;
seg_c = 1;
seg_d = 1;
seg_e = 1;
seg_f = 1;
seg_g = 0;
break;
default:
break;
}
// 数码管位选
switch (dig) {
case 1:
dig_1 = 0;
dig_2 = 1;
dig_3 = 1;
dig_4 = 1;
break;
case 2:
dig_1 = 1;
dig_2 = 0;
dig_3 = 1;
dig_4 = 1;
break;
case 3:
dig_1 = 1;
dig_2 = 1;
dig_3 = 0;
dig_4 = 1;
break;
case 4:
dig_1 = 1;
dig_2 = 1;
dig_3 = 1;
dig_4 = 0;
break;
default:
break;
}
}
void main() {
unsigned char key, dig;
unsigned int cnt = 0;
while (1) {
// 扫描按键
key = 0;
if (key_1 == 0) {
delay(10);
if (key_1 == 0) {
key = key_val[0][0];
}
} else if (key_2 == 0) {
delay(10);
if (key_2 == 0) {
key = key_val[0][1];
}
} else if (key_3 == 0) {
delay(10);
if (key_3 == 0) {
key = key_val[0][2];
}
} else if (key_4 == 0) {
delay(10);
if (key_4 == 0) {
key = key_val[0][3];
}
}
// 显示数码管
if (key != 0) {
display(1, key);
display(2, key);
display(3, key);
display(4, key);
} else {
cnt++;
if (cnt >= 5000) {
cnt = 0;
}
dig = cnt % 4 + 1;
display(dig, '0');
}
}
}
```
该代码实现了按键输入数字并在数码管上显示的功能,同时也包含了数码管扫描的实现。在按键按下时,会将按键对应的字符显示在所有的数码管上;在未按键时,数码管上会显示一个从0开始计数的计数器值。请注意,该代码仅为示例,具体实现还需要根据实际硬件平台进行调整。