单片机万年历实训_第1页
单片机万年历实训_第2页
单片机万年历实训_第3页
单片机万年历实训_第4页
单片机万年历实训_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE5单片机万年历实训仿真图:原理图:程序:/******************************************使用LCD1602与单片机实现的时钟与日期inti,j,day=0;charmweek;for(i=2000;i<time.year;i++){if(leep_year(i))day+=366;elseday+=365;}for(j=1;j<time.month;j++){if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)day+=31;if(j==4||j==6||j==9||j==11)day+=30;if(flag_year_leap&&j==2)day+=29;if((!flag_year_leap)&&j==2)day+=28;}day+=time.mday;mweek=day%7;switch(mweek){case0:time.week=5;break;case1:time.week=6;break;case2:time.week=7;break;case3:time.week=1;break;case4:time.week=2;break;case5:time.week=3;break;case6:time.week=4;break;} time_ch.ch_week[0]=time.week+0x30;}//月份的进位处理voidtime_carry_mon_year(void){flag_year_leap=leep_year(time.year);//判断闰年if(time.mday>=30){if(time.month==1||time.month==3||time.month==5||time.month==7\||time.month==8||time.month==10||time.month==12)//天数为31天的月,1、3、5、7、8、10、12{if(time.mday==32){time.mday=1;time.month++;}}if(time.month==4||time.month==6||time.month==9||time.month==11){if(time.month==31){time.mday=1;time.month++;}}tran_ch();}if(time.month==2&&time.mday>=28){if(flag_year_leap&&(time.mday==30)){time.mday=1;time.month++;}if((!flag_year_leap)&&(time.mday==29)){time.mday=1;time.month++;}tran_ch();}if(time.month==13){time.month=1;time.year++;tran_ch();}//年的进位}//时间的进位voidtime_carry(void){if(time.second==60){time.minute++;time.second=0;}if(time.minute==60){time.hour++;time.minute=0;}if(time.hour==24){time.mday++;time.hour=0;time_carry_mon_year();de_week();}}//屏幕的显示函数voiddsp(void){if(flag_en_key==0)//非设置模式下的显示{tran_ch();wcmd(0x02);//returncursorwstring(time_ch.ch_hour,2);wdata(':');wstring(time_ch.ch_minute,2);wdata(':');wstring(time_ch.ch_second,2);wstring("",3);wcmd(0x80+0x40);wstring("",3);wstring(time_ch.ch_year,4);wdata('-');wstring(time_ch.ch_month,2);wdata('-');wstring(time_ch.ch_mday,2);wstring("W",2);wdata(time_ch.ch_week[0]);}if(flag_en_key==1)//设置模式下的显示{if(flag_set<=2){tran_ch();wcmd(0x02);//returncursorwstring(time_ch.ch_year,4);wdata('-');wstring(time_ch.ch_month,2);wdata('-');wstring(time_ch.ch_mday,2);}if(flag_set>2){tran_ch();wcmd(0x02);//returncursorwstring(time_ch.ch_hour,2);wdata(':');wstring(time_ch.ch_minute,2);wdata(':');wstring(time_ch.ch_second,2);wstring("",3);}}}//显示字符串string_…voiddsp_string(char*pt){chari=0;wcmd(0x80+0x40);//将光标调整至第二行while(pt[i]){wdata(pt[i]);i++;}}//退出按键模式voidexit_key(void){chari;flag_en_key=0;flag_en_ok=0;flag_ok=0;flag_mean=0;flag_set=0;//清除所有标记wcmd(0x80+0x40);for(i=0;i<=16;i++)wdata('\0');}//按键的处理子函数(由外中断调用)intsolve_key(void){//if(key_mean==0);if(key_ok==0)//确定或退出{if(flag_ok) { exit_key(); time_carry_mon_year(); de_week(); return0; } elseflag_ok=1;}if(key_set==0){if(flag_ok==0)//时分秒的选择{flag_set++;if(flag_set==6)flag_set=0;switch(flag_set){case0:dsp_string(string_year);break;case1:dsp_string(string_month);break;case2:dsp_string(string_mday);break;case3:dsp_string(string_hour);break;case4:dsp_string(string_minute);break;case5:dsp_string(string_second);break;}}if(flag_ok==1)//时分秒的设置{switch(flag_set){case0:{time.year++;if(time.year==10000)time.year=2000;break;}case1:{time.month++;time_carry_mon_year();break;}case2:{time.mday++;time_carry_mon_year();break;}case3:{time.hour++;if(time.hour==24)time.hour=0;break;}case4:{time.minute++;if(time.minute==60)time.minute=0;break;}case5:{time.second++;if(time.second==60)time.second=0;break;}}}}if(flag_ok==1)//是否更改数据 是显示OK否显示?{wcmd(0x80+0x4e);wdata('O');wdata('K');}else{wcmd(0x80+0x4e);wdata('\0');wdata('?');}return0;}//MCU的秒中断函数与显示函数的执行voidINT_sec()interrupt1using0{if(flag_sec==20)//flag_sec==20代表1s{flag_sec=0;TH0=0x3c;TL0=0xb0+10;//定时器再次进入0.05s的中断//加10是为了抵消中断与前两个指令消耗的时间(不精确)time.second++;flag_en_ok=0;//去掉key_ok的特殊优先权time_carry();dsp();}else{flag_sec++;TH0=0X3C;TL0=0XB0+10;//定时器再次进入0.05s的中断}}//外中断0,键盘中断INT_X0(void)interrupt0using0{LCD_delay(); //去抖TR0=0;//关闭定时计数器0if(key_mean==0){flag_en_ok=1;flag_ok=0;dsp_string(string_year);}if(flag_en_ok&&key_ok==0){flag_en_key=1;flag_en_ok=0;}if(flag_en_key==1){solve_key();}TR0=1;//启动定时计数器0}//LCD的初始化voidinit(void){E=0;//确定E在初始化时为0wcmd(0x01);wcmd(0x06);wcmd(0x0c);wcmd(0x38);}/************main函数*****************/intmain(){//单片机的初始化EA=1;ET0=1;//定时计数器0的使能EX0=1;//外中断0的使能IT0=1;//下降沿触发中断IP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论