0x04,0x9B,0x4A, //2043 0x7A,0x4B,0xBe, //2044 0x0A,0x4B,0x51, //2045 0x0A,0xA5,0x46, //2046 0x5B,0x52,0xBA, //2047 0x06,0xd2,0x4e, //2048 0x0A,0xdA,0x42, //2049 0x35,0x5B,0x37, //2050 0x09,0x37,0x4B, //2051 0x84,0x97,0xC1, 0x04,0x97,0x53, 0x06,0x4B,0x48, 0x66,0xA5,0x3C, 0x0e,0xA5,0x4f, 0x06,0xB2,0x44, 0x4A,0xB6,0x38, 0x0A,0xAe,0x4C, 0x09,0x2e,0x42, 0x3C,0x97,0x35, 0x0C,0x96,0x49, 0x7d,0x4A,0xBd, 0x0d,0x4A,0x51, 0x0d,0xA5,0x45, 0x55,0xAA,0xBA, 0x05,0x6A,0x4e, 0x0A,0x6d,0x43, 0x45,0x2e,0xB7, 0x05,0x2d,0x4B, 0x8A,0x95,0xBf, 0x0A,0x95,0x53, 0x0B,0x4A,0x47, 0x6B,0x55,0x3B, 0x0A,0xd5,0x4f, 0x05,0x5A,0x45, 0x4A,0x5d,0x38, 0x0A,0x5B,0x4C, 0x05,0x2B,0x42, 0x3A,0x93,0xB6, 0x06,0x93,0x49, 0x77,0x29,0xBd, 0x06,0xAA,0x51, 0x0A,0xd5,0x46, 0x54,0xdA,0xBA, 0x04,0xB6,0x4e, //2052 //2053 //2054 //2055 //2056 //2057 //2058 //2059 //2060 //2061 //2062 //2063 //2064 //2065 //2066 //2067 //2068 //2069 //2070 //2071 //2072 //2073 //2074 //2075 //2076 //2077 //2078 //2079 //2080 //2081 //2082 //2083 //2084 //2085 //2086
0x0A,0x57,0x43, //2087 0x45,0x27,0x38, //2088 0x0d,0x26,0x4A, //2089 0x8e,0x93,0x3e, //2090 0x0d,0x52,0x52, //2091 0x0d,0xAA,0x47, //2092 0x66,0xB5,0x3B, //2093 0x05,0x6d,0x4f, //2094 0x04,0xAe,0x45, //2095 0x4A,0x4e,0xB9, //2096 0x0A,0x4d,0x4C, //2097 0x0d,0x15,0x41, //2098 0x2d,0x92,0xB5, //2099 };
///月份数据表
code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3}; code uint day_code2[3]={0x111,0x130,0x14e}; /*
函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年) 调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun) 如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世 纪,c_sun=1为19世纪
调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据 */
bit c_moon;
data uchar year_moon,month_moon,day_moon,week;
//子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0 bit get_moon_day(uchar month_p,uint table_addr) { uchar temp;
switch (month_p){
case 1:{temp=year_code[table_addr]&0x08; if (temp==0)return(0);else return(1);} case 2:{temp=year_code[table_addr]&0x04; if (temp==0)return(0);else return(1);} case 3:{temp=year_code[table_addr]&0x02; if (temp==0)return(0);else return(1);} case 4:{temp=year_code[table_addr]&0x01; if (temp==0)return(0);else return(1);} case 5:{temp=year_code[table_addr+1]&0x80;
if (temp==0) return(0);else return(1);} case 6:{temp=year_code[table_addr+1]&0x40; if (temp==0)return(0);else return(1);} case 7:{temp=year_code[table_addr+1]&0x20; if (temp==0)return(0);else return(1);} case 8:{temp=year_code[table_addr+1]&0x10; if (temp==0)return(0);else return(1);} case 9:{temp=year_code[table_addr+1]&0x08; if (temp==0)return(0);else return(1);} case 10:{temp=year_code[table_addr+1]&0x04; if (temp==0)return(0);else return(1);} case 11:{temp=year_code[table_addr+1]&0x02; if (temp==0)return(0);else return(1);} case 12:{temp=year_code[table_addr+1]&0x01; if (temp==0)return(0);else return(1);} case 13:{temp=year_code[table_addr+2]&0x80; if (temp==0)return(0);else return(1);} } } /*
函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年) 调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun) 如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世 纪,c_sun=1为19世纪
调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据 */
void Conversion(bit c,uchar year,uchar month,uchar day)
{ //c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据 uchar temp1,temp2,temp3,month_p; uint temp4,table_addr; bit flag2,flag_y;
temp1=year/16; //BCD->hex 先把数据转换为十六进制 temp2=year;
// year=temp1*10+temp2; year=temp1*16+temp2; temp1=month/16; temp2=month;
//month=temp1*10+temp2; month=temp1*16+temp2; temp1=day/16; temp2=day;
//day=temp1*10+temp2; day=temp1*16+temp2; //定位数据表地址
if(c==0){ table_addr=(year+0x64-1)*0x3; } else {
table_addr=(year-1)*0x3; }
//定位数据表地址完成
//取当年春节所在的公历月份
temp1=year_code[table_addr+2]&0x60; temp1=_cror_(temp1,5);
//取当年春节所在的公历月份完成 //取当年春节所在的公历日
temp2=year_code[table_addr+2]&0x1f; //取当年春节所在的公历日完成
// 计算当年春年离当年元旦的天数,春节只会在公历1月或2月 if(temp1==0x1){ temp3=temp2-1; } else{
temp3=temp2+0x1f-1; }
// 计算当年春年离当年元旦的天数完成
//计算公历日离当年元旦的天数,为了减少运算,用了两个表 //day_code1[9],day_code2[3]
//如果公历月在九月或前,天数会少于0xff,用表day_code1[9], //在九月后,天数大于0xff,用表day_code2[3]
//如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1 //如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1 if (month<10){
temp4=day_code1[month-1]+day-1; } else{
temp4=day_code2[month-10]+day-1; }
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; //
//month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12
flag_y=0;
flag2=get_moon_day(month_p,table_addr); if(flag2==0)temp1=0x1d; else temp1=0x1e;