根据单片机定时器和按键原理,用八位共阳极数码管显示时间,格式为“16-59-54”(时-分-秒),中间用短横线隔开,按键S7用于切换正常计时模式和设置时间模式;S6用于在设置时间模式下切换时,给出keil4C语言源程序
时间: 2024-05-25 12:17:55 浏览: 19
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit S7=P1^7; //设置模式切换按键
sbit S6=P1^6; //时间切换按键
uchar code table[] = { //共阳极数码管显示0~9的编码
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x67
};
uchar hour, minute, second; //时分秒变量
bit setFlag=0; //设置模式标志位
bit timeFlag=0; //时间切换标志位
void display(uchar hour, uchar minute, uchar second); //数码管显示函数
void delay(uint i); //延时函数
void main() {
TMOD=0x01; //定时器0工作在16位定时模式
TH0=0xfc; //定时器初值
TL0=0x18; //定时器初值
TR0=1; //启动定时器0
ET0=1; //开启定时器0中断
EA=1; //开启总中断
hour=16; //设置初始时间
minute=59;
second=54;
while(1) {
if(S7==0) { //进入设置模式
delay(10); //消抖
if(S7==0) {
setFlag=!setFlag; //切换设置模式标志位
while(!S7); //等待按键释放
}
}
if(setFlag) { //设置模式
if(S6==0) { //时间切换
delay(10); //消抖
if(S6==0) {
timeFlag=!timeFlag; //切换时间切换标志位
while(!S6); //等待按键释放
}
}
if(timeFlag) { //设置小时
if(S6==0) {
delay(10); //消抖
if(S6==0) {
hour++; //小时加1
if(hour>23) hour=0; //超过23小时,重新从0开始
while(!S6); //等待按键释放
}
}
} else { //设置分钟
if(S6==0) {
delay(10); //消抖
if(S6==0) {
minute++; //分钟加1
if(minute>59) minute=0; //超过59分钟,重新从0开始
while(!S6); //等待按键释放
}
}
}
}
}
}
void display(uchar hour, uchar minute, uchar second) {
uchar a,b,c;
a=hour/10; //分离出时的十位
b=hour%10; //分离出时的个位
c=0x10; //冒号的位置
P2=table[a]; //显示时的十位
P0=c; //显示冒号
delay(5); //延时
P2=table[b]; //显示时的个位
P0=0x00; //不显示冒号
delay(5); //延时
a=minute/10; //分离出分的十位
b=minute%10; //分离出分的个位
P2=table[a]; //显示分的十位
P0=0x00; //不显示冒号
delay(5); //延时
P2=table[b]; //显示分的个位
P0=0x00; //不显示冒号
delay(5); //延时
a=second/10; //分离出秒的十位
b=second%10; //分离出秒的个位
P2=table[a]; //显示秒的十位
P0=c; //显示冒号
delay(5); //延时
P2=table[b]; //显示秒的个位
P0=0x00; //不显示冒号
delay(5); //延时
}
void delay(uint i) {
while(i--);
}
void timer0() interrupt 1 {
TH0=0xfc; //重新赋初值
TL0=0x18;
if(!setFlag) { //正常计时模式
second++; //秒加1
if(second>59) { //超过59秒,进位
second=0;
minute++;
if(minute>59) { //超过59分钟,进位
minute=0;
hour++;
if(hour>23) hour=0; //超过23小时,重新从0开始
}
}
}
display(hour, minute, second); //数码管显示时间
}