用定時器中斷設計時鐘,用1602液晶顯示;
參考原始碼如下:
#include
#define uchar unsigned char
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-01 SAT";
uchar code table2[]="00:00:00";
uchar t,s1num;
char shi,fen,miao;
void delay(uchar z) //延遲zms函式
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //液晶寫指令操作
rd=0;
wr=0;
delay(5);
lcde=1;
P0=com;
lcde=0;
void write_date(uchar date) //液晶寫資料操作
rd=1;
P0=date;
void write_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);
void init() //初始化函式
uchar i;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x00);
for(i=0;i
write_date(table1[i]);
write_com(0x80+0x46);
write_date(table2[i]);
TMOD=0x01; //定時器工作方式
TH0=(65536-50000)/256; //設定定時器初值
TL0=(65536-50000)%6; //12M晶振時ms數為
EA=1;
ET0=1;
TR0=1;
void keyscan() //鍵盤掃描函式
if(k1==0) //按下k1鍵確定調時分秒
if(k1==0)
s1num++;
while(!k1)
;
while(!k1);
if(s1num==1)
TR0=0; //暫停計時器
write_com(0x80+0x4d); //游標在秒的位置閃爍
write_com(0x0f);
if(s1num==2) //游標在分的位置
TR0=0;
write_com(0x80+0x4a);
if(s1num==3)
write_com(0x80+0x47);
if(s1num==4) //按下第四下時接著走時
s1num=0;
if(s1num!=0)
if(k2==0) //按k2鍵秒加
if(k2==0)
while(!k2);
miao++;
if(miao==60)
miao=0;
write_sfm(0x0c,miao);
write_com(0x80+0x4d);
if(s1num==2)
if(k2==0) //分加
fen++;
if(fen==60)
fen=0;
write_sfm(0x09,fen);
if(k2==0) //時加
shi++;
if(shi==24)
shi=0;
write_sfm(0x06,shi);
if(k4==0) //判斷k3是否被按下
if(k4==0)
while(!k4);
miao--; //秒減
if(miao==-1)
miao=59;
fen--; //分減
if(fen==-1)
fen=59;
shi--; //時減
if(shi==-1)
shi=23;
if(k8==0) // 按下k8退出調時
if(k8==0)
while(!k8);
void main()
init();
while(1)
keyscan();
void timer0() interrupt 1 //中斷服務程式
TH0=(65536-50000)/256;
TL0=(65536-50000)%6; //重新設定定時器初值
t++;
if(t==20) //定時器中斷次為秒
t=0;
write_sfm(0x06,shi); //顯示時
write_sfm(0x09,fen); //顯示分
write_sfm(0x0c,miao); //顯示秒
用定時器中斷設計時鐘,用1602液晶顯示;
參考原始碼如下:
#include
#define uchar unsigned char
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-01 SAT";
uchar code table2[]="00:00:00";
uchar t,s1num;
char shi,fen,miao;
void delay(uchar z) //延遲zms函式
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //液晶寫指令操作
{
rd=0;
wr=0;
delay(5);
lcde=1;
P0=com;
lcde=0;
}
void write_date(uchar date) //液晶寫資料操作
{
rd=1;
wr=0;
delay(5);
lcde=1;
P0=date;
lcde=0;
}
void write_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);
}
void init() //初始化函式
{
uchar i;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x00);
for(i=0;i
write_date(table1[i]);
write_com(0x80+0x46);
for(i=0;i
write_date(table2[i]);
TMOD=0x01; //定時器工作方式
TH0=(65536-50000)/256; //設定定時器初值
TL0=(65536-50000)%6; //12M晶振時ms數為
EA=1;
ET0=1;
TR0=1;
}
void keyscan() //鍵盤掃描函式
{
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;
}
}
}
void main()
{
init();
while(1)
{
keyscan();
}
}
void timer0() 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); //顯示秒
}
}