#define uchar unsigned char
sbit rs=P1^2;
sbit rw=P1^1;
sbit en=P1^0;
uchar code table[]=\" 2012-03-15 blue\";
uchar code table1[]=\" 10:34:56 sky\";
uchar code table2[]={31,28,31,30,31,30,31,30,30,31,30,31}; uchar code table3[]={31,29,31,30,31,30,31,30,30,31,30,31}; uchar count=0;
uchar hour=10;
uchar min=34;
uchar sec=56;
//平年
//闰年
uchar t;
uchar year1=20;
uchar year2=12;
uchar month=03;
uchar day=15;
void delay(uchar m) {
uchar i,j;
for(i=m;i>0;i--)
for(j=5;j>0;j--)
;
}
void wr_com(uchar com) //延时子程序
//写命令子程序
{
rs=0;
rw=0;
en=0;
P2=com;
delay(1);
en=1;
delay(5);
en=0;
}
void wr_dat(uchar dat)//写数据子程序
{
rs=1;
rw=0;
en=0;
P2=dat;
delay(1);
en=1;
delay(5);
en=0;
}
void init()
{
en=0;
wr_com(0x38); wr_com(0x0c); //设置16*2显示,5*7点阵,8位数据接口//开显示,显示光标,光标闪烁
wr_com(0x06); //当读或写一个字符后地址指针自动加1,整屏不移动
//数据指针清零,所有显示清零
wr_com(0x80+0x00); //设置数据指针地址
for(t=0;t<16;t++) {
wr_dat(table[t]);
delay(1);
}
wr_com(0x80+0x40);
for(t=0;t<15;t++) {
wr_dat(table1[t]);
delay(1);
//写入第一行数据
//写入第二行数据
}
}
void timer_init() //开定时器0
{
TMOD=0X01;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
EA=1;
ET0=1;
TR0=1;
}
void hour_sfm(uchar add,uchar da) {
//刷新时间函数
uchar shi,ge;
shi=da/10;
ge=da%10;
wr_com(0x80+0x40+add);
wr_dat(0x30+shi);
wr_dat(0x30+ge);
}
void month_sfm(uchar add,uchar da) {
uchar shi,ge;
shi=da/10;
ge=da%10;
wr_com(0x80+add);
//刷新时间函数
wr_dat(0x30+shi);
wr_dat(0x30+ge);
}
void main()
{
init();
timer_init();
while(1)
{
if(count==100) {
count=0;
sec++;
//计数100次为一秒
if(sec>=59) //到一分了吗?
{
sec=0;
min++;
if(min>=59) //到一小时了吗
{
min=0;
hour++;
{
if(hour>=23) //到一天了吗
hour=0;
day++;
}
hour_sfm(2,hour);
}
hour_sfm(5,min);
}
hour_sfm(8,sec);
}
if((year1*100+year2)%4==0&(year1*100+year2)%100!=0) {
if(day>=table3[month-1]) //天数到了吗
{
day=1;
month++;
//是闰年吗
if(month==13) {
month=1;
year2++;
if(year2>=99) {
year2=0;
year1++;
month_sfm(1,year1); }
month_sfm(3,year2); }
month_sfm(6,month); //月数到了吗
//年的低位满了吗
//进入年高位刷新函数
//进入年低位刷新函数
//进入月刷新函数
}
month_sfm(9,day); }
else
{
if(day>=table2[month-1]) {
day=1;
month++;
if(month==13) {
month=1;
year2++;
//进入年日刷新函数
//天数到了吗
//月数到了吗
if(year2>=99) //年的低位满了吗
{
year2=0;
year1++;
month_sfm(1,year1); }
month_sfm(3,year2); }
month_sfm(6,month); } month_sfm(9,day); }
}
//进入年高位刷新函数
//进入年低位刷新函数
//进入月刷新函数
//进入日刷新函数
}
void timer0() interrupt 1 //定时器服务程序
{
TH0=(65535-10000)/256;
TL0=(65535-10000)%256; //重装初值
count++; //计数器加1
}