《基于51单片机定时器的1602液晶显示器时钟显示(带年月日)(共13页).doc》由会员分享,可在线阅读,更多相关《基于51单片机定时器的1602液晶显示器时钟显示(带年月日)(共13页).doc(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上#include#define uchar unsigned char#define uint unsigned intuchar a,count,S1num,xqnum;char yue,ri,shi,fen,miao;int nian;sbit lcdrs=P25;sbit lcdrw=P24;sbit lcden=P23;sbit S1=P30;/定义键进入设置sbit S2=P31;/定义键增大sbit S3=P32;/定义键减小sbit S4=P33;/定义键退出设置uchar code table0=2014-08-13 WED;uchar code ta
2、ble1=00:00:00;uchar code xingqi3=MON,TUE,WED,THU,FRI,SAT,SUN;void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);/*1602液晶显示器模块sbit lcdrs=P25;sbit lcdrw=P24;sbit lcden=P23;*/void write_com(uchar com)/液晶写指令lcdrw=0;lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void write_data(uchar dat)/液晶写数据l
3、cdrw=0;lcdrs=1;P0=dat;delay(5);lcden=1;delay(5);lcden=0; /*年月日写入1602函数*/void write_sfm(uchar add,uchar dat) /写时分秒函数uchar shi,ge;shi=dat/10;ge=dat%10;write_com(0x80+0x40+add);write_data(0x30+shi);write_data(0x30+ge);void write_yr(uchar add,uchar dat) /写月日函数uchar shi,ge;shi=dat/10;ge=dat%10;write_com(
4、0x80+add);write_data(0x30+shi);write_data(0x30+ge);void write_nian(uchar add,uint dat) /写年函数uint qian,bai,shi,ge;qian=dat/1000;bai=dat%1000/100;shi=dat%100/10;ge=dat%10;write_com(0x80+add);write_data(0x30+qian);write_data(0x30+bai);write_data(0x30+shi);write_data(0x30+ge);/*初始化*/void init_lcd() /液晶初
5、始化lcden=0;nian=2014;yue=8;ri=13;shi=0; /初始shi、fen、miaofen=0;miao=0;write_com(0x38); /设置16x2显示,5x7点阵,8位数据口write_com(0x0c); /设置开显示,不显示光标write_com(0x06); /写一个字符后地址指针加1write_com(0x01); /显示清0,数据指针清0 void init()/初始化函数init_lcd(); /液晶初始化write_com(0x80); /设置显示初始坐标for(a=0;a14;a+) /显示年月日初始值write_data(table0a);
6、delay(5);write_com(0x80+0x40); /设置显示初始坐标for(a=0;a8;a+)/显示时分秒初始值write_data(table1a);delay(5);write_nian(0,nian);write_sfm(6,miao); /分别将shi、fen、miao送去液晶显示write_sfm(3,fen);write_sfm(0,shi);count=0;xqnum=0;S1num=0; /初始化全局变量countTMOD=0x01; /设置定时器0工作模式1TH0=(65535-50000)/256; /定时器装初始值TL0=(65535-50000)%256;
7、EA=1;/开总中断ET0=1;/开定时器0中断TR0=1;/启动定时器0 /*独立键盘sbit S1=P30;/定义键进入设置sbit S2=P31;/定义键增大sbit S3=P32;/定义键减小sbit S4=P33;/定义键退出设置独立键盘已接地*/void keyscan()if(S1=0)delay(5);/确认定义键被按下if(S1=0)S1num+;/定义键S1按下次数记录while(!S1);/释放按键确认if(S1num=1)/S1按下一次时TR0=0;/关闭定时器write_com(0xc0+7);/光标定位到秒位置write_com(0x0f);/光标闪烁if(S1nu
8、m=2) /S1按下两次时write_com(0xc0+4); /光标定位到分位置if(S1num=3) /S1按下三次时write_com(0xc0+1); /光标定位到时位置if(S1num=4) /S1按下四次时write_com(0x80+13); /光标定位到星期位置if(S1num=5) /S1按下五次时write_com(0x80+9); /光标定位到日位置if(S1num=6) /S1按下六次时write_com(0x80+6); /光标定位到月位置if(S1num=7) /S1按下七次时write_com(0x80+3); /光标定位到年位置if(S1num=8) /S1按下
9、八次时S1num=0; /S1记录按键次数清零TR0=1; /开启定时器write_com(0x0c); /取消光标闪烁if(S1num!=0) /只有定义键按下后S2、S3、S4才有效if(S2=0)delay(5);/防抖if(S2=0) /确认按键被按下while(!S2);/释放按键确认if(S1num=1)/S1按下一次时miao+;/调整秒加1if(miao=60)/满60清零miao=0;write_sfm(6,miao); /每调节一次送液晶显示一次write_com(0x80+0x40+6); /显示位置重新回到调节处if(S1num=2) /S1按下两次时fen+;/调整分
10、加1if(fen=60)fen=0;write_sfm(3,fen);write_com(0x80+0x40+3);if(S1num=3) /S1按下三次时shi+; /调整时加1if(shi=24)shi=0;write_com(0x80+0x40);write_sfm(0,shi);if(S1num=4) /星期加调整xqnum+;if(xqnum=7)xqnum=0;write_com(0x80+0x0b);for(a=0;a3;a+)write_data(xingqixqnuma);delay(5);if(S1num=5)/日加调整ri+;if(yue=2)if(nian%400=0)
11、if(ri=30)ri=1;if(nian%400!=0)if(ri=29)ri=1;else if(yue=8)if(yue%2=0)if(ri=32)ri=1;else if(yue%2!=0)if(ri=31)ri=1;write_yr(8,ri);if(S1num=6)/月加调整yue+;if(yue=13)yue=1;write_yr(5,yue); if(S1num=7) /年加调整nian+;if(nian=2019)nian=2014;write_nian(0,nian);if(S3=0)delay(5);if(S3=0) /确认按键被按下while(!S3);if(S1num
12、=1) miao-; /调整秒减1if(miao=-1) /减到00后再减重新设置为59miao=59;write_sfm(6,miao);write_com(0x80+0x40+6);if(S1num=2)fen-; /调整分减1if(fen=-1)fen=59;write_sfm(3,fen);write_com(0x80+0x40+3);if(S1num=3)shi-;/调整时减1if(shi=-1)shi=23;write_sfm(0,shi);write_com(0x80+0x40);if(S1num=4)xqnum-;/调整星期减一if(xqnum=-1)xqnum=6;write
13、_com(0x80+0x0b);for(a=0;a3;a+)write_data(xingqixqnuma);delay(5);if(S1num=5) /调整日ri-;if(yue=2)if(nian%400=0)if(ri=0)ri=29;if(nian%400!=0)if(ri=0)ri=28;else if(yue=8)if(yue%2=0)if(ri=0)ri=31;else if(yue%2!=0)if(ri=0)ri=30;write_yr(8,ri); if(S1num=6) /调整月yue-;if(yue=0)yue=12;write_yr(5,yue);if(S1num=7)
14、 /调整年nian-;if(nian=2013)nian=2018;write_nian(0,nian);if(S4=0) /退出设置、开启中断delay(5);if(S4=0)S1num=0;TR0=1;write_com(0x0c);/*定时器0*/void timer0() interrupt 1 /定时器0中断服务程序TH0=(65535-50000)/256; /重装定时器初始值TL0=(65535-50000)%256;count+; /中断次数累加if(count=20) /20次50毫秒即一秒count=0;miao+;if(miao=60) /秒加到60时分进位miao=0;
15、fen+;if(fen=60) /分加到60时时进位fen=0;shi+;if(shi=24)/时加到24时清0shi=0;xqnum+;ri+;if(yue=2)/如果是二月if(nian%400=0) /闰年判断if(ri=30)ri=1;yue+;write_yr(5,yue);if(nian%400!=0) /平年判断if(ri=29)ri=1;yue+;write_yr(5,yue);else if(yue=8) /八月到12月if(yue%2=0)/偶数月(除二月)if(ri=32) ri=1;yue+;if(yue=13) /如果判断月份为12月,则加一后重新定义月份为1yue=
16、1;nian+;write_nian(0,nian);write_yr(5,yue);else if(yue%2!=0) /奇数月if(ri=31)ri=1;yue+;write_yr(5,yue);write_yr(8,ri);if(xqnum=7)/星期写入xqnum=0;write_com(0x80+0x0b);for(a=0;a3;a+)write_data(xingqixqnuma);delay(5);write_sfm(0,shi);/重新写入数据write_sfm(3,fen);/重新写入数据write_sfm(6,miao);/重新写入数据/*主函数*/void main()init();while(1)keyscan();/不停的检测按键是否被按下专心-专注-专业