51单片机设定4x4按键:0~9十个数字键,加减乘除四个键,等号按键和清零按键,在此设定下输入四个数字并循环显示
时间: 2024-03-20 22:44:39 浏览: 18
好的,根据你的要求,可以使用以下代码实现:
```c
#include <reg51.h>
#define KEY P0 // 定义按键端口
// 按键值定义
#define KEY_0 0x7e
#define KEY_1 0x30
#define KEY_2 0x6d
#define KEY_3 0x79
#define KEY_4 0x33
#define KEY_5 0x5b
#define KEY_6 0x5f
#define KEY_7 0x70
#define KEY_8 0x7f
#define KEY_9 0x7b
#define KEY_ADD 0x77
#define KEY_SUB 0x31
#define KEY_MUL 0x6e
#define KEY_DIV 0x7c
#define KEY_EQ 0x38
#define KEY_CLR 0x3f
// 数码管位选
sbit DIG1 = P2^0;
sbit DIG2 = P2^1;
sbit DIG3 = P2^2;
sbit DIG4 = P2^3;
// 数码管段选
unsigned char code LED_Disp[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
0x77, // A
0x7c, // B
0x39, // C
0x5e, // D
0x79, // E
0x71 // F
};
// 延时函数
void Delay(unsigned int t)
{
unsigned int i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < 120; j++);
}
}
// 数码管显示函数
void Disp(unsigned char num, unsigned char pos)
{
switch (pos) {
case 1:
DIG1 = 1;
DIG2 = 0;
DIG3 = 0;
DIG4 = 0;
break;
case 2:
DIG1 = 0;
DIG2 = 1;
DIG3 = 0;
DIG4 = 0;
break;
case 3:
DIG1 = 0;
DIG2 = 0;
DIG3 = 1;
DIG4 = 0;
break;
case 4:
DIG1 = 0;
DIG2 = 0;
DIG3 = 0;
DIG4 = 1;
break;
}
P1 = LED_Disp[num];
}
// 主函数
void main()
{
unsigned char key, i;
unsigned char num[4] = {0, 0, 0, 0};
while (1) {
for (i = 0; i < 4; i++) {
// 按键检测
key = KEY;
if (key != 0xff) {
Delay(5); // 延时去抖动
if (key != 0xff) {
switch (key) {
case KEY_0:
num[i] = 0;
break;
case KEY_1:
num[i] = 1;
break;
case KEY_2:
num[i] = 2;
break;
case KEY_3:
num[i] = 3;
break;
case KEY_4:
num[i] = 4;
break;
case KEY_5:
num[i] = 5;
break;
case KEY_6:
num[i] = 6;
break;
case KEY_7:
num[i] = 7;
break;
case KEY_8:
num[i] = 8;
break;
case KEY_9:
num[i] = 9;
break;
case KEY_ADD:
num[i] = '+';
break;
case KEY_SUB:
num[i] = '-';
break;
case KEY_MUL:
num[i] = '*';
break;
case KEY_DIV:
num[i] = '/';
break;
case KEY_EQ:
num[i] = '=';
break;
case KEY_CLR:
num[i] = 'C';
break;
}
}
}
// 数码管显示
Disp(num[i], i + 1);
Delay(10);
}
}
}
```
这个程序的实现思路是:循环读取按键状态,并将按键值转换为数字或符号存储到数组中,然后循环显示数组中的数值。其中,按键检测采用了简单的去抖动措施,数码管显示采用了位选和段选的方式,通过控制位选端口和段选端口实现多位数码管的显示。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)