#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Tab0[]= //定义数码管数组,没有小数点
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
uchar code Tab1[]= //定义数码管数组,有小数点
{
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef
};
void Delay(uchar x); //延时函数
void Display0(); //时间显示函数
void Display2(); //时间设置显示函数
void Init(); //中断初始化函数
uchar Hours=23,Minutes=56,seconds=55; //分别定义三个变量表示时、分、秒
uchar Time0_bit=0; //用于定时器0的溢出标志
bit Set_Time=0; //设置时 闪烁时长的标志位
bit Set0=0; //设置时间标志,确定是设置‘分’还设置‘时’
void main()
{
Init(); //中断初始化
while(1) //死循环
{
Display0(); //显示时间
}
}
void Time0() interrupt 1 //定时器0函数
{
TH0=(65536-50000)/256; //重装初值
TL0=(65536-50000)%256;
Time0_bit++;
if((Time0_bit%10)==0) //每溢出10次Time0_bit取反一次
Set_Time=~Set_Time; //0.5秒闪烁一次
if(Time0_bit==20) //以下为时间数据处理
{
Time0_bit=0;
seconds++;
if(seconds==60)
{
seconds=0;
Minutes++;
if(Minutes==60)
{
Minutes=0;
Hours++;
if(Hours==24)
{
Hours=0;
}
}
}
}
}
void Init() //中断初始化函数
{
EA=1; //开总中断
TMOD=0X01; //定时器工作方式选择,定时器0和定时器1都选择第1种工作方式
TH0=(65536-50000)/256; //定时器0装初值,定时50ms
TL0=(65536-50000)%256;
ET0=1; //开定时器0开关
TR0=1; //开定时器0小开关
}
void Display2() //时间设置时的显示函数
{
if(Set0==0) //判断是否为设置‘时’还是‘分’
{
P0=Tab0[seconds%10]; //显示秒的个位
P1=0xdf; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[seconds/10]; //显示秒的十位
P1=0xef; //段选
Delay(10); //延时
P0=0X00; //消隐
if(Set_Time) //这个if语句实现分钟以0.5秒的频率闪烁
{
P0=Tab1[Minutes%10]; //显示分的个位,需要加上小数点做分隔符
P1=0xf7; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Minutes/10]; //显示分的十位
P1=0xfb; //段选
Delay(10); //延时
P0=0X00; //消隐
}
else
{
P0=0x00; //显示分的个位,需要加上小数点做分隔符
P1=0xf7; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=0x00; //显示分的十位
P1=0xfb; //段选
Delay(10); //延时
P0=0X00; //消隐
}
P0=Tab1[Hours%10]; //显示时的个位,需要加上小数点做分隔符
P1=0xfd; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Hours/10]; //显示时的十位
P1=0xfe; //段选
Delay(10); //延时
P0=0X00; //消隐
}
else //‘时’钟闪烁
{
P0=Tab0[seconds%10]; //显示秒的个位
P1=0xdf; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[seconds/10]; //显示秒的十位
P1=0xef; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab1[Minutes%10]; //显示分的个位,需要加上小数点做分隔符
P1=0xf7; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Minutes/10]; //显示分的十位
P1=0xfb; //段选
Delay(10); //延时
P0=0X00; //消隐
if(Set_Time) //这个if语句实现‘时’钟以0.5秒的频率闪烁
{
P0=Tab1[Hours%10]; //显示时的个位,需要加上小数点做分隔符
P1=0xfd; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Hours/10]; //显示时的十位
P1=0xfe; //段选
Delay(10); //延时
P0=0X00; //消隐
}
else
{
P0=0x00; //显示时的个位,需要加上小数点做分隔符
P1=0xFF; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=0X00; //显示时的十位
P1=0xFF; //段选
Delay(10); //延时
P0=0X00; //消隐
}
}
}
void Display0() //显示时钟
{
P0=Tab0[seconds%10]; //显示秒的个位
P1=0xdf; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[seconds/10]; //显示秒的十位
P1=0xef; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab1[Minutes%10]; //显示分的个位,需要加上小数点做分隔符
P1=0xf7; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Minutes/10]; //显示分的十位
P1=0xfb; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab1[Hours%10]; //显示时的个位,需要加上小数点做分隔符
P1=0xfd; //段选
Delay(10); //延时
P0=0X00; //消隐
P0=Tab0[Hours/10]; //显示时的十位
P1=0xfe; //段选
Delay(10); //延时
P0=0X00; //消隐
}
void Delay(uchar x) //延时
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
|