📄 calendar.c
字号:
#define uchar unsigned char
#define uint unsigned int
#include<AT89X51.H>
uint mday;
uint sec;
uint min=38;
uint hour=17;
uint day=6;
uint month=3;
uint yearl=8;
uint yearh=20;
uint tcnt=0,tcnt1=0;
uint cursor=0;
uchar a=0xff;
uchar code Seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uint t)
{
uint i;
while(t--)
{for (i=0;i<125;i++);}
}
void Kdelay()
{
uint i;
for(i=9000;i>0;i--);
}
void display(uchar L1,uchar L2,uchar L3,uchar L4,uchar L5,uchar L6,
uchar L7,uchar L8,uchar L9,uchar L10,uchar L11,uchar L12,uchar L13,uchar L14)//,uchar L15,uchar L16)
{
if(cursor==7){P2=0x7F|a;P0=L1;delay(1);}else{P2=0x7F;P0=L1;delay(1);} //yearh
if(cursor==7){P2=0xBF|a;P0=L2;delay(1);}else{P2=0xBF;P0=L2;delay(1);} //yearh
if(cursor==6){P2=0xDF|a;P0=L3;delay(1);}else{P2=0xDF;P0=L3;delay(1);} //yearl
if(cursor==6){P2=0xEF|a;P0=L4;delay(1);}else{P2=0xEF;P0=L4;delay(1);} //yearl
if(cursor==5){P2=0xF7|a;P0=L5;delay(1);}else{P2=0xF7;P0=L5;delay(1);} //month
if(cursor==5){P2=0xFB|a;P0=L6;delay(1);}else{P2=0xFB;P0=L6;delay(1);} //month
if(cursor==4){P2=0xFD|a;P0=L7;delay(1);}else{P2=0xFD;P0=L7;delay(1);} //day
if(cursor==4){P2=0xFE|a;P0=L8;delay(1);}else{P2=0xFE;P0=L8;delay(1);} //day
P2=0xff; //关掉年月日的显示位,避免和时分秒显示的干扰
if(cursor==3){P1=0x7F|a;P0=L9;delay(1);}else{P1=0x7F;P0=L9;delay(1);} //hour
if(cursor==3){P1=0xBF|a;P0=L10;delay(1);}else{P1=0xBF;P0=L10;delay(1);} //hour
if(cursor==2){P1=0xDF|a;P0=L11;delay(1);}else{P1=0xDF;P0=L11;delay(1);} //min
if(cursor==2){P1=0xEF|a;P0=L12;delay(1);}else{P1=0xEF;P0=L12;delay(1);} //min
if(cursor==1){P1=0xF7|a;P0=L13;delay(1);}else{P1=0xF7;P0=L13;delay(1);} //sec
if(cursor==1){P1=0xFB|a;P0=L14;delay(1);}else{P1=0xFB;P0=L14;delay(1);} //sec
P1=0xFF; //关掉时分秒的显示位,避免和年月日显示的干扰
}
void maxday(yearh,yearl,month)
{
uint year;
year=yearh*100+yearl;
if((year%4==0&&year%100!=0)||(year%400==0))
{
if(month==4||month==6||month==9||month==11)
mday=30;
else if(month==2)
mday=29;
else
mday=31;
}
if(!((year%4==0&&year%100!=0)||year%400==0))
{
if(month==4||month==6||month==9||month==11)
mday=30;
else if(month==2)
mday=28;
else
mday=31;
}
}
main()
{
P0=0xff;
TMOD=0x02; //设置模式为定时器T0的模式2 (8位自动重装计数初值的计数值)
TH0=0x06; //设置计数器初值,靠TH0存储重装的计数值X0=256-250=6
TL0=0x06;
P3_3=1;
TR0=1; //启动T0
ET0=1; //开启定时器T0中断允许
EA=1; //开启中断总控制
while(1)
{
if(P3_0==0)
{
Kdelay();
if(P3_0==0)
{
cursor++;
if(cursor>=8){cursor=0;}
}
}
if(P3_1==0)
{
Kdelay();
if(P3_1==0)
{
if(cursor==1){sec++;if(sec==60)sec=0;}
if(cursor==2){min++;if(min==60)min=0;}
if(cursor==3){hour++;if(hour==24)hour=0;}
if(cursor==4){day++;maxday(yearh,yearl,month);if(day>mday)day=0;}
if(cursor==5){month++;if(month==13)month=1;}
if(cursor==6){yearl++;if(yearl==100){yearl=0;yearh++;}}
if(cursor==7){yearh++;if(yearh==100)yearh=0;}
}
}
display(Seg[yearh/10],Seg[yearh%10],Seg[yearl/10],Seg[yearl%10],
Seg[month/10],Seg[month%10],Seg[day/10],Seg[day%10],
Seg[hour/10],Seg[hour%10],Seg[min/10],Seg[min%10],
Seg[sec/10],Seg[sec%10]);//,Seg[i/100],Seg[i/10%10]);
}
}
void t0(void)interrupt 1 using 0 //t0的中断程序
{
tcnt++;
if(tcnt==4000)//定时器的定时计数,4000次250us为1秒
{
tcnt=0;
P3_3=~P3_3;
a=~a;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
day++;
if(month==2&&((yearl==0&&yearh%4==0)||(yearl!=0&&yearl%4==0))&&day==30)day=1;
else if(month==2&&day==29)day=1;
else if((month==4||month==6||month==9||month==11)&&day==31)day=1;
else if(day==32)day=1;
if(day==1)
{
month++;
if(month==13)
{
month=1;
yearl++;
if(yearl==100)
{
yearl=0;
yearh++;
if(yearh==100)
{
yearh=20;
}
}
}
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -