您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于单片机的LCD1602电子时钟程序和仿真图
/*******************************************************************///Nameofthisdesign:LCDshowElectricClock//Author:Huangxiang//Date:2008-12-21//proteus仿真论坛:proteus.5d6d.com/*******************************************************************/#includereg51.h#includeintrins.h#includeabsacc.h#defineucharunsignedchar#defineuintunsignedint#defineBUSY0x80//lcd忙检测标志,0x08第七位就是1#defineDATAPORTP0//定义P0口为LCD通讯端口sbitlight=P1^3;sbitLCD_RS=P2^0;//数据/命令端sbitLCD_RW=P2^1;//读/写选择端sbitLCD_EN=P2^2;ucharsecond;//定义并初始化时钟变量:秒分时ucharminite;ucharhour;ucharmstcnt=0;//??uchart,set=0;//??ucharcodestr0[]={DATE:2008-12-21};//定义两个一直显示的字符串ucharcodestr1[]={TIME:::};voiddelay_LCD(uint);//LCD延时子程序voidinitLCD(void);//LCD初始化子程序voidlcd_wait(void);//LCD检测忙子程序voidWriteCommandLCD(ucharWCLCD,ucharBusyC);//写指令到ICD子函数voidWriteDataLCD(ucharWDLCM);//写数据到LCD子函数voidDisplayOneChar(ucharX,ucharY,ucharDData);//显示指定坐标的一个字符子函数voidDisplayListChar(ucharX,ucharY,ucharcode*DData);//显示指定坐标的一串字符子函数voidinit_timer0(void);//定时器初始化voiddisplayfun1(void);voiddisplayfun2(void);voiddisplayfun3(void);voidkeyscan(void);//键盘扫描子程序voidset_adj(void);voidinc_key(void);voiddec_key(void);/*********延时K*1ms,12.000mhz**********/voiddelay_LCD(uintk){uinti,j;for(i=0;ik;i++){for(j=0;j60;j++){;}}}/**********写指令到LCD子函数************/voidWriteCommandLCD(ucharWCLCM,ucharBusyC){if(BusyC)lcd_wait();DATAPORT=WCLCM;LCD_RS=0;//选中指令寄存器LCD_RW=0;//写模式LCD_EN=1;_nop_();_nop_();_nop_();LCD_EN=0;}/**********写数据到LCD子函数************/voidWriteDataLCD(ucharWDLCM){if(BusyC)lcd_wait();//检测忙信号DATAPORT=WDLCM;LCD_RS=1;//选中数据寄存器LCD_RW=0;//写模式LCD_EN=1;_nop_();_nop_();_nop_();LCD_EN=0;}/***********lcm内部等待函数*************/voidlcd_wait(void){DATAPORT=0xff;LCD_EN=1;LCD_RS=0;LCD_RW=1;_nop_();while(DATAPORT&BUSY){LCD_EN=0;_nop_();_nop_();LCD_EN=1;_nop_();_nop_();}LCD_EN=0;}/**********LCD初始化子函数***********/voidinitLCD(){DATAPORT=0;delay_LCD(15);WriteCommandLCD(0x38,0);//三次显示模式设置,不检测忙信号delay_LCD(5);WriteCommandLCD(0x38,0);delay_LCD(5);WriteCommandLCD(0x38,0);delay_LCD(5);WriteCommandLCD(0x38,1);//8bit数据传送,2行显示,5*7字型,检测忙信号WriteCommandLCD(0x08,1);//关闭显示,检测忙信号WriteCommandLCD(0x01,1);//清屏,检测忙信号WriteCommandLCD(0x06,1);//显示光标右移设置,检测忙信号WriteCommandLCD(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号}/****************显示指定坐标的一个字符子函数*************/voidDisplayOneChar(ucharX,ucharY,ucharDData){Y&=1;X&=15;if(Y)X|=0x40;//若y为1(显示第二行),地址码+0X40X|=0x80;//指令码为地址码+0X80WriteCommandLCD(X,0);WriteDataLCD(DData);}/***********显示指定坐标的一串字符子函数***********/voidDisplayListChar(ucharX,ucharY,ucharcode*DData){ucharListLength=0;Y&=0x01;X&=0x0f;while(X16){DisplayOneChar(X,Y,DData[ListLength]);ListLength++;X++;}}/***************液晶显示子函数1正常显示*****************/voiddisplayfun1(void){WriteCommandLCD(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);DisplayOneChar(7,1,hour/10+0x30);//液晶上显示小时DisplayOneChar(8,1,hour%10+0x30);DisplayOneChar(10,1,minite/10+0x30);//液晶上显示分DisplayOneChar(11,1,minite%10+0x30);DisplayOneChar(13,1,second/10+0x30);//液晶上显示秒DisplayOneChar(14,1,second%10+0x30);}/************液晶显示子函数2***************/voiddisplayfun3(void){WriteCommandLCD(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);DisplayOneChar(7,1,hour/10+0x30);DisplayOneChar(8,1,hour%10+0x30);DisplayOneChar(13,1,second/10+0x30);DisplayOneChar(14,1,second%10+0x30);WriteCommandLCM(0x0f,1);//显示屏打开,光标显示,闪烁,检测忙信号DisplayOneChar(10,1,minite/10+0x30);DisplayOneChar(11,1,minite%10+0x30);}/**************液晶显示子函数3*****************/voiddisplayfun2(void){WriteCommandLCD(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);DisplayOneChar(10,1,minite/10+0x30);DisplayOneChar(11,1,minite%10+0x30);DisplayOneChar(13,1,second/10+0x30);DisplayOneChar(14,1,second%10+0x30);WriteCommandLCD(0x0f,1);//显示屏打开,光标显示,闪烁,检测忙信号DisplayOneChar(7,1,hour/10+0x30);DisplayOneChar(8,1,hour%10+0x30);}/**************键盘扫描子函数******************/voidkeyscan(void){ucharxx;//局部变量P1=0xff;if(P1!=0xff){delay_LCD(50);if(P1!=0xff){xx=P1;switch(xx)//根据按键状态,调用不同的子函数{case0xfe:set_adj();break;case0xfd:inc_key();break;case0xfb:dec_key();break;default:break;}}}}/**************设定工作模式子函数****************/voidset_adj(void){delay_LCD(100);set++;if(set2)set=0;}/****************按键加法子函数******************/voidinc_key(void){delay_LCD(150);if(set==1){hour++;if(hour=23)hour=23;}elseif(set==2){minite++;if(minite=59)minite=59;}elsedisplayfun1();}/****************按键减法子函数*****************/voiddec_key(void){delay_LCD(150);if(set==1){hour--;if(hour=0)hour=0;}elseif(set==2){minite--;if(minite=0)minite=0;}elsedisplayfun1();}/***************定时器t0初始化*******************/voidinit_timer0(void){TMOD=0x01;//time0为定时器,方式1TH0=0x3c;//预置计数初值TL0=0xb0;EA=1;ET0=1;TR0=1;}/***********定时器t0中断子函数**************/voidtimer0(void)interrupt1using0//定时器0方式1,50ms中断一次{TH0=0x3c;TL0=0xb0;mstcnt++;if(mstcnt=20){second++;mstcnt=0;}if(second=60){minite++;second=0;}if(minite=60){hour++;minite=0;light=0;delay_LCD(200);light=1;}if(hour=24){hour=0;}keyscan();//按键扫描}/***********themainfuntion*************/void
本文标题:基于单片机的LCD1602电子时钟程序和仿真图
链接地址:https://www.777doc.com/doc-5701706 .html