基于52单片机控制的1602液晶电子时钟显示程序(精心整理)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于52单片机控制的1602液晶电子时钟显示程序关于利用52单片机制作1602液晶电子时钟显示的程序,网上也有很多资料,不过个人感觉还是挺乱的。曾经我也是一名初学者,看过很多别人的资料,查找过很多书籍,一个个程序的摸索,经常被弄得头昏脑涨,深受其苦。今天,我自己精心的整理了一份“基于52单片机控制的1602液晶电子时钟显示程序”的资料,程序每个点几乎都有注释,适合初学者学习,供有兴趣的朋友参考。也算作为自己一直以来在网上搜索那么多资料而给大家的一点点回报吧。这程序简单易懂,也有一些可改善的地方,比如写命令和写数据的函数可以合并等等。大家可根据自己的爱好进行修改,多动手多尝试,相信你很快就能学会。值得注意的是,1,此程序是利用52单片机控制,如果你的是51单片机,需要改动一下头文件#includereg51.h的。2,关于引脚,大家需要根据实际情况定义具体的引脚,不同的学习板,或者你自己焊接的板子,引脚都可能不一样。3,本程序的日期是固定的,自己可以编写函数进行年月日显示。由于本作者水平有限,错误疏漏之处在所难免,欢迎读者指正。#includereg52.h#defineucharunsignedchar#defineuintunsignedintsbitlcden=P3^4;//1602使能信号sbitlcdrs=P3^5;//1602命令(0)/数据(1)选择端sbitwr=P3^6;//1602读写选择端,一般为低电平(0)sbitkey1=P3^7;//定义功能按键,可根据实际情况改变sbitkey2=P2^0;//数字增加按键,也可根据实际情况改变sbitdula=P2^6;//关闭实验板上数码管的段选,这两句可根据实际情况注释掉sbitwela=P2^7;//关闭实验板上数码管的段选uchartemp,num,shi,fen,miao;ucharcodetabe[]=2013-07-20;//固定日期,可扩展为动态voiddelay(uintz)//延时1ms程序{uinti,j;for(i=z;i0;i--)for(j=110;j0;j--);}voidwrite_com(ucharcom)//写命令{lcdrs=0;//rs为低电平写命令P0=com;delay(5);lcden=1;//高脉冲使能delay(5);lcden=0;}voidwrite_data(uchardat)//写数据{lcdrs=1;//rs为高电平写数据P0=dat;delay(5);lcden=1;delay(5);lcden=0;}voidinit()//初始化{EA=1;//开总中断ET1=1;//开定时器1中断TMOD=0x10;//设置TMOD参数TH1=(65536-50000)/256;//给寄存器装初值TL1=(65536-50000)%256;TR1=1;//开启定时器1num=0;shi=0;fen=0;miao=0;lcden=0;dula=0;wela=0;wr=0;//写,低电平有效write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口write_com(0x0C);//开显示,这里上下四句话需参考厂家提供的1602参数设置write_com(0x06);//写一个字符后地址指针加1,且光标加1,写一个字符时,整屏不动write_com(0x01);//显示清屏,数据指针清0}voidd1602(ucharadd,uchardate)//给1602发送地址与数据{uchardate2,date1;//拆分个位与十位date2=date/10;date1=date%10;write_com(0x80+0x40+add);//写指令,地址write_data(date2+0x30);delay(5);//写数据,十位write_data(date1+0x30);delay(5);//写数据,个位}voidkey()//按键函数{if(key1==0){delay(5);//去抖延时if(key1==0){num++;//功能键按下次数while(!key1);//松手判断if(num==1)//第一次按下{TR1=0;//关定时器1,时钟暂停write_com(0x8b+0x40);//地址写到显示秒位置write_com(0x0f);//控制显示光标,光标闪烁}if(num==2)//第二次按下{write_com(0x88+0x40);//地址写到显示分位置}if(num==3)//第三次按下{write_com(0x85+0x40);//地址写到显示时位置}if(num==4)//第四次按下{num=0;write_com(0x0c);//开显示,不显示光标,光标也不闪烁TR1=1;//开启定时器1,时钟继续运行}}}if(num!=0)//当有功能按键按下,才进入下面操作{if(key2==0)//增加按键按下,增加时或分或秒{delay(10);//去抖if(key2==0){while(!key2);//松手判断if(num==1)//当功能键按下的次数是一次{miao++;if(miao==60)miao=0;d1602(0x0a,miao);//改变一次,给1602送一次数据write_com(0x10);//因为上面操作一次,光标加1,}//这里是光标左移,保证闪烁位置不变if(num==2){fen++;if(fen==60)fen=0;d1602(0x07,fen);write_com(0x10);}if(num==3){shi++;if(shi==24)shi=0;d1602(0x04,shi);write_com(0x10);}}}}if(num==0)//当功能键没用被按下{d1602(0x04,shi);//一直送‘时’数据到相应位置d1602(0x07,fen);//一直送‘分’数据到相应位置d1602(0x0a,miao);//一直送‘秒’数据到相应位置}}voidmain()//主函数{ucharctr;init();write_com(0x83);//第一行首地址for(ctr=0;ctr10;ctr++)//固定不变的日期显示,1602的第一行{write_data(tabe[ctr]);delay(5);}write_com(0x86+0x40);//具体地址,写数据‘:’write_data(':');delay(5);write_com(0x89+0x40);write_data(':');delay(5);while(1){key();//不断的扫描按键}}voidtimer()interrupt3//中断{TH1=(65536-50000)/256;//重装初值TL1=(65536-50000)%256;temp++;//累加计数,每次计数为50msif(temp==20)//20次为1s{temp=0;//清零,一定别忘记miao++;//秒if(miao==60){miao=0;fen++;//分if(fen==60){fen=0;shi++;//时if(shi==24){shi=0;}}}}}

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功