1、void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;yy-);/*1602液晶显示器模块*/void write_com(uchar com) /液晶写指令 lcdrw=0; lcdrs=0; P0=com; delay(5); lcden=1; lcden=0;void write_data(uchar dat) /液晶写数据 lcdrs=1; P0=dat; /*年月日写入1602函数*/void write_sfm(uchar add,uchar dat) /写时分秒函数 uchar shi,ge; shi=dat/10; ge=d
2、at%10; write_com(0x80+0x40+add); write_data(0x30+shi); write_data(0x30+ge);void write_yr(uchar add,uchar dat) /写月日函数 write_com(0x80+add);void write_nian(uchar add,uint dat) /写年函数 uint qian,bai,shi,ge; qian=dat/1000; bai=dat%1000/100; shi=dat%100/10; write_data(0x30+qian); write_data(0x30+bai);/*初始化*
3、/void init_lcd() /液晶初始化 nian=2014; yue=8; ri=13; shi=0; /初始shi、fen、miao fen=0; miao=0; write_com(0x38); /设置16x2显示,5x7点阵,8位数据口 write_com(0x0c); /设置开显示,不显示光标 write_com(0x06); /写一个字符后地址指针加1 write_com(0x01); /显示清0,数据指针清0void init() /初始化函数 init_lcd(); /液晶初始化 write_com(0x80); /设置显示初始坐标 for(a=0;a14;a+) /显示
4、年月日初始值 write_data(table0a); delay(5); write_com(0x80+0x40); /设置显示初始坐标8;a+) /显示时分秒初始值 write_data(table1a); 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; /初始化全局变量count TMOD=0x01; /设置定时器0工作模式1 TH0=(65535-50000)/256; /定时器装初始值
5、 TL0=(65535-50000)%256; EA=1; /开总中断 ET0=1; /开定时器0中断 TR0=1; /启动定时器0独立键盘独立键盘已接地void keyscan() if(S1=0) /确认定义键被按下 if(S1=0) S1num+; /定义键S1按下次数记录 while(!S1); /释放按键确认 if(S1num=1) /S1按下一次时 TR0=0; /关闭定时器 write_com(0xc0+7); /光标定位到秒位置 write_com(0x0f); /光标闪烁 if(S1num=2) /S1按下两次时 write_com(0xc0+4); /光标定位到分位置 if
6、(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按下八次时 S1num=0; /S1记录按键次数清零 TR0=1; /
7、开启定时器 write_com(0x0c); /取消光标闪烁 if(S1num!=0) /只有定义键按下后S2、S3、S4才有效 if(S2=0) delay(5); /防抖 if(S2=0) /确认按键被按下 while(!S2); if(S1num=1) /S1按下一次时 miao+; /调整秒加1 if(miao=60) /满60清零 miao=0; write_sfm(6,miao); /每调节一次送液晶显示一次 write_com(0x80+0x40+6); /显示位置重新回到调节处 if(S1num=2) /S1按下两次时 fen+; /调整分加1 if(fen=60) fen=0
8、; write_sfm(3,fen); write_com(0x80+0x40+3); if(S1num=3) /S1按下三次时 shi+; /调整时加1 if(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;3;a+) write_data(xingqixqnuma); delay(5); if(S1num=5) /日加调整 ri+; if(yue=2) if(nian%400
9、=0) if(ri=30) ri=1; if(nian%400!=0) if(ri=29) else if(yue=8) if(yue%2=0) 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) if(S3=0) /确认按键被按下S3); if(S1num=1) miao-; /调整秒减1 if(miao=-1) /减到00后再减重新设置为
10、59 miao=59; if(S1num=2) fen-; /调整分减1 if(fen=-1) fen=59; if(S1num=3) shi-; /调整时减1 if(shi=-1) shi=23; if(S1num=4) xqnum-; /调整星期减一 if(xqnum=-1) xqnum=6; if(S1num=5) /调整日 ri-; if(ri=0) ri=29; ri=28;=7) ri=30; ri=31; if(S1num=6) /调整月 yue-; if(yue=0) yue=12; if(S1num=7) /调整年 nian-; if(nian=2013) nian=2018
11、; if(S4=0) /退出设置、开启中断 if(S4=0)定时器0void timer0() interrupt 1 /定时器0中断服务程序 /重装定时器初始值 count+; /中断次数累加 if(count=20) /20次50毫秒即一秒 count=0; miao+; if(miao=60) /秒加到60时分进位 miao=0; fen+; if(fen=60) /分加到60时时进位 fen=0; shi+; if(shi=24) /时加到24时清0 shi=0; if(yue=2) /如果是二月 if(nian%400=0) /闰年判断 yue+; write_yr(5,yue);=
12、0) /平年判断=7&=2) /一月到七月 if(yue%2=0) /偶数月(除二月) if(ri=31) =0) /奇数月 write_yr(5,yue);=8) /八月到12月 if(ri=32) if(yue=13) /如果判断月份为12月,则加一后重新定义月份为1 yue=1; nian+; write_nian(0,nian); if(xqnum=7) /星期写入 write_sfm(0,shi); /重新写入数据 write_sfm(3,fen); /重新写入数据 write_sfm(6,miao); /重新写入数据/*主函数void main() init(); while(1) keyscan(); /不停的检测按键是否被按下
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1