




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.单片机万年历实训仿真图:原理图:程序: /* 使用LCD1602与单片机实现的时钟与日期 显示年、月、日、时、分、秒(24小时制) 时间可调, 年份20009999 2012年10月9日*/#include/*全局变量的定义与设置*/sbit key_mean=P10;/按键的定义sbit key_ok =P11;sbit key_set =P12;sbit RS =P15; /LCD控制端口 sbit RW =P16; sbit E =P17; sfr PORT =0xa0;char flag_sec=0; /值为20代表1schar flag_en_ok=0;char flag_en_k
2、ey=0; /值为1表示键盘有效,否则无效char flag_ok=0; /key_up与key_down的功能选择char flag_mean=0;char flag_set=0; /key_up与key_down的功能标识char flag_year_leap=0;/短语 /code char string_time= Setting time ? 0; code char string_year= Setting year ? 0; code char string_month= Setting month ? 0; code char string_mday= Setting day
3、? 0; code char string_week= Setting week ? 0; code char string_hour= Setting hour ? 0; code char string_minute=Setting minute? 0; code char string_second=Setting second? 0;/年月日时分秒的定义struct DATA_TIMEshort year;/待选char month;char mday ;char week ;char hour ;char minute;char second;time;struct time_cha
4、r /time的字符型 char ch_year4; char ch_month2; char ch_mday2; char ch_week1; char ch_hour2; char ch_minute2; char ch_second2;time_ch;/*子函数*/LCD的延时程序void LCD_delay(void) char i,j; for(i=100;i=0;i-)for(j=0;j20;j+);/向LCD写指令函数void wcmd(char cmd ) RS=0; RW=0; E=1; LCD_delay(); PORT=cmd; LCD_delay(); E=0;/向LC
5、D写数据函数void wdata(char DATA) RS=1; RW=0; E=1; LCD_delay(); PORT=DATA; LCD_delay(); E=0;/写字符串void wstring(char *pt,char i)/ i为字符的个数,不带0 char j; for(j=0;ji;j+) wdata(ptj); /时间数据的格式转换void tran_2_ch(char *pt,char DATA) pt0=DATA/10+0x30; pt1=DATA-pt0*10+0x10;void tran_4_ch(char *pt,int DATA) pt0=DATA/1000
6、; pt1=DATA/100-pt0*10; pt2=DATA/10-pt0*100-pt1*10; pt3=DATA-pt0*1000-pt1*100-pt2*10; pt0+=0x30; pt1+=0x30; pt2+=0x30; pt3+=0x30;/格式转换的实现void tran_ch(void) tran_4_ch(time_ch.ch_year ,time.year ); tran_2_ch(time_ch.ch_month,time.month); tran_2_ch(time_ch.ch_mday ,time.mday ); /tran_2_ch(time_ch.ch_wee
7、k ,time.week*10+1); time_ch.ch_week0=time.week+0x30; tran_2_ch(time_ch.ch_hour ,time.hour ); tran_2_ch(time_ch.ch_minute,time.minute); tran_2_ch(time_ch.ch_second,time.second);/是否是闰年char leep_year(int year)/如果是闰年则flag_year_leep=1,否则=0 if(year%400=0)|year%4=0&year%100!=0)return 1; else return 0;/星期的判
8、断void de_week(void) int i,j,day=0; char mweek; for(i=2000;itime.year;i+) if(leep_year(i)day+=366; else day+=365; for(j=1;j=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
9、.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.y
10、ear+;tran_ch();/年的进位/时间的进位void time_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();/屏幕的显示函数void dsp(void) if(flag_en_key=0)/非设置模式下的显示 tran_ch(); wcmd(0x02);/return cur
11、sor wstring(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_week0)
12、; if(flag_en_key=1)/设置模式下的显示 if(flag_set2) tran_ch(); wcmd(0x02);/return cursor wstring(time_ch.ch_hour,2); wdata(:); wstring(time_ch.ch_minute,2); wdata(:); wstring(time_ch.ch_second,2); wstring( ,3); /显示字符串string_ void dsp_string(char *pt) char i=0; wcmd(0x80+0x40);/将光标调整至第二行 while(pti) wdata(pti)
13、; i+; /退出按键模式void exit_key(void) char i; 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);/按键的处理子函数(由外中断调用)int solve_key(void) /if(key_mean=0); if(key_ok=0)/确定或退出 if(flag_ok) exit_key(); time_carry_mon_year(); de_week(); return 0; el
14、se flag_ok=1; if(key_set =0) if(flag_ok=0)/时分秒的选择 flag_set+; if(flag_set=6)flag_set=0; switch(flag_set) case 0:dsp_string(string_year);break; case 1:dsp_string(string_month);break; case 2:dsp_string(string_mday);break; case 3:dsp_string(string_hour);break; case 4:dsp_string(string_minute);break; cas
15、e 5:dsp_string(string_second);break; if(flag_ok=1)/时分秒的设置 switch(flag_set) case 0:time.year+ ;if(time.year=10000)time.year=2000;break; case 1:time.month+ ;time_carry_mon_year();break; case 2:time.mday+ ;time_carry_mon_year();break; case 3:time.hour+ ;if(time.hour=24)time.hour=0;break; case 4:time.mi
16、nute+;if(time.minute=60)time.minute=0;break; case 5: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(?); return 0;/MCU的秒中断函数与显示函数的执行void INT_sec() interrupt 1 using 0 if(flag_sec=20)/flag_
17、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) interrupt 0 using 0 LCD_delay();/去抖 TR0=0;/关闭定时计数器0 if(key_mean=0)
18、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 的初始化void init(void) E=0;/确定E在初始化时为0 wcmd(0x01); wcmd(0x06); wcmd(0x0c); wcmd(0x38);/*main函数*/int main() /单片机的初始化 EA=1; ET0=1;/定时计数器0的使能 EX0=1;/外中断0的使能 IT0=1;/下降沿触发中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025合同续签关键注意事项
- 2025年病理生理学测试题+答案
- 2025-2030中国家政服务行业客户投诉分析与服务质量标准
- 2025-2030中国家政服务行业共享经济模式应用与实践效果分析报告
- 2025版无限期劳动合同范本模板
- 2025年研学旅行1+x练习题与答案
- 2025年食品安全培训考试试题及答案
- 2025年全国中级化学检验工考试题(附答案解析)
- 2025年急性创伤的试题及答案
- 浙江省杭州市示范名校2026届化学高一上期末综合测试模拟试题含解析
- 兵团连队职工考试试题及答案解析
- 招投标合规培训课件
- 湖区七夕小镇旅游综合体文旅景区项目规划定位营销策划方案
- 共享菜园合同协议书
- 外包人员信息安全培训
- 胖东来面试题及答案
- 2024年四川省公安厅招聘警务辅助人员真题
- 中国舆情监测平台行业市场规模及投资前景预测分析报告
- 煤炭工业环境保护设计规范
- 鼻内镜检查的护理
- 仓库电气设备安全操作
评论
0/150
提交评论