用keil5写一个四位数码管显示年月日时分秒并用按键进行交替显示的程序
时间: 2023-11-24 09:06:41 浏览: 229
以下是基于STC89C52单片机和共阳数码管的程序示例,您可以参考修改适配到您的开发板上:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = { // 数码管显示0-9的编码表
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90
};
uchar cnt = 0; // 计数器
uchar num[6]; // 年月日时分秒
uchar key = 0; // 按键值
void delay(uint xms) { // 延时函数
uint i, j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void init() { // 初始化函数
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0x4C; // 定时器0初值
TL0 = 0x00;
TR0 = 1; // 启动定时器0
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
}
void display(uchar *p) { // 显示函数
uchar i;
for(i=0;i<6;i++) { // 循环显示年月日时分秒
P2 = 0xff; // 先清空P2口
P0 = table[p[i] / 10]; // 显示十位数
P2 = ~(0x01 << i); // 选中对应位的数码管
delay(1); // 短暂延时
P2 = 0xff; // 先清空P2口
P0 = table[p[i] % 10]; // 显示个位数
P2 = ~(0x01 << i); // 选中对应位的数码管
delay(1); // 短暂延时
}
}
void main() {
num[0] = 20; // 年
num[1] = 5; // 月
num[2] = 12; // 日
num[3] = 21; // 时
num[4] = 30; // 分
num[5] = 0; // 秒
init(); // 初始化
while(1) { // 主循环
if(key == 1) { // 按键值为1,切换到年月日显示模式
cnt = 0;
key = 0;
while(cnt < 3) { // 循环3次,显示年月日
display(num);
delay(100); // 延时100ms
cnt++;
}
} else if(key == 2) { // 按键值为2,切换到时分秒显示模式
cnt = 0;
key = 0;
while(cnt < 3) { // 循环3次,显示时分秒
display(num+3);
delay(100); // 延时100ms
cnt++;
}
} else { // 否则,显示年月日时分秒
display(num);
delay(100); // 延时100ms
}
}
}
void interrupt_timer0() interrupt 1 { // 定时器0中断服务函数
TH0 = 0x4C; // 重新赋初值
TL0 = 0x00;
num[5]++; // 秒加1
if(num[5] == 60) { // 如果秒数达到60
num[5] = 0; // 秒数清零
num[4]++; // 分钟加1
if(num[4] == 60) { // 如果分钟达到60
num[4] = 0; // 分钟清零
num[3]++; // 小时加1
if(num[3] == 24) { // 如果小时达到24
num[3] = 0; // 小时清零
num[2]++; // 日加1
if(num[2] == 32) { // 如果日达到32
num[2] = 1; // 日从1开始
num[1]++; // 月加1
if(num[1] == 13) { // 如果月达到13
num[1] = 1; // 月从1开始
num[0]++; // 年加1
}
}
}
}
}
if(!P3) { // 如果P3口有按键按下
delay(10); // 稍作延时
if(!P3) { // 如果还是有按键按下
key = P3; // 获取按键值
}
}
}
```
上述程序中,使用定时器0中断实现时间的显示和更新,使用P3口的按键来切换显示模式。其中,按键值为1时,会循环3次显示年月日;按键值为2时,会循环3次显示时分秒;否则,就一直显示年月日时分秒。在显示函数中,通过循环显示每一个数码管的十位数和个位数,来达到显示6位数字的目的。注意,由于共阳数码管的电平是低电平有效的,所以在显示时需要对P2口进行取反操作。
阅读全文