单片机 12864 LCD显示--按键电子时钟程序 //液晶屏为JM12864或FYD12864(带字库),我用这两种型号的屏没问题, 4行*8列汉字=32 串行通信接/口P1.5--P1.7,可根据你的电路修改相应的接口。
#include reg52.h #include intrins.h #define uchar unsigned char单片机 12864 LCD显示--按键电子时钟程序//液晶屏为JM12864或FYD12864(带字库),我用这两种型号的屏没问题, 4行*8列汉字=32 串行通信接/口P1.5--P1.7,可根据你的电路修改相应的接口。
#include <reg52.h>#include <intrins.h>#define uchar unsigned charvoid lcd_ini();void ascii_change(void);void delay();void wri_add(uchar com);void wri_dat(uchar com1);void shan(void);void disp();void tkey(void);sbit cs=P1^7;sbit sid=P1^6;sbit sclk=P1^5;bit flag=1;uchar dat,count,f=1;//f测试哪个单元为当前闪烁状态uchar data clock[3]={23,45,12};uchar code clockname[10]={"北京时间:"};uchar data num[6];/*******主程序*************/void main(){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)goto back;tkey();shan();delay();}}/****lcd初始化*******/void lcd_ini(){wri_add(0x30);delay();wri_add(0x0c);delay();wri_add(0x01);delay();wri_add(0x06);delay();}/********定时程序*************/ void timer1() interrupt 1 using 2 {TL0=0XB0;TH0=0X3C;count--;if(count==0){count=10;clock[2]++;//秒//}elsegoto out;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码************/ void ascii_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;}/********廷时程序*************/void delay(){uchar i,j;for (i=250;i>0;i--)for (j=250;j>0;j--);}/*****Write address*********/void wri_add(uchar com){uchar i,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;}}/*********Write data*************/ void wri_dat(uchar com1){uchar i,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;}}/******display program***********/ void disp(){uchar i,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]);}}/*******闪烁程序*************************/ void shan(void){uchar i,k=0;wri_add(0x90);if(f==1){num[0]=' ';num[1]=' ';}elsegoto next;for (i=1;i<=6;i++){k++;if(k==3||k==5)wri_dat(clockname[8]);//时间之间的冒号。
wri_dat(num[i-1]);}goto return1;next: if(f==2){num[2]=' ';num[3]=' ';}elsegoto next1;for (i=1;i<=6;i++){k++;if(k==3||k==5)wri_dat(clockname[8]);//时间之间的冒号。
wri_dat(num[i-1]);goto return1;next1: if(f==3){num[4]=' ';num[5]=' ';}elsegoto return1;for (i=1;i<=6;i++){k++;if(k==3||k==5)wri_dat(clockname[8]);//时间之间的冒号。
wri_dat(num[i-1]);}return1:_nop_();}/*******外部中断***********/void intr0() interrupt 0 using 2{flag=~flag;//判断是否闪烁位//TR0=~TR0; //闪关定时否则开定时f=1;}/**********按键程序************/void tkey(void){uchar judcekey;judcekey=P1&0x0f;if(judcekey==0x0f)goto return2;/*******移位键*********/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_();}。