新闻中心

EEPW首页>嵌入式系统>设计应用> 用定时器中断设计时钟,用1602液晶显示

用定时器中断设计时钟,用1602液晶显示

作者: 时间:2016-11-28 来源:网络 收藏
时钟有些功能还未完全实现,仅实现一部分功能,年月日星期功能还未实现 还可以加上整点报时和断电记忆的功能

本文引用地址://m.amcfsurvey.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()interrupt1//中断服务程序

{

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);//显示秒

}

}



评论


技术专区

关闭