C51用4个数码管显示生日两个按键控制加减代码
时间: 2024-03-08 10:46:05 浏览: 22
好的,以下是基于C51单片机的代码,可以实现用4个数码管显示生日,并且可以用两个按键控制加减。请将按键连接到P3.2(加)和P3.3(减)引脚上,将4个数码管连接到P1口上。
```
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = { // 数码管0~9显示码表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar birthday[] = { // 存储生日的数组,按顺序存储年月日
0x20, 0x21, 0x07, 0x15 // 1998年7月15日
};
uint num = 0; // 初始显示数字为0
void delay(uint); // 延时函数
void display(uchar); // 数码管显示函数
void main()
{
uchar i, j, k, m;
uchar key_add = 0, key_sub = 0; // 按键标志位,按下为1,未按下为0
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0xfc; // 定时器初值,为1ms
TL0 = 0x18;
TR0 = 1; // 启动定时器0
while (1) {
if (key_add && P3_2 == 0) { // 检测加键是否按下
num++;
if (num > 9999) { // 数字范围为0~9999
num = 0;
}
key_add = 0; // 清除按键标志位
}
if (key_sub && P3_3 == 0) { // 检测减键是否按下
if (num > 0) {
num--;
} else {
num = 9999;
}
key_sub = 0; // 清除按键标志位
}
for (i = 0; i < 4; i++) { // 循环显示4个数码管
switch (i) { // 根据i的值,选择读取birthday数组中的哪个元素
case 0: j = 3; break; // 第一个数码管显示日
case 1: j = 2; break; // 第二个数码管显示月
case 2: j = 1; break; // 第三个数码管显示年的十位
case 3: j = 0; break; // 第四个数码管显示年的个位
default: break;
}
display(birthday[j]); // 显示生日
delay(5); // 短暂延时,防止闪烁
P1 = 0xff; // 清空数码管显示
}
k = num / 1000; // 计算千位数字
m = num % 1000; // 计算百位、十位、个位数字
display(table[k]); // 显示千位数字
P1 = _crol_(P1, 1); // 移位,为显示百位数字做准备
delay(5);
P1 = 0xff;
display(table[m / 100]); // 显示百位数字
P1 = _crol_(P1, 1); // 移位,为显示十位数字做准备
delay(5);
P1 = 0xff;
display(table[m % 100 / 10]); // 显示十位数字
P1 = _crol_(P1, 1); // 移位,为显示个位数字做准备
delay(5);
P1 = 0xff;
display(table[m % 10]); // 显示个位数字
P1 = _crol_(P1, 1); // 移位,为下一次循环做准备
delay(5);
P1 = 0xff;
}
}
void delay(uint xms) // 延时函数
{
uint i, j;
for (i = xms; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void display(uchar num) // 数码管显示函数
{
P1 = num; // 将要显示的数字存储到P1口上
}
```
请注意,该代码仅供参考,具体实现方式可能因硬件连接方式的不同而有所差异。