#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++;
}
}
|