[2017年整理]1602上显示阳历转换阴历

上传人:豆浆 文档编号:909569 上传时间:2017-05-21 格式:DOCX 页数:28 大小:102.20KB
返回 下载 相关 举报
[2017年整理]1602上显示阳历转换阴历_第1页
第1页 / 共28页
[2017年整理]1602上显示阳历转换阴历_第2页
第2页 / 共28页
[2017年整理]1602上显示阳历转换阴历_第3页
第3页 / 共28页
[2017年整理]1602上显示阳历转换阴历_第4页
第4页 / 共28页
[2017年整理]1602上显示阳历转换阴历_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《[2017年整理]1602上显示阳历转换阴历》由会员分享,可在线阅读,更多相关《[2017年整理]1602上显示阳历转换阴历(28页珍藏版)》请在金锄头文库上搜索。

1、1铜陵学院 07 通信易世玄云在 1602 上显示阳历转换阴历功能介绍:在 MIAN 函数中输入阳历日期如 2010-10-4 就是c_sun=0; /“0”2000 以后, “1”2000 以前year_sun=0x10;month_sun=0x10;day_sun=0x4;或 day_sun=0x04;范围是 1901-2089。由于 89c52 存储空间的限制,不然可以到 2099 年的。哈哈(下一目标加时间,换一种算法可能继续缩范围) 。图片中上面是阳历,下面是农历。星期自动显示。2铜陵学院 07 通信易世玄云编程中遇到问题:1) 没有阳历转换阴历的直接公式,所以采用直接法。数组567

2、 就是。(公历年对应的农历数据,每年三字节,格式第一字节 BIT7-4 位表示闰月月份, 值为 0 为无闰月,BIT3-0 对应农历第 1-4 月的大小第二字节 BIT7-0 对应农历第 5-12 月大小, 第三字节 BIT7 表示农历第 13 个月大小月份对应的位为 1 表示本农历月大(30 天),为 0 表示小 (29 天)第三字节 BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期)2)由于单片机程序存储空间的限制,不得已要压缩程序。在1602 写入数据时一定要两个机器周期。不然系统会发生紊乱。程序代码如下:#include#include #define uchar u

3、nsigned char#define uint unsigned intUnsigned char code dis_week=SUN,MON,TUE,WED,THU,FRI,SAT;unsigned char data dis_buf116;unsigned char data dis_buf216; sbit rs = P30; /LCD 数据/命令选择端(H/L)3铜陵学院 07 通信易世玄云sbit rw = P31; /LCD 读/写选择端(H/L)sbit ep = P22; /LCD 使能控制void delayms(unsigned char ms); /延时程序bit lc

4、d_busy(); /测试 LCD 忙碌状态程序void lcd_wcmd(char cmd); /写入指令到 LCD 程序void lcd_wdat(char dat); /写入数据到 LCD 程序void lcd_pos(char pos); /LCD 数据指针位置程序void lcd_init(); /LCD 初始化设定程序void pro_display(); /显示处理程序void update_disbuf(); /更新显示缓冲区函数unsigned char Conver_week(bit c,uchar year,uchar month,uchar day);/调用 week

