#include"stc12c5a.h"
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P3^5;
sbit lcden=P3^4;
uchar code table1[]=" 20 - - - "; //一共16个字符
uchar code table2[]=" : : ";
uchar second,minute,hour,day,month,year,week,num,date,add;
void delay(uint x) //延时X ms
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
bit isleapyear()
{ //计算本年是否是润年
uint a;
a = 2000+year; //加2000表示成完整的年
if((a%4==0 && a%100!=0)||(a%400==0))
{ //润年的计算公式
return 1; //是润年返回1
}
else
{
return 0; //不是润年返回0
}
}
void month_day(void)
{
uchar mon_day[]={31,28,31,30,31,30,31,31,30,31,30,31};
day++; //天加1
week++; //星期值加1
if(week>7)
{
week=1; //时期值限定
}
if(day>mon_day[month-1])
{ //检查天是否大于当月的最大值
if(isleapyear()&&month==2)
{ //计算本月是否是润年的2月份
day= 29; //如果是润年又是2月,则天为29
}
else
{
day=1; //否则就等于1
month++;
} //月加1
if(month>12)
{
month=1; //如果月大于12则月等于1
year++; //年加1 (公历年无限积加)
}
}
}
void time() // 秒分时
{
if(second>59)
{
second=0;
minute++;
if(minute>59)
{
minute=0;
hour++;
if(hour>24)
{
hour=0;
month_day(); //接month_day函数
}
}
}
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void write_time(uchar add,uchar date) //5时,8分,11秒
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi); //0x30是ascii对应的数字0
write_date(0x30+ge); //由1602初始化得知指针每写一个字符后地址自动加一
}
void write_month_day(uchar add,uchar date) //4年,7月,10日
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi); //0x30是ascii对应的数字0
write_date(0x30+ge); //由1602初始化得知指针每写一个字符后地址自动加一
}
void write_week(week)
{
write_com(0x80+13);
switch(week)
{
case 1: write_date('M');delay(5);
write_date('O');delay(5);
write_date('N');
break;
case 2: write_date('T');delay(5);
write_date('U');delay(5);
write_date('E');
break;
case 3: write_date('W');delay(5);
write_date('E');delay(5);
write_date('D');
break;
case 4: write_date('T');delay(5);
write_date('H');delay(5);
write_date('U');
break;
case 5: write_date('F');delay(5);
write_date('R');delay(5);
write_date('I');
break;
case 6: write_date('S');delay(5);
write_date('A');delay(5);
write_date('T');
break;
case 7: write_date('S');delay(5);
write_date('U');delay(5);
write_date('N');
break;
}
}
void write_base()
{
uchar i;
for(i=0;i<16;i++)
{
write_com(0x80);
write_date(table1[i]);
delay(5);
write_com(0x80+0x40);
write_date(table2[i]);
delay(5);
}
}
void display()
{
init();
write_time(5,0); //时
write_time(8,0); //分
write_time(11,0); //秒
write_month_day(4,0); //年
write_month_day(7,0); //月
write_month_day(10,0); //日
}
void main()
{
TMOD=0x11;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
write_base();
while(1)
{
time();
display();
}
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256; //50ms
TL0=(65536-45872)%256;
num++;
if(num==20)
{
second++;
}
}
|