本時鐘有些功能還未完全實現,僅實現一部分功能,年月日星期功能還未實現 還可以加上整點報時和斷電記憶的功能
本文引用地址:http://www.ex-cimer.com/article/201611/322833.htm#include
#defineucharunsignedchar
sbit rd=P2^6;
sbit wr=P2^5;
sbit lcde=P2^7;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k4=P1^3;
sbit k8=P1^7;
uchar code table1[]=" 2011-10-01SAT";
uchar code table2[]="00:00:00";
uchar t,s1num;
charshi,fen,miao;
voiddelay(uchar z)//延遲zms函數
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(uchar com)//液晶寫指令操作
{
rd=0;
wr=0;
delay(5);
lcde=1;
P0=com;
lcde=0;
}
voidwrite_date(uchar date)//液晶寫數據操作
{
rd=1;
wr=0;
delay(5);
lcde=1;
P0=date;
lcde=0;
}
voidwrite_sfm(uchar add,uchar date)//更新時分秒
{
uchar shi,ge;
shi=date/10;
ge=date;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidinit()//初始化函數
{
uchar i;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x00);
for(i=0;i<15;i++)
write_date(table1[i]);
write_com(0x80+0x46);
for(i=0;i<8;i++)
write_date(table2[i]);
TMOD=0x01;//定時器工作方式
TH0=(65536-50000)/256;//設定定時器初值
TL0=(65536-50000)%6;//12M晶振時ms數為
EA=1;
ET0=1;
TR0=1;
}
voidkeyscan()//鍵盤掃描函數
{
if(k1==0)//按下k1鍵確定調時分秒
{
delay(5);
if(k1==0)
{
s1num++;
while(!k1)
;
delay(5);
while(!k1);
if(s1num==1)
{
TR0=0;//暫停計時器
write_com(0x80+0x4d);//光標在秒的位置閃爍
write_com(0x0f);
}
if(s1num==2)//光標在分的位置
{
TR0=0;
write_com(0x80+0x4a);
write_com(0x0f);
}
if(s1num==3)
{
TR0=0;
write_com(0x80+0x47);
write_com(0x0f);
}
if(s1num==4)//按下第四下時接著走時
{
s1num=0;
write_com(0x0c);
TR0=1;
}
}
}
if(s1num!=0)
{
if(s1num==1)
{
if(k2==0)//按k2鍵秒加
{
delay(5);
if(k2==0)
{
while(!k2);
delay(5);
while(!k2);
miao++;
if(miao==60)
miao=0;
write_sfm(0x0c,miao);
write_com(0x80+0x4d);
}
}
}
if(s1num==2)
{
if(k2==0)//分加
{
delay(5);
if(k2==0)
{
while(!k2);
delay(5);
while(!k2);
fen++;
if(fen==60)
fen=0;
write_sfm(0x09,fen);
write_com(0x80+0x4a);
}
}
}
if(s1num==3)
{
if(k2==0)//時加
{
delay(5);
if(k2==0)
{
while(!k2);
delay(5);
while(!k2);
shi++;
if(shi==24)
shi=0;
write_sfm(0x06,shi);
write_com(0x80+0x47);
}
}
}
if(k4==0)//判斷k3是否被按下
{
delay(5);
if(k4==0)
{
while(!k4);
delay(5);
while(!k4);
if(s1num==1)
{
miao--;//秒減
if(miao==-1)
miao=59;
write_sfm(0x0c,miao);
write_com(0x80+0x4d);
}
if(s1num==2)
{
fen--;//分減
if(fen==-1)
fen=59;
write_sfm(0x09,fen);
write_com(0x80+0x4a);
}
if(s1num==3)
{
shi--;//時減
if(shi==-1)
shi=23;
write_sfm(0x06,shi);
write_com(0x80+0x47);
}
}
}
}
if(k8==0)//按下k8退出調時
{
delay(5);
if(k8==0)
{
while(!k8);
delay(5);
while(!k8);
s1num=0;
write_com(0x0c);
TR0=1;
}
}
}
voidmain()
{
init();
while(1)
{
keyscan();
}
}
voidtimer0() interrupt 1//中斷服務程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;//重新設定定時器初值
t++;
if(t==20)//定時器中斷次為秒
{
t=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(0x06,shi);//顯示時
}
write_sfm(0x09,fen);//顯示分
}
write_sfm(0x0c,miao);//顯示秒
}
}
評論