#include"stc12c5a.h"
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P3^5;
sbit lcden=P3^4;
uchar code table1[]=" 20 - - - "; //一共16個(gè)字符
uchar code table2[]=" : : ";
uchar second,minute,hour,day,month,year,week,num,date,add;
void delay(uint x) //延時(shí)X ms
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
bit isleapyear()
{ //計(jì)算本年是否是潤(rùn)年
uint a;
a = 2000+year; //加2000表示成完整的年
if((a%4==0 && a%100!=0)||(a%400==0))
{ //潤(rùn)年的計(jì)算公式
return 1; //是潤(rùn)年返回1
}
else
{
return 0; //不是潤(rùn)年返回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; //時(shí)期值限定
}
if(day>mon_day[month-1])
{ //檢查天是否大于當(dāng)月的最大值
if(isleapyear()&&month==2)
{ //計(jì)算本月是否是潤(rùn)年的2月份
day= 29; //如果是潤(rùn)年又是2月,則天為29
}
else
{
day=1; //否則就等于1
month++;
} //月加1
if(month>12)
{
month=1; //如果月大于12則月等于1
year++; //年加1 (公歷年無限積加)
}
}
}
void time() // 秒分時(shí)
{
if(second>59)
{
second=0;
minute++;
if(minute>59)
{
minute=0;
hour++;
if(hour>24)
{
hour=0;
month_day(); //接month_day函數(shù)
}
}
}
}
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時(shí),8分,11秒
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi); //0x30是ascii對(duì)應(yīng)的數(shù)字0
write_date(0x30+ge); //由1602初始化得知指針每寫一個(gè)字符后地址自動(dòng)加一
}
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對(duì)應(yīng)的數(shù)字0
write_date(0x30+ge); //由1602初始化得知指針每寫一個(gè)字符后地址自動(dòng)加一
}
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); //時(shí)
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++;
}
}
|