#include<reg52.h>
sbit lcdrs=P1^0;
sbit lcdrw=P1^1;
sbit lcden=P1^2;
unsigned char code table1[]={"MonTueWedTurFriSatSun"};
unsigned char code table3[]={"0123456789"};
int num=0,i;
int nian=2009,yue=11,ri=3,shi=10,fen=5,miao=0,week=3;
void delay(int t) //延时
{
int a,b;
for(a=t;a>0;a--)
for(b=50;b>0;b--);
}
void write_com(unsigned char com) //液显指令操作
{
lcdrs=0;
lcdrw=0;
P2=com;
delay(2);
lcden=1;
delay(2);
lcden=0;
}
void write_date(unsigned char date) //液显数据操作
{
lcdrs=1;
lcdrw=0;
P2=date;
delay(2);
lcden=1;
delay(2);
lcden=0;
}
void lcd_init() //液显初始化
{
lcdrs=0;
lcden=0;
write_com(0x38);
write_com(0x01);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
write_com(0x80+0x05);
write_date('-');
write_com(0x80+0x08);
write_date('-');
write_com(0x80+0x46);
write_date(':');
write_com(0x80+0x49);
write_date(':');
}
void run_nian() //闰年
{
if(num==19)
{
num=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
ri++;
week++;
if(week==21) week=0;
if(yue==1||3||5||7||8||10||12)
{
if(ri>31)
{
ri=1;
yue++;
}
}
if(yue==2)
{
if(ri>28)
{
ri=1;
yue++;
}
}
if(yue==4||6||9||11)
{
if(ri>30)
{
ri=1;
yue++;
}
}
if(yue>12)
{
yue=1;
nian++;
}
}
}
}
}
}
void ping_nian() //平年
{
if(num==19)
{
num=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
ri++;
week=week+3;
if(week==21) week=0;
if(yue==1||3||5||7||8||10||12)
{
if(ri>31)
{
ri=1;
yue++;
}
}
if(yue==2)
{
if(ri>29)
{
ri=1;
yue++;
}
}
if(yue==4||6||9||11)
{
if(ri>30)
{
ri=1;
yue++;
}
}
if(yue>12)
{
yue=1;
nian++;
}
}
}
}
}
}
void time_a() //闰年 平年
{
if(nian%400==0)
{
run_nian();
}
else
{
if(nian%4==0 && nian%100!=0)
{
run_nian();
}
else
{
ping_nian();
}
}
}
void display_nian(int nian1) //显示年份
{
int n0,n1,n2,n3;
n3=nian1/1000;
n2=nian1/100%10;
n1=nian1/10%10;
n0=nian1%10;
write_com(0x80+0x01);
write_date(table3[n3]);
write_com(0x80+0x02);
write_date(table3[n2]);
write_com(0x80+0x03);
write_date(table3[n1]);
write_com(0x80+0x04);
write_date(table3[n0]);
}
void display_yue(int yue1) //显示月份
{
int n0,n1;
n1=yue1/10;
n0=yue1%10;
write_com(0x80+0x06);
write_date(table3[n1]);
write_com(0x80+0x07);
write_date(table3[n0]);
}
void display_ri(int ri1) //显示号数
{
int n0,n1;
n1=ri1/10;
n0=ri1%10;
write_com(0x80+0x09);
write_date(table3[n1]);
write_com(0x80+0x0a);
write_date(table3[n0]);
}
void display_week(int week1) //显示星期
{
int x;
write_com(0x80+0x0c);
for(x=0;x<3;x++)
{
write_date(table1[week1]);
week1++;
}
}
void display_shi(int shi1) //显示小时
{
int n0,n1;
n1=shi1/10;
n0=shi1%10;
write_com(0x80+0x44);
write_date(table3[n1]);
write_com(0x80+0x45);
write_date(table3[n0]);
}
void display_fen(int fen1) //显示分钟
{
int n0,n1;
n1=fen1/10;
n0=fen1%10;
write_com(0x80+0x47);
write_date(table3[n1]);
write_com(0x80+0x48);
write_date(table3[n0]);
}
void display_miao(int miao1) //显示秒
{
int n0,n1;
n1=miao1/10;
n0=miao1%10;
write_com(0x80+0x4a);
write_date(table3[n1]);
write_com(0x80+0x4b);
write_date(table3[n0]);
}
void main()
{
EA=1;
ET1=1;
TMOD=0x10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
lcd_init();
while(1)
{
display_nian(nian);
display_yue(yue);
display_ri(ri);
display_week(week);
display_shi(shi);
display_fen(fen);
display_miao(miao);
}
}
void time1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
num++;
time_a();
}