# include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;
sbit key1=P2^3; //調時
sbit key2=P2^4; //加
sbit key3=P2^5; //減
uchar miao,fen,shi,ri,zhou,yue,year; // 秒,分,時,周,月,年
uchar code table[16]="20 - - wk: ";
uchar code table1[16]="time 23:59:57 ";
void delay(uchar a)
{
uchar x,y;
for(x=a;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{ rw=0;
rs=0;
en=0;
P0=com;
en=1;
delay(5);
en=0;
delay(5);
}
void write_date(uchar date)
{ rw=0;
rs=1;
en=0;
P0=date;
en=1;
delay(5);
en=0;
delay(5);
}
void write_nyr(uchar lie,uchar date) //第一行年月日周函數
{uchar a,b;
a=date/10;
b=date%10;
write_com(0x80+lie);
write_date(0x30+a);
write_date(0x30+b);
}
void write_sfm(uchar lie,uchar date) //第二行寫入時分秒函數
{ uchar a,b;
a=date/10;
b=date%10;
write_com(0x80+0x40+lie);
write_date(0x30+a);
write_date(0x30+b);
}
void init()
{ uchar i ;
en=0;
shi=23;
fen=59;
miao=57;
year=15;
yue=5;
ri=12;
zhou=6;
write_com(0x38); //顯示
write_com(0x0c); //開光標
write_com(0x06); //指針加一
write_com(0x01); //清屏
write_com(0x80); //第一行
for(i=0;i<15; i++)
{
write_date(table[i]);
delay(5);
}
write_nyr(2,year);
write_nyr(5,yue);
write_nyr(8,ri);
write_nyr(14,zhou);
write_com(0x80+0x40); //第二行
for(i=0;i<15; i++)
{
write_date(table1[i]);
delay(5);
}
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
uchar i,k,temp,n,m; //i記錄調時鍵按下次數,K,m,n為標志位,temp為年份
void key_scan(void)
{
temp=2000+year;
if(((temp%4==0)&&(temp%100!=0))||(temp%400==0))
n=1; //閏年
else
n=0; //非閏年
if(key1==0) //調時鍵按下
delay(10);
if(key1==0)
{ while(!key1); //按鍵釋放
i++;
if(i==1)
{TR0=0; //停止定時
write_com(0x80+0x40+12);
write_com(0x0f);
k=1; //K=1為秒標志位
}
if(i==2)
{ TR0=0;
write_com(0x80+0x40+9);
write_com(0x0f);
k=2; //k=2為分標志位
}
if(i==3)
{ TR0=0;
write_com(0x80+0x40+6);
write_com(0x0f);
k=3; //k=3為時標志位
}
if(i==4)
{ TR0=0;
write_com(0x80+3);
write_com(0x0f);
k=4; //k=4為年標志位
}
if(i==5)
{ TR0=0;
write_com(0x80+6);
write_com(0x0f);
k=5; //k=5為月標志位
}
if(i==6)
{ TR0=0;
write_com(0x80+9);
write_com(0x0f);
k=6; //k=3為日標志位
}
if(i==7)
{ TR0=0;
write_com(0x80+15);
write_com(0x0f);
k=7; //k=3為周標志位
}
if(i==8)
{i=0;
TR0=1; //啟動定時
write_com(0x0c); //消除光標
}
}
if((key2==0)&&(k==1)) //秒加鍵按下
delay(10);
if((key2==0)&&(k==1))
{ while(!key2);
miao++;
if(miao==60)
miao=0;
write_sfm(11,miao); //寫入時分秒函數
write_com(0x80+0x40+12); //光標位置
}
if((key3==0)&&(k==1)) //秒減鍵按下
delay(10);
if((key3==0)&&(k==1))
{ while(!key3);
miao--;
if(miao==-1)
miao=59;
write_sfm(11,miao); //寫入時分秒函數
write_com(0x80+0x40+12); //光標位置
}
if((key2==0)&&(k==2)) //分加鍵按下
delay(10);
if((key2==0)&&(k==2))
{ while(!key2);
fen++;
if(fen==60)
fen=0;
write_sfm(8,fen); //寫入時分秒函數
write_com(0x80+0x40+9); //光標位置
}
if((key3==0)&&(k==2)) //分減鍵按下
delay(10);
if((key3==0)&&(k==2))
{ while(!key3);
fen--;
if(fen==-1)
fen=59;
write_sfm(8,fen); //寫入時分秒函數
write_com(0x80+0x40+9); //光標位置
}
if((key2==0)&&(k==3)) //時加鍵按下
delay(10);
if((key2==0)&&(k==3))
{ while(!key2);
shi++;
if(shi==24)
shi=0;
write_sfm(5,shi); //寫入時分秒函數
write_com(0x80+0x40+6); //光標位置
}
if((key3==0)&&(k==3)) //時減鍵按下
delay(10);
if((key3==0)&&(k==3))
{ while(!key3);
shi--;
if(shi==-1)
shi=23;
write_sfm(5,shi); //寫入時分秒函數
write_com(0x80+0x40+6); //光標位置
}
if((key2==0)&&(k==4)) //年加鍵按下
delay(10);
if((key2==0)&&(k==4))
{ while(!key2);
year++;
write_nyr(2,year); //寫入年月日函數
write_com(0x80+3); //光標位置
}
if((key3==0)&&(k==4)) //年減鍵按下
delay(10);
if((key3==0)&&(k==4))
{ while(!key3);
year--;
write_nyr(2,year); //寫入年月日函數
write_com(0x80+3); //光標位置
}
if((key2==0)&&(k==5)) //月加鍵按下
delay(10);
if((key2==0)&&(k==5))
{ while(!key2);
yue++;
if(yue==13)
yue=1;
write_nyr(5,yue); //寫入年月日函數
write_com(0x80+6); //光標位置
}
if((key3==0)&&(k==5)) //月減鍵按下
delay(10);
if((key3==0)&&(k==5))
{ while(!key3);
yue--;
if(yue==0)
yue=12;
write_nyr(5,yue); //寫入年月日函數
write_com(0x80+6); //光標位置
}
if((key2==0)&&(k==6)) //日加鍵按下
delay(10);
if((key2==0)&&(k==6))
{ while(!key2);
ri++;
switch(yue)
{ case 1: case 3: case 5: case 7: case 8: case 10: case 12:
m=1;break; //大月
case 4: case 6: case 9: case 11:
m=2;break; //小月
case 2: m=3; break; //二月
}
if(ri==32)
{ri=1;}
if((ri==32)&&(m==1))
{ ri=1; }
if((ri==31)&&(m==2))
{ ri=1; }
if((ri==30)&&(m==3)&&(n==1))
{ ri=1; } //閏年二月
if((ri==29)&&(m==3)&&(n==0))
{ ri=1; } //非閏年二月
write_nyr(8,ri); //寫入年月日函數
write_com(0x80+9); //光標位置
}
if((key3==0)&&(k==6)) //日減鍵按下
delay(10);
if((key3==0)&&(k==6))
{ while(!key3);
ri--;
switch(yue)
{ case 1: case 3: case 5: case 7: case 8: case 10: case 12:
m=4; break; //大月
case 4: case 6: case 9: case 11:
m=5; break; //小月
case 2: m=6; break; //二月
}
if((m==4)&&(ri==0))
{ ri=31;}
if((m==5)&&(ri==0))
{ ri=30;}
if((n==1)&&(m==6)&&(ri==0)) //閏年2月
{ ri=29;}
if((n==0)&&(m==6)&&(ri==0)) //非閏年2月
{ ri=28;}
write_nyr(8,ri); //寫入年月日函數
write_com(0x80+9); //光標位置
}
if((key2==0)&&(k==7)) //周加鍵按下
delay(10);
if((key2==0)&&(k==7))
{ while(!key2);
zhou++;
if(zhou==8)
zhou=1;
write_nyr(14,zhou); //寫入年月日函數
write_com(0x80+15); //光標位置
}
if((key3==0)&&(k==7)) //周減鍵按下
delay(10);
if((key3==0)&&(k==7))
{ while(!key3);
zhou--;
if(zhou==0)
zhou=7;
write_nyr(14,zhou); //寫入年月日函數
write_com(0x80+15); //光標位置
}
}
void compare_r( uchar b) //判斷日滿函數
{
if((b==32)&&((m==1)||(m==4)))
{ b=1;
yue++;
if(yue==13)
{ year++;
write_nyr(2,year);
}
write_nyr(5,yue);
}
if((b==31)&&((m==2)||(m==5)))
{ b=1;
yue++;
if(yue==13)
{ year++;
write_nyr(2,year);}
write_nyr(5,yue);
}
if((b==30)&&((m==3)||(m==6))&&(n==1))
{ b=1;
yue++;
if(yue==13)
{ year++;
write_nyr(2,year);}
write_nyr(5,yue);
}
if((b==29)&&((m==3)||(m==6))&&(n==0))
{b=1 ;
yue++;
if(yue==13)
{ year++; }
write_nyr(2,year);
write_nyr(5,yue);
}
write_nyr(8,b);
}
void compare_y( uchar a) //判月滿
{
if(a==13)
{ a=1;
write_nyr(2,year);
}
write_nyr(5,a);
}
void main(void)
{
init();
while(1)
{ key_scan();
}
}
void time0() interrupt 1
{ uint t;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==20)
{
t=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{ shi=0;
zhou++;
ri++;
compare_r(ri); //判日滿
compare_y(yue); //判月滿
if(zhou==8)
{ zhou=1;}
write_nyr(14,zhou);
}
write_sfm(5,shi);
}
write_sfm(8,fen);
}
write_sfm(11,miao);
}
}
|