#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit lcden=P2^7;
sbit key1=P1^0; //定义按键接口
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
uchar code table[]="0123456789:";
uchar num,shi=23,fen=59,miao=56,num1,shi1,shi2,fen1,fen2,miao1,miao2;
uint nian=1999,nian1,nian2,nian3,nian4,yue=12,yue1,yue2,ri=31,ri1,ri2;
uchar change=1,mode=1;
/*************************延时函数***************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*********************写入液晶指令**************************/
void write_com(uchar com)
{
lcdrs=0;
lcdrw=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
lcdrw=0;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
/*******************************导入中断**********************************/
void write_char(uchar x,uchar y,uchar date)
{
if(y==0)
{
write_com(0x80+x);
}
else
{
write_com(0xC0+x);
}
write_date(date);
}
/******************************平闰年**************************************/
void upprn()//加
{
if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) //三十一天的月份
{
if(ri==32)
{
ri=1;
yue++;
if(yue==13)
{
yue=1;
nian++;
if(nian==10000)
{
nian=0;
}
}
}
}
if(yue==4||yue==6||yue==9||yue==11) //三十天的月份
{
if(ri==31)
{
ri=1;
yue++;
}
}
if(yue==2) //二月份,可判断平年闰年
{
if(nian%400==0||(nian%4==0&&nian%100!=0)) //闰年
{
if(ri==30)
{
ri=1;
yue++;
}
}
else //平年
{
if(ri==29)
{
ri=1;
yue++;
}
}
}
}
void dnprn() //减
{
if(ri==0) //是否减小了一个月
{
if(yue==1) //按下按键减小一个月时这个月是不是一月
{
ri=31;
yue=12;
nian--;
if(nian==-1) //年是否达到了00年
{
nian=9999;
}
}
else //如果这个月不是一月
{
ri=31; //让日为三十
yue--;
if(yue==4||yue==6||yue==9||yue==11) //减小后的月是几月
{
ri=30;
}
if(yue==2)
{
if(nian%400==0||(nian%4==0&&nian%100!=0)) //闰年
{
ri=29;
}
else //平年
{
ri=28;
}
}
}
}
}
/*************************************显示*****************************************/
void display1(uchar shi1,uchar shi2,uchar fen1,uchar fen2,uchar miao1,uchar miao2)
{
/*************************时钟************************************/
write_char(1,1,table[shi1]);
write_char(2,1,table[shi2]);
write_char(3,1,table[10]);
write_char(4,1,table[fen1]);
write_char(5,1,table[fen2]);
write_char(6,1,table[10]);
write_char(7,1,table[miao1]);
write_char(8,1,table[miao2]);
write_char(11,1,table[mode]);
}
void display2(uchar nian1,uchar nian2,uchar nian3,uchar nian4,uchar yue1,uchar yue2,uchar ri1,uchar ri2)
{
write_char(1,0,table[nian1]);
write_char(2,0,table[nian2]);
write_char(3,0,table[nian3]);
write_char(4,0,table[nian4]);
write_char(5,0,table[10]);
write_char(6,0,table[yue1]);
write_char(7,0,table[yue2]);
write_char(8,0,table[10]);
write_char(9,0,table[ri1]);
write_char(10,0,table[ri2]);
}
/*************************************************按键*******************************************/
void keyscan()
{
/****按键一负责切换按键方式,第一下时钟的加,第二下日历的加,
第三下时钟的减,第四下日历的减****************************/
if(key1==0)
{
delay(10);
if(key1==0)
{
while(!key1);
change++;
mode=change;
if(change==5)
{
change=1;
}
if(mode==5)
{
mode=1;
}
}
}
/*******************按键二负责切换年时的加减*******************************/
if(key2==0)
{
delay(10);
if(key2==0)
{
while(!key2);
/**********时钟的加*************/
if(change==1) //如果是时钟
{
shi++; //时++
if(shi==24) //溢出归零
{
shi=0;
ri++;
upprn(); //加的平闰年
}
}
/*************日历的加*****************/
if(change==2) //如果显示是日历
{
nian++; //年++
if(nian==10000) //溢出归零
{
nian=0;
}
}
/*****************时钟的减***************/
if(change==3) //时--
{
shi--;
if(shi==-1)
{
shi=23;
ri--;
dnprn(); //向下减得平闰年
}
}
/*****************日历的减****************/
if(change==4) //年--
{
nian--;
if(nian==-1)
{
nian=9999;
}
}
}
}
/******************************按键三负责切换月分的加减********************/
if(key3==0)
{
delay(10);
if(key3==0)
{
while(!key3);
/*******************时钟的加*******************/
if(change==1) //如果是时钟
{
fen++; //时++
if(fen==60) //溢出归零
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
ri++;
upprn();
}
}
}
/********************日历的加********************/
if(change==2) //如果显示是日历
{
yue++; //年++
if(yue==13) //溢出归零
{
yue=1;
}
}
/*****************时钟的减*********************/
if(change==3)
{
fen--; //分--
if(fen==-1)
{
fen=59;
shi--;
if(shi==-1)
{
shi=23;
ri--;
dnprn(); //向下减的平闰年
}
}
}
/********************日历的减*******************/
if(change==4)
{
yue--; //月--
if(yue==0)
{
yue=12;
nian--;
if(nian==-1)
{
nian=9999;
}
}
}
}
}
/*************************按键四负责切换日秒的加减**********************/
if(key4==0)
{
delay(10);
if(key4==0)
{
while(!key4);
/*****************************时钟的加*************************/
if(change==1) //如果是时钟
{
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
ri++;
upprn(); //加的平闰年
}
}
}
}
/***********************日历的加*****************************/
if(change==2) //如果是日历
{
ri++;
upprn(); //加的平闰年
}
/***********************时钟的减********************************/
if(change==3) //秒--
{
miao--;
if(miao==-1)
{
miao=59;
fen--;
if(fen==-1)
{
fen=59;
shi--;
if(shi==-1)
{
shi=23;
ri--;
dnprn(); //减的平闰年
}
}
}
}
/*******************************日历的减*****************************/
if(change==4) //日--
{
ri--;
dnprn(); //减的平闰年
}
}
}
}
/************************执行函数***************************/
void main()
{
init();
while(1)
{
keyscan();
shi1=shi/10;
shi2=shi%10;
fen1=fen/10;
fen2=fen%10;
miao1=miao/10;
miao2=miao%10;
ri1=ri/10;
ri2=ri%10;
yue1=yue/10;
yue2=yue%10;
nian1=nian/1000;
nian2=nian%1000/100;
nian3=nian%1000%100/10;
nian4=nian%1000%100%10;
display1(shi1,shi2,fen1,fen2,miao1,miao2);
display2(nian1,nian2,nian3,nian4,yue1,yue2,ri1,ri2);
}
}
/************************中断函数****************************/
void T0_time()interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==20)
{
num1=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
ri++;
upprn();
}
}
}
}
}
|