|
本帖最后由 xz318569872 于 2019-7-3 10:27 编辑
单个按键实现时钟的24时转到12时制,年月日显示,星期显示,可调整时间,年月日,星期,有仿真。
#include "reg52.h"
typedef unsigned char uchar;//给数据类型重命名
typedef unsigned int uint;
unsigned char code sh[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阴数码管数码0~9
uchar Year1,Year2,Mon,Day,Hour,Min,Sec,Week,Week1;// 年月日时分秒星期
uint Year;
uchar num; //计数值
uchar flag=0; //功能切换标志位
void Delay(unsigned char x) //延时函数
{
unsigned int i;
for(i=0;i<2;i++)
{
while(x--);
}
}
void Delay_1(unsigned char x)
{
unsigned char i;
for(i=0;i<30;i++)
{
while(x--);
}
}
void Display_Hour(unsigned char x)//时显示函数
{
P3=0x05; //选中第一位数码管
P1=sh[x/10]; //分离十位
Delay(1);
P3=0x06; //选中第二位
P1=sh[x%10]; //分离个位
Delay(1);
}
void Display_Min(unsigned char x)//分显示函数
{
P3=0x0c;
P1=sh[x/10];
Delay(1);
P3=0x14;
P1=sh[x%10];
Delay(1);
}
void Display_Sec(unsigned char x)//秒显示函数
{
P3=0x24;
P1=sh[x/10];
Delay(1);
P3=0x84;
P1=sh[x%10];
Delay(1);
}
void Exchange_Init()//12小时/24小时转换
{
unsigned char h;
if(Hour<=12) //判断为1-12
{
h=Hour;//12小时制和24小时 时间一样
Display_Hour(h);
}
else
{
h=Hour-12;//减去12转换成12小时制
Display_Hour(h);
}
}
void Display_Year(unsigned char x)//年显示函数
{
P3=0x05;
P1=sh[x/10];
Delay(1);
P3=0x06;
P1=sh[x%10];
Delay(1);
}
void Display_Mon(unsigned char x)//月显示函数
{
P3=0x0C;
P1=sh[x/10];
Delay(1);
P3=0x14;
P1=sh[x%10];
Delay(1);
}
void Display_Day(unsigned char x)//日显示函数
{
P3=0x24;
P1=sh[x/10];
Delay(1);
P3=0x84;
P1=sh[x%10];
Delay(1);
}
void Display_Week1(unsigned char x)//日显示函数
{
P3=0x24;
P1=sh[x/10];
Delay(1);
P3=0x84;
P1=sh[x%10];
Delay(1);
}
void Display_Week(unsigned char x)//星期显示函数
{
P3=0x84;
P1=sh[x%10];
Delay(1);
}
void Charge_init()//自动追踪
{
if(((Year%4==0)&&(Year%100!=0))||(Year%400==0))//满足闰年条件
{
if(Mon==2)
{ if(Hour>=24){Hour=0;Day++;}if(Day>29){ Day=0;Mon++;}}
else if(Mon<7)
{if(Mon%2==1){if(Hour>=24){Hour=0;Day++;}if(Day>31)
{Day=0;Mon++;}}
else{if(Hour>=24){Hour=0;Day++;}if(Day>30){Day=0;Mon++;}}
}
else if(Mon==7)
{if(Hour>=24){Hour=0;Day++;}if(Day>31){Day=0;Mon++;}}
else if(Mon<=12)
{if(Mon%2==1){if(Hour>=24){Hour=0;Day++;}if(Day>30){Day=0;Mon++;}}
else{if(Hour>=24){Hour=0;Day++;}if(Day>31){Day=0;Mon++;}}}
else { Mon=0;}
}
else
{
if(Mon==2)
{ if(Hour>=24){Hour=0;Day++;}if(Day>28){ Day=0;Mon++;}}
else if(Mon<7)
{if(Mon%2==1){if(Hour>=24){Hour=0;Day++;}if(Day>31)
{Day=0;Mon++;}}
else{if(Hour>=24){Hour=0;Day++;}if(Day>30){Day=0;Mon++;}}
}
else if(Mon==7)
{if(Hour>=24){Hour=0;Day++;}if(Day>31){Day=0;Mon++;}}
else if(Mon<=12)
{if(Mon%2==1){if(Hour>=24){Hour=0;Day++;}if(Day>30){Day=0;Mon++;}}
else{if(Hour>=24){Hour=0;Day++;}if(Day>31){Day=0;Mon++;}}}
else {Mon=0;Year++;}
}}
void Exchenang_Hour() //时调整函数
{
for(;Hour<=24;Hour++)
{
P3=0x05;
P1=sh[Hour/10];
Delay_1(10);
P3=0x06;
P1=sh[Hour%10];
Delay_1(10);
if(flag==7)break; //如果flag=5,退出对时的调整
}
if(Hour==24)
{Hour=0;}
}
void Exchenang_Min()//分调整程序
{
for(;Min<=60;Min++)
{
P3=0x0C;
P1=sh[Min/10];
Delay_1(10);
P3=0x14;
P1=sh[Min%10];
Delay_1(10);
if(flag==9)break; //如果flag=7,退出对分钟的调整
}
if(Min==60) //如果分钟计时到60分,赋初值0,
{Min=0;}
}
void Exchenang_Year()//年调整程序
{
unsigned char y;
for(;Year<=3000;Year++)
{
y=Year%100;
P3=0x05;
P1=sh[y/10];
Delay_1(10);
P3=0x06;
P1=sh[y%10];
Delay_1(10);
if(flag==11)break; //如果flag=9,退出对分钟的调整
}
if(Year==3000) //如果年达到3015年,自动赋初值0
{Year=0;}
}
void Exchenang_Week()//日调整程序
{
for(;Week<=6;Week++)
{
P3=0x24;
P1=sh[Week/10];
Delay_1(10);
P3=0x84;
P1=sh[Week%10];
Delay_1(10);
if(flag==5)break; //如果flag=13时,退出调整日
}
if(Week==7)
{Week=0;} //如果天加到31,重新赋初值0
}
void Exchenang_Mon()//月调整程序
{
for(;Mon<=12;Mon++)
{
P3=0x0C;
P1=sh[Mon/10];
Delay_1(10);
P3=0x14;
P1=sh[Mon%10];
Delay_1(10);
if(flag==13)break; //如果flag=11,退出调整月
}
if(Mon==12) //如果月到达12时,重新计数为0;
{Mon=0;}
}
void Exchenang_Day()//日调整程序
{
for(;Day<=31;Day++)
{
P3=0x24;
P1=sh[Day/10];
Delay_1(10);
P3=0x84;
P1=sh[Day%10];
Delay_1(10);
if(flag==15)break; //如果flag=13时,退出调整日
}
if(Day==31)
{Day=0;} //如果天加到31,重新赋初值0
}
void Timer0_Init()//常规初始化
{
TMOD=0x01;
TH0=(65535-10000)/256; //20ms
TL0=(65535-10000)%256;
ET0=1;
EX0=1;
IT0=1;
TR0=1;
EA=1;
}
void main()
{
Timer0_Init();
Year=2019;
Year1=Year/100;
Year2=Year%100;
Mon=7;
Day=3;
Hour=20;
Min=20;
Sec=50;
Week=3;
while(1)
{
if(flag==0)
{
Display_Hour(Hour); //显示时分秒
Display_Min(Min);
Display_Sec(Sec);
}
else if(flag==1) //显示切换
{
Exchange_Init();
Display_Min(Min);
Display_Sec(Sec);
}
else if(flag==2) //显示年月日
{
Display_Year(Year2);
Display_Mon(Mon);
Display_Day(Day);
}
else if(flag==3) //显示星期
{
Display_Week(Week);
}
else if(flag==4) //调整周
{
Exchenang_Week();
}
else if(flag==5) //显示周
{
Display_Week1(Week);
}
else if(flag==6) //调整时
{
Exchenang_Hour();
}
else if(flag==7) //显示时
{
Display_Hour(Hour);
}
else if(flag==8) //调整分
{
Exchenang_Min();
}
else if(flag==9) //显示分
{
Display_Min(Min);
}
else if(flag==10) //调整年
{
Exchenang_Year();
Year2=Year%100; //取后两位
}
else if(flag==11) //显示年
{
Display_Year(Year2);
}
else if(flag==12) //调整月
{
Exchenang_Mon();
}
else if(flag==13) //显示月
{
Display_Mon(Mon);
}
else if(flag==14) //调整日
{
Exchenang_Day();
}
else if(flag==15) //显示日
{
Display_Day(Day);
}
}
}
void timer0() interrupt 1 using 1
{
TH0=(65535-21535)/256;
TL0=(65535-21535)%256; //重新赋初值,定时20ms
num++;
if(num>=60)
{
num=0;
Sec++; //如果定时到一秒,秒加1
}
if(Sec>=60)
{
Sec=0;
Min++; //如果秒计时到60s,则分加1
}
if(Min>=60)
{
Min=0;
Hour++; //如果分计时到60m,则时加1
}
Charge_init();
}
void Int0_init() interrupt 0
{
flag++;
if(flag==16)
{
flag=0;
}
}
[img]file:///D:/QQ/QQ消息记录/318569872/Image/C2C/H2[]ISYL6RXK]FC__7IYI2J.png[/img]
|
|