5、函数让下面函数能够调用 bit c_moon;data uchar year_moon,month_moon,day_moon,week;uchar c_sun,year_sun,month_sun,day_sun;/ 延时程序void delay(unsigned char ms) while(ms-) unsigned char i;4铜陵学院 07 通信易世玄云for(i = 0; ihex 先把数据转换为十六进制temp2=year%16;year=temp1*10+temp2;temp1=month/16;temp2=month%16;month=temp1*10+temp2;tem

6、p1=day/16;temp2=day%16;day=temp1*10+temp2;/定位数据表地址if(c=0) 22铜陵学院 07 通信易世玄云table_addr=(year+0x64-1)*0x3;else table_addr=(year-1)*0x3;/定位数据表地址完成/取当年春节所在的公历月份temp1=year_codetable_addr+2&0x60; temp1=_cror_(temp1,5);/取当年春节所在的公历月份完成/取当年春节所在的公历日temp2=year_codetable_addr+2&0x1f; /取当年春节所在的公历日完成/ 计算当年春年离当年元旦的

7、天数, 春节只会在公历 1 月或2 月if(temp1=0x1) temp3=temp2-1; else23铜陵学院 07 通信易世玄云temp3=temp2+0x1f-1; if (month0x2)&(year%0x4=0) /如果公历月大于 2 月并且该年的 2 月为闰月,天数加 1temp4+=1;/计算公历日离当年元旦的天数完成/判断公历日在春节前还是春节后if (temp4=temp3) /公历日在春节后或就是春节当日使用下面代码进行运算temp4-=temp3;month=0x1;month_p=0x1; /month_p 为月份指向, 公历日在春节前或就是春节当日 month_

8、p 指向首月24铜陵学院 07 通信易世玄云flag2=get_moon_day(month_p,table_addr); /检查该农历月为大小还是小月,大月返回 1,小月返回 0flag_y=0;if(flag2=0)temp1=0x1d; /小月 29 天else temp1=0x1e; /大小 30 天temp2=year_codetable_addr&0xf0;temp2=_cror_(temp2,4); /从数据表中取该年的闰月月份,如为 0 则该年无闰月while(temp4=temp1)temp4-=temp1;month_p+=1;if(month=temp2)flag_y=f

9、lag_y;if(flag_y=0)month+=1;else month+=1;flag2=get_moon_day(month_p,table_addr);if(flag2=0)temp1=0x1d;else temp1=0x1e;day=temp4+1;25铜陵学院 07 通信易世玄云else /公历日在春节前使用下面代码进行运算temp3-=temp4;if (year=0x0)year=0x63;c=1;else year-=1;table_addr-=0x3;month=0xc;temp2=year_codetable_addr&0xf0;temp2=_cror_(temp2,4)

10、;if (temp2=0)month_p=0xc; else month_p=0xd; /*month_p 为月份指向,如果当年有闰月, 一年有十三个月,月指向 13,无闰月指向 12*/flag_y=0;flag2=get_moon_day(month_p,table_addr);if(flag2=0)temp1=0x1d;else temp1=0x1e;while(temp3temp1)temp3-=temp1;month_p-=1;26铜陵学院 07 通信易世玄云if(flag_y=0)month-=1;if(month=temp2)flag_y=flag_y;flag2=get_moo

11、n_day(month_p,table_addr);if(flag2=0)temp1=0x1d;else temp1=0x1e;day=temp1-temp3+1;c_moon=c; /HEX-BCD ,运算结束后,把数据转换为 BCD 数据year_moon=year;month_moon=month;day_moon=day;code uchar table_week12=0,3,3,6,1,4,6,2,5,0,3,5; /月修正数据表unsigned char Conver_week(bit c,uchar year,uchar month,uchar 27铜陵学院 07 通信易世玄云d

12、ay)/c=0 为 21 世纪,c=1 为 19 世纪 输入输出数据均为 BCD 数据uchar temp1,temp2;temp1=year/16; /BCD-hex 先把数据转换为十六进制temp2=year%16;year=temp1*10+temp2;temp1=month/16;temp2=month%16;month=temp1*10+temp2;temp1=day/16;temp2=day%16;day=temp1*10+temp2;if (c=0)year+=0x64; /如果为 21 世纪,年份数加 100temp1=year/0x4; /所过闰年数只算 1900 年之后的t

13、emp2=year+temp1;temp2=temp2%0x7; /为节省资源,先进行一次取余,避免数大于 0xff,避免使用整型数据temp2=temp2+day+table_weekmonth-1;if (year%0x4=0&month3)temp2-=1;week=temp2%0x7;return week;28铜陵学院 07 通信易世玄云/testvoid main()lcd_init(); c_sun=0;year_sun=0x10;month_sun=0x10;day_sun=0x4;Conver_week(c_sun,year_sun,month_sun,day_sun);Conversion(c_sun,year_sun,month_sun,day_sun);update_disbuf();pro_display();while(1);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号