钻石会员
  
主题
帖子
积分23852
阅读权限50
注册时间2008-11-13
最后登录1970-1-1
在线时间 小时
|
<P>void Conversion(void)<BR>/*==转换当前农历信息====================================*/<BR>{ <BR>unsigned char year,month,day,temp1,temp2,temp3,month_p;<BR>unsigned int temp4,code_addr;<BR>bit flag_y; // flag2,<BR> <BR> year =((nian/16)*10+nian%16)&0x7f; //加载年月日数据,如为BCD则需转为十进制 <BR> month=((yue/16)*10+yue%16);<BR> day=((ri/16)*10+ri%16);<BR> <BR> code_addr=year-1; //定位数据表地址 <BR> if(((nian/16)*10+nian%16)>>7==0)<BR> code_addr+=100;<BR> code_addr*=3;</P>
<P> temp1=(year_code[code_addr+2]&0x60)>>5; //取当年春节所在的公历月份 <BR> temp2=year_code[code_addr+2]&0x1f; //取当年春节所在的公历日 <BR> temp3=temp2-1; //计算当年春节离当年元旦的天数,春节只会在公历1月或2月<BR> <BR> if(temp1!=1)<BR> temp3+=31; //如果不在1月则天数加上31天(1月)<BR> if(month<10)<BR> {temp4=day_code1[month-1]+day;}<BR> else<BR> {temp4=day_code2[month-10]+day;}</P>
<P> if((month<=2)||(year%0x04!=0))<BR> temp4-=1; //如果公历月小于等于2月或者该年的2月非闰月,天数减1 <BR> <BR> temp2=(year_code[code_addr]&0xf0)>>4; //从数据表中取该年的闰月月份,如为0则该年无闰月<BR> <BR> if (temp4>=temp3) //判断公历日在春节前还是春节后<BR> {<BR> //公历日在春节后或就是春节当日使用下面代码进行运算<BR> temp4 -=temp3;<BR> month = 1; <BR> flag_y = 0;<BR> month_p= 1; //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月<BR> temp1=get_moon_day(month_p,code_addr); //检查该农历月为大小还是小月,大月返回1,小月返回0 <BR> <BR> while(temp4>=temp1)<BR> {<BR> temp4-=temp1;<BR> month_p+=1;<BR> if(month==temp2)<BR> {<BR> flag_y=~flag_y;<BR> if(flag_y==0)<BR> month+=1;<BR> }<BR> else<BR> {month+=1;}</P>
<P> temp1=get_moon_day(month_p,code_addr);<BR> }<BR> day=temp4+1;<BR> }<BR> else<BR> { <BR> //公历日在春节前使用下面代码进行运算<BR> temp3-=temp4;<BR> if(year==0)<BR> {year=0xe3;}<BR> else<BR> {year-=1;}</P>
<P><BR> code_addr-=3;<BR> month = 12;<BR> flag_y = 0;<BR> if(temp2==0)<BR> {month_p=12;}<BR> else<BR> {month_p=13;} //如果当年有闰月,一年有十三个月,月指向13,无闰月指向12 <BR> <BR> temp1=get_moon_day(month_p,code_addr);<BR> while(temp3>temp1)<BR> {<BR> temp3-=temp1;<BR> month_p-=1;<BR> if(flag_y==0)<BR> month-=1;<BR> if(month==temp2)<BR> flag_y=~flag_y;<BR> temp1=get_moon_day(month_p,code_addr);<BR> }<BR> day=temp1-temp3+1;<BR> }</P>
<P> Tim[0] = year|(((nian/16)*10+nian%16)&0x80); //将农历信息写进指定变量<BR> Tim[1] = month;<BR> Tim[2] = day;<BR> // Conver_week(); //最后进行星期转换(根据需要自行选用)<BR>}</P>
<P>unsigned char get_moon_day(unsigned char month_p,unsigned int code_addr)/*读取数据表中农历月的大月或小月,如果该月大返回1,小返回0*/<BR>{<BR> unsigned char temp,temp5; </P>
<P><BR> temp=0x80>>((month_p+3)%8);<BR> temp5=(month_p+3)/8; <BR> temp=year_code[code_addr+temp5]&temp; <BR> if(temp==0)<BR> return(29);<BR> else<BR> return(30);</P>
<P> }<BR></P> |
|