微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 调试通过51单片机的万年历

调试通过51单片机的万年历

时间:11-28 来源:互联网 点击:

}

if ((month>0x2)&&(year%0x4==0)){ //如果公历月大于2月并且该年的2月为闰月,天数加1

temp4+=1;

}

//计算公历日离当年元旦的天数完成

//判断公历日在春节前还是春节后

if (temp4>=temp3){ //公历日在春节后或就是春节当日使用下面代码进行运算

temp4-=temp3;

month=0x1;

month_p=0x1; //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月

flag2=get_moon_day(month_p,table_addr); //检查该农历月为大小还是小月,大月返回1,小月返回0

flag_y=0;

if(flag2==0)temp1=0x1d; //小月29天

else temp1=0x1e; //大小30天

temp2=year_code[table_addr]&0xf0;

temp2=_cror_(temp2,4); //从数据表中取该年的闰月月份,如为0则该年无闰月

while(temp4>=temp1){

temp4-=temp1;

month_p+=1;

if(month==temp2){

flag_y=~flag_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;

}

else{ //公历日在春节前使用下面代码进行运算

temp3-=temp4;

if (year==0x0){year=0x63;c=1;}

else year-=1;

table_addr-=0x3;

month=0xc;

temp2=year_code[table_addr]&0xf0;

temp2=_cror_(temp2,4);

if (temp2==0)month_p=0xc;

else month_p=0xd; //

flag_y=0;

flag2=get_moon_day(month_p,table_addr);

if(flag2==0)temp1=0x1d;

else temp1=0x1e;

while(temp3>temp1){

temp3-=temp1;

month_p-=1;

if(flag_y==0)month-=1;

if(month==temp2)flag_y=~flag_y;

flag2=get_moon_day(month_p,table_addr);

if(flag2==0)temp1=0x1d;

else temp1=0x1e;

}

day=temp1-temp3+1;

}

c_moon=c; //HEX->BCD ,运算结束后,把数据转换为BCD数据

temp1=year/10;

temp1=_crol_(temp1,4);

temp2=year;

year_moon=temp1|temp2;

temp1=month/10;

temp1=_crol_(temp1,4);

temp2=month;

month_moon=temp1|temp2;

temp1=day/10;

temp1=_crol_(temp1,4);

temp2=day;

day_moon=temp1|temp2;

}

code uchar table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表

void Conver_week(bit c,uchar year,uchar month,uchar day)

{//c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据

uchar temp1,temp2;

temp1=year/16; //BCD->hex 先把数据转换为十六进制

temp2=year;

year=temp1*10+temp2;

temp1=month/16;

temp2=month;

month=temp1*10+temp2;

temp1=day/16;

temp2=day;

day=temp1*10+temp2;

if (c==0){year+=0x64;} //如果为21世纪,年份数加100

temp1=year/0x4; //所过闰年数只算1900年之后的

temp2=year+temp1;

temp2=temp2%0x7; //为节省资源,先进行一次取余,避免数大于0xff,避免使用整型数据

temp2=temp2+day+table_week[month-1];

if (year%0x4==0&&month<3)temp2-=1;

week=temp2%0x7;

}

//test

uchar c_sun,year_sun,month_sun,day_sun;

void main(){

c_sun=1;

year_sun=0x2;

month_sun=0x11;

day_sun=0x3;

Conver_week(c_sun,year_sun,month_sun,day_sun);

Conversion(c_sun,year_sun,month_sun,day_sun);

while(1);

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top