#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();
}
}
}
}
}
|