#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
unsigned char code table1[]={"2013-02-29 WEN"};
unsigned char code table2[]={"23:59:55"};
unsigned char code table3[]={"SUNMONTUSWENTHRFRISAT"};
uchar shi=23,fen=59,miao=55,a=3,ri=29,yue=2,nian=13;
unsigned char cnt_w=0;
void shiADD();
void fenADD();
void miaoADD();
void shiDEC();
void fenDEC();
void miaoDEC();
void delay(uint x) //延时函数
{
while(x--)
{;}
}
void WrCommand(uchar comm)
{
delay(300);
RS=0; //进行指令的操作
RW=0; //进行写的操作
E=1;
P0=comm;
E=0;
}
void WrData(uchar dat)
{
delay(300);
RS=1;
RW=0;
E=1;
P0=dat;
E=0;
}
void LCD_init()
{
unsigned char num;
WrCommand(0x01); //清屏
WrCommand(0x38); //设置16*2显示,5*7点阵,8位数据接口
WrCommand(0x06); //光标右移
WrCommand(0x0c); //开显示,不显示光标
WrCommand(0x80+1);
for(num=0;num<14;num++)
{
WrData(table1[num]);
delay(300);
}
WrCommand(0xc0+4);
for(num=0;num<8;num++)
{
WrData(table2[num]);
delay(300);
} //显示开及光标设置
}
void T0_init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
}
void writetime(uchar add,uchar t) //将时间用1602液晶显示的函数
{
uchar n,m;
n=t%10;
m=t/10;
WrCommand(0xc0+add);
WrData(0x30+n);
WrCommand(0xc0+add-1);
WrData(0x30+m);
}
void writedate(uchar add,uchar date)//将日期用1602液晶显示的函数
{
uchar i,j;
i=date/10;
j=date%10;
WrCommand(0x80+add);
WrData(0x30+j);
WrCommand(0x80+add-1);
WrData(0x30+i);
}
void xingqi(uchar z) //星期显示函数
{
WrCommand(0x80+0x0c);
WrData(table3[3*z]);
WrCommand(0x80+0x0d);
WrData(table3[3*z+1]);
WrCommand(0x80+0x0e);
WrData(table3[3*z+2]);
}
void KeyScan()
{
uchar KeyValue,temp;
KeyValue=P1;
if(KeyValue!=0xff)
{
delay(20);
KeyValue=P1;
if(KeyValue!=0xff)
{
do{
temp=P1;
}while(temp!=0xff);
switch(KeyValue)
{
case 0xfe:cnt_w++;
if(cnt_w>=4)
cnt_w=0;
break;
case 0xfd:switch(cnt_w)
{
case 1:shiADD();
break;
case 2:fenADD();
break;
case 3:miaoADD();
break;
default:break;
}
break;
case 0xfb:switch(cnt_w)
{
case 1:shiDEC();
break;
case 2:fenDEC();
break;
case 3:miaoDEC();
break;
default:break;
}
break;
case 0xf7:TR0=!TR0;
break;
default: break;
}
}
}
}
void main()
{
unsigned char year;
LCD_init();
T0_init();
EA=1;
while(1)
{
KeyScan();
if(miao>=60)
{
miao=0;
fen++;
}
writetime(11,miao);
if(fen>=60)
{
fen=0;
shi++;
}
writetime(8,fen);
if(shi>=24)
{
shi=0;
a++;
ri++;
}
writetime(5,shi);
if(a>=7)
{
a=0;
}
xingqi(a);
if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
{
if(ri>31)
{
ri=1;
yue++;
}
else
{
if(yue==4||yue==6||yue==9||yue==11)
{
if(ri>30)
{
ri=1;
yue++;
}
}
}
}
writedate(10,ri);
if(yue==2)
{
if((year%4==0&&year%100!=0)||year%400==0)
{
if(ri>29)
{
ri=1;
yue++;
}
}
}
else
{
if(ri>28)
{
ri=1;
yue++;
}
}
writedate(10,ri);
if(yue>=13)
{
yue=1;
nian++;
}
writedate(7,yue);
if(nian>=100)
{
nian=0;
}
writedate(7,yue);
writedate(4,nian);
}
}
uchar cnt_ms;
void T0_ISR() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
cnt_ms++;
if(cnt_ms==20)
{
cnt_ms=0;
miao++;
}
}
void shiADD()
{
shi++;
if(shi>=24)
{
shi=0;
}
}
void fenADD()
{
fen++;
if(fen>=60)
{
fen=0;
shiADD();
}
}
void miaoADD()
{
miao++;
if(miao>=60)
{
miao=0;
fenADD();
}
}
void shiDEC()
{
if(shi==0)
shi=23;
else
shi--;
}
void fenDEC()
{
if(fen==0)
fen=59;
else
fen--;
}
void miaoDEC()
{
if(miao==0)
miao=59;
else
miao--;
}
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
unsigned char code table1[]={"2013-02-29 WEN"};
unsigned char code table2[]={"23:59:55"};
unsigned char code table3[]={"SUNMONTUSWENTHRFRISAT"};
uchar shi=23,fen=59,miao=55,a=3,ri=29,yue=2,nian=13;
unsigned char cnt_w=0;
void shiADD();
void fenADD();
void miaoADD();
void shiDEC();
void fenDEC();
void miaoDEC();
void delay(uint x) //延时函数
{
while(x--)
{;}
}
void WrCommand(uchar comm)
{
delay(300);
RS=0; //进行指令的操作
RW=0; //进行写的操作
E=1;
P0=comm;
E=0;
}
void WrData(uchar dat)
{
delay(300);
RS=1;
RW=0;
E=1;
P0=dat;
E=0;
}
void LCD_init()
{
unsigned char num;
WrCommand(0x01); //清屏
WrCommand(0x38); //设置16*2显示,5*7点阵,8位数据接口
WrCommand(0x06); //光标右移
WrCommand(0x0c); //开显示,不显示光标
WrCommand(0x80+1);
for(num=0;num<14;num++)
{
WrData(table1[num]);
delay(300);
}
WrCommand(0xc0+4);
for(num=0;num<8;num++)
{
WrData(table2[num]);
delay(300);
} //显示开及光标设置
}
void T0_init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
}
void writetime(uchar add,uchar t) //将时间用1602液晶显示的函数
{
uchar n,m;
n=t%10;
m=t/10;
WrCommand(0xc0+add);
WrData(0x30+n);
WrCommand(0xc0+add-1);
WrData(0x30+m);
}
void writedate(uchar add,uchar date)//将日期用1602液晶显示的函数
{
uchar i,j;
i=date/10;
j=date%10;
WrCommand(0x80+add);
WrData(0x30+j);
WrCommand(0x80+add-1);
WrData(0x30+i);
}
void xingqi(uchar z) //星期显示函数
{
WrCommand(0x80+0x0c);
WrData(table3[3*z]);
WrCommand(0x80+0x0d);
WrData(table3[3*z+1]);
WrCommand(0x80+0x0e);
WrData(table3[3*z+2]);
}
void KeyScan()
{
uchar KeyValue,temp;
KeyValue=P1;
if(KeyValue!=0xff)
{
delay(20);
KeyValue=P1;
if(KeyValue!=0xff)
{
do{
temp=P1;
}while(temp!=0xff);
switch(KeyValue)
{
case 0xfe:cnt_w++;
if(cnt_w>=4)
cnt_w=0;
break;
case 0xfd:switch(cnt_w)
{
case 1:shiADD();
break;
case 2:fenADD();
break;
case 3:miaoADD();
break;
default:break;
}
break;
case 0xfb:switch(cnt_w)
{
case 1:shiDEC();
break;
case 2:fenDEC();
break;
case 3:miaoDEC();
break;
default:break;
}
break;
case 0xf7:TR0=!TR0;
break;
default: break;
}
}
}
}
void main()
{
unsigned char year;
LCD_init();
T0_init();
EA=1;
while(1)
{
KeyScan();
if(miao>=60)
{
miao=0;
fen++;
}
writetime(11,miao);
if(fen>=60)
{
fen=0;
shi++;
}
writetime(8,fen);
if(shi>=24)
{
shi=0;
a++;
ri++;
}
writetime(5,shi);
if(a>=7)
{
a=0;
}
xingqi(a);
if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
{
if(ri>31)
{
ri=1;
yue++;
}
else
{
if(yue==4||yue==6||yue==9||yue==11)
{
if(ri>30)
{
ri=1;
yue++;
}
}
}
}
writedate(10,ri);
if(yue==2)
{
if((year%4==0&&year%100!=0)||year%400==0)
{
if(ri>29)
{
ri=1;
yue++;
}
}
}
else
{
if(ri>28)
{
ri=1;
yue++;
}
}
writedate(10,ri);
if(yue>=13)
{
yue=1;
nian++;
}
writedate(7,yue);
if(nian>=100)
{
nian=0;
}
writedate(7,yue);
writedate(4,nian);
}
}
uchar cnt_ms;
void T0_ISR() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
cnt_ms++;
if(cnt_ms==20)
{
cnt_ms=0;
miao++;
}
}
void shiADD()
{
shi++;
if(shi>=24)
{
shi=0;
}
}
void fenADD()
{
fen++;
if(fen>=60)
{
fen=0;
shiADD();
}
}
void miaoADD()
{
miao++;
if(miao>=60)
{
miao=0;
fenADD();
}
}
void shiDEC()
{
if(shi==0)
shi=23;
else
shi--;
}
void fenDEC()
{
if(fen==0)
fen=59;
else
fen--;
}
void miaoDEC()
{
if(miao==0)
miao=59;
else
miao--;
}