12864汉字液晶显示按键电子时钟程序.docx
《12864汉字液晶显示按键电子时钟程序.docx》由会员分享,可在线阅读,更多相关《12864汉字液晶显示按键电子时钟程序.docx(11页珍藏版)》请在冰豆网上搜索。
12864汉字液晶显示按键电子时钟程序
12864汉字液晶显示按键电子时钟程序
12864汉字液晶显示--按键电子时钟程序
12864汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)
#include
#include
#defineucharunsignedchar
voidlcd_ini();
voidascii_change(void);
voiddelay();
voidwri_add(ucharcom);
voidwri_dat(ucharcom1);
voidshan(void);
voiddisp();
voidtkey(void);
sbitcs=P1^7;
sbitsid=P1^6;
sbitsclk=P1^5;
bitflag=1;
uchardat,count,f=1;//f测试哪个单元为当前闪烁状态
uchardataclock[3]={23,45,12};
ucharcodeclockname[10]={"北京时间:
"};
uchardatanum[6];
/*******主程序*************/
voidmain()
{
lcd_ini();
count=10;//机器周期为1us,每次定时50ms,此变量用来控制循环次数,在下面赋值为20,共定时1秒
TMOD=0x01;
TL0=0XB0;
TH0=0X3C;
EA=1;
ET0=1;
IT0=1;
EX0=1;
TR0=1;
while
(1)
{
back:
ascii_change();
disp();
delay();
if(flag==1)
gotoback;
tkey();
shan();
delay();
}
}
/****lcd初始化*******/voidlcd_ini()
{
wri_add(0x30);
delay();
wri_add(0x0c);
delay();
wri_add(0x01);
delay();wri_add(0x06);
delay();
}/********定时程序*************/
voidtimer1()interrupt1using2
{
TL0=0XB0;
TH0=0X3C;
count--;
if(count==0)
{
count=10;
clock[2]++;//秒//
}
else
gotoout;
if(clock[2]==60)
{
clock[2]=0;
clock[1]++;//分//
}
if(clock[1]==60)
{
clock[1]=0;
clock[0]++;
}if(clock[0]==24)//时//
clock[0]=0;out:
_nop_();
}
/*******十位个位转换成ASCII码************/
voidascii_change(void)
{
num[5]=clock[2]-(clock[2]/10)*10+0x30;
num[4]=clock[2]/10+0x30;
num[3]=clock[1]-(clock[1]/10)*10+0x30;
num[2]=clock[1]/10+0x30;
num[1]=clock[0]-(clock[0]/10)*10+0x30;
num[0]=clock[0]/10+0x30;
}
/********廷时程序*************/
voiddelay()
{
uchari,j;
for(i=250;i>0;i--)
for(j=250;j>0;j--);
}
/*****Writeaddress*********/
voidwri_add(ucharcom)
{
uchari,j,k;
cs=0;
cs=1;
dat=0xf8;
for(i=1;i<=8;i++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat<<1;
}
dat=com;
dat=dat&0xf0;
for(j=1;j<=8;j++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat<<1;
}
dat=com;
dat=_cror_(dat,4);//此为高低四位交换
dat=dat&0xf0;
for(k=1;k<=8;k++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat<<1;
}}
/*********Writedata*************/
voidwri_dat(ucharcom1)
{
uchari,j,k;
cs=0;
cs=1;
dat=0xfa;
for(i=1;i<=8;i++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat<<1;
}
dat=com1;
dat=dat&0xf0;
for(j=1;j<=8;j++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat<<1;
}
dat=com1;
dat=_cror_(dat,4);//此为高低四位交换
dat=dat&0xf0;
for(k=1;k<=8;k++)
{
sid=(bit)(dat&0x80);
sclk=0;
sclk=1;
sclk=0;
dat=dat<<1;
}
}
/******displayprogram***********/
voiddisp()
{
uchari,k=0;
wri_add(0x80);
for(i=1;i<=9;i++)
wri_dat(clockname[i-1]);
wri_add(0x90);
for(i=1;i<=6;i++)
{
k++;
if(k==3||k==5)
wri_dat(clockname[8]);//时间之间的冒号。
wri_dat(num[i-1]);
}
}
/*******闪烁程序*************************/
voidshan(void)
{
uchari,k=0;
wri_add(0x90);
if(f==1)
{
num[0]='';
num[1]='';
}
else
gotonext;
for(i=1;i<=6;i++)
{
k++;
if(k==3||k==5)
wri_dat(clockname[8]);//时间之间的冒号。
wri_dat(num[i-1]);
}
gotoreturn1;
next:
if(f==2)
{
num[2]='';
num[3]='';
}
else
gotonext1;
for(i=1;i<=6;i++)
{
k++;
if(k==3||k==5)
wri_dat(clockname[8]);//时间之间的冒号。
wri_dat(num[i-1]);
}
gotoreturn1;
next1:
if(f==3)
{
num[4]='';
num[5]='';
}
else
gotoreturn1;
for(i=1;i<=6;i++)
{
k++;
if(k==3||k==5)
wri_dat(clockname[8]);//时间之间的冒号。
wri_dat(num[i-1]);
}
return1:
_nop_();
}/*******外部中断***********/
voidintr0()interrupt0using2
{
flag=~flag;//判断是否闪烁位//
TR0=~TR0;//闪关定时否则开定时
f=1;
}/**********按键程序************/
voidtkey(void)
{
ucharjudcekey;
judcekey=P1&0x0f;
if(judcekey==0x0f)
gotoreturn2;
/*******移位键*********/
if(judcekey==0x0e)
f++;
if(f==4)
f=1;
/**********加一键*********/
if(judcekey==0x0d)
{clock[f-1]++;}
if(f==1)
{if(clock[f-1]==24){
clock[f-1]=0;}
}
else{if(clock[f-1]==60)
clock[f-1]=0;
}
/******减一键***********/
if(judcekey==0x0b)
{clock[f-1]--;}
if(f==1)
{if(clock[f-1]==0xff){
clock[f-1]=23;}
}
else
{if(clock[f-1]==0xff)
clock[f-1]=59;
}return2:
_nop_();
}