51黄历

农历计算方法,

///月度数据表

code uchar day _ code 1【9】= { 0x 0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0x F3 };

code uint day _ code 2【3】= { 0x 111,0x130,0x 14e };

/*

功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099)。

调用函数示例:转换(c _ sun,year _ sun,month _ sun,day _ sun)

例如,计算2004年6月16日的转换(0,0x4,0x10,0x16 );

C_sun、Year _ Sun、Month _ Sun和Day _ Sun都是BCD数据,C _ Sun是世纪标记,c_sun=0是21。

Ji,c_sun=1是19世纪。

调用该函数后,原始数据保持不变。读取C _ moon、Year _ moon、Month _ moon和Day _ moon以获得农历的BCD数据。

*/

比特c _ moon

数据uchar年_月、月_月、日_月、周;

/*子功能,用于读取数据表中农历的大月或小月。如果月份大,则返回1,如果月份小,则返回0*/

位get _ moon _ day(uchar month _ p,uint table_addr)

{

uchar温度;

开关(月p)

{

案例1:{ temp = year _ code【table _ addr】& amp;0x08

if(temp = = 0)返回(0);else返回(1);}

情况2:{ temp = year _ code【table _ addr】& amp;0x04

if(temp = = 0)返回(0);else返回(1);}

情况3:{ temp = year _ code【table _ addr】& amp;0x02

if(temp = = 0)返回(0);else返回(1);}

情况4:{ temp = year _ code【table _ addr】& amp;0x 01;

if(temp = = 0)返回(0);else返回(1);}

情况5:{ temp = year _ code【table _ addr+1】& amp;0x80

if(temp = = 0)返回(0);else返回(1);}

情况6:{ temp = year _ code【table _ addr+1】& amp;0x40

if(temp = = 0)返回(0);else返回(1);}

情况7:{ temp = year _ code【table _ addr+1】& amp;0x20

if(temp = = 0)返回(0);else返回(1);}

情况8:{ temp = year _ code【table _ addr+1】& amp;0x 10;

if(temp = = 0)返回(0);else返回(1);}

情况9:{ temp = year _ code【table _ addr+1】& amp;0x08

if(temp = = 0)返回(0);else返回(1);}

案例10:{ temp = year _ code【table _ addr+1】& amp;0x04

if(temp = = 0)返回(0);else返回(1);}

案例11:{ temp = year _ code【table _ addr+1】& amp;0x02

if(temp = = 0)返回(0);else返回(1);}

案例12:{ temp = year _ code【table _ addr+1】& amp;0x 01;

if(temp = = 0)返回(0);else返回(1);}

案例13:{ temp = year _ code【table _ addr+2】& amp;0x80

if(temp = = 0)返回(0);else返回(1);}

}

}

/*

功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099)。

调用函数示例:转换(c _ sun,year _ sun,month _ sun,day _ sun)

例如,计算2004年6月16日的转换(0,0x4,0x10,0x16 );

C_sun、Year _ Sun、Month _ Sun和Day _ Sun都是BCD数据,C _ Sun是世纪标记,c_sun=0是21。

Ji,c_sun=1是19世纪。

调用该函数后,原始数据保持不变。读取C _ moon、Year _ moon、Month _ moon和Day _ moon以获得农历的BCD数据。

*/

无效转换(c位,农历年,农历月,农历日)

{//c=0是21世纪,c=1是19世纪。所有输入和输出数据都是BCD数据。

uchar temp1,temp2,temp3,month _ p;

uint temp4,table _ addr

位flag2的flag _ y;

temp 1 = year/16;//BCD-& gt;Hex首先将数据转换为十六进制。

temp 2 = year % 16;

year = temp 1 * 10+temp 2;

temp 1 =月/16;

temp 2 = month % 16;

month = temp 1 * 10+temp 2;

temp 1 = day/16;

temp 2 = day % 16;

day = temp 1 * 10+temp 2;

//定位数据表地址

如果(c==0)

{

table _ addr =(year+0x 64-1)* 0x 3;

}

其他

{

table _ addr =(year-1)* 0x 3;

}

//数据表地址定位完成。

//取当年春节所在的公历月份。

temp 1 = year _ code【table _ addr+2】& amp;0x60

temp 1 = _ cror _(temp 1,5);

//取当年春节所在公历月份完成。

//以当年春节所在的公历日为准。

temp 2 = year _ code【table _ addr+2】0x 1f;

//以当年春节所在的公历日为准。

//计算从春季到元旦的天数。春节只会在65438+公历10月或2月。

if(temp 1 = = 0x 1)

{

temp 3 = temp 2-1;

}

其他

{

temp 3 = temp 2+0x 1f-1;

}

//计算从春季到元旦的天数。

//为了计算从公历日到当年元旦的天数,使用了两个表来减少计算。

//day _ code 1【9】,day _ code 2【3】

//如果公历月份在9月或9月之前,则天数将小于0xff,并将使用表day _ code 1【9】。

//9月之后,如果天数大于0xff,则使用表day _ code 2【3】。

//如果输入公历日为8月10,则公历日到元旦的天数为Day _ code 1【8-1】+10-1。

//如果10月份公历日为110,则公历日到元旦的天数为Day _ code 2【11-10】+10-1。

if(月份& lt10)

{

temp 4 = day _ code 1【month-1】+day-1;

}

其他

{

temp4 = day _ code 2【month-10】+day-1;

}

if((月& gt0x2)和amp& amp(年份%0x4==0))

{//如果公历月份大于二月,并且该年的二月是闰月,则天数将增加1。

temp 4+= 1;

}

//计算当年公历日到元旦的天数。

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

if(temp 4 & gt;=温度3)

{//阳历春节后一天或春节当天,使用以下代码进行操作。

温度4-=温度3;

month = 0x 1;

month _ p = 0x 1;//month_p指月份,日历日在春节前或month_p指第一个月。

flag 2 = get _ moon _ day(month _ p,table _ addr);

//检查农历月份是大还是小。大月份返回1,小月份返回0。

flag _ y = 0;

if(flag 2 = = 0)temp 1 = 0x 1d;//流产29天

else temp 1 = 0x 1e;//大小30天

temp 2 = year _ code【table _ addr】& amp;0xf0

temp 2 = _ cror _(temp 2,4);//从数据表中取出一年中的闰月。如果为0,则一年中没有闰月。

while(temp 4》gt;=temp1)

{

temp 4-= temp 1;

month _ p+= 1;

if(month = = temp 2)

{

flag _ y = ~ flag _ y

如果(flag_y==0)

月+= 1;

}

else month+= 1;

flag 2 = get _ moon _ day(month _ p,table _ addr);

if(flag 2 = = 0)temp 1 = 0x 1d;

else temp 1 = 0x 1e;

}

day = temp 4+1;

}

其他

{//阳历春节前一天,使用以下代码进行操作。

温度3-=温度4;

if(年份==0x0)

{

year = 0x63c = 1;

}

else year-= 1;

table _ addr-= 0x 3;

月份= 0xc

temp 2 = year _ code【table _ addr】& amp;0xf0

temp 2 = _ cror _(temp 2,4);

如果(温度2==0)

month _ p = 0xc

其他

month _ p = 0xd//

/*month_p指月份。如果那一年有闰月,一年有十三个月,月指13,没有闰月到12*/

flag _ y = 0;

flag 2 = get _ moon _ day(month _ p,table _ addr);

if(flag 2 = = 0)temp 1 = 0x 1d;

else temp 1 = 0x 1e;

while(temp 3 & gt;温度1)

{

temp 3-= temp 1;

month _ p-= 1;

if(flag _ y = = 0)month-= 1;

if(month = = temp 2)flag _ y = ~ flag _ y;

flag 2 = get _ moon _ day(month _ p,table _ addr);

if(flag 2 = = 0)temp 1 = 0x 1d;

else temp 1 = 0x 1e;

}

day = temp 1-temp 3+1;

}

c _ moon = c//十六进制-& gt;BCD,运算后,将数据转换为BCD数据。

temp 1 = year/10;

temp 1 = _ crol _(temp 1,4);

temp 2 = year % 10;

year _ moon = temp 1 | temp 2;

temp 1 =月/10;

temp 1 = _ crol _(temp 1,4);

temp 2 = month % 10;

month _ moon = temp 1 | temp 2;

temp 1 = day/10;

temp 1 = _ crol _(temp 1,4);

temp 2 = day % 10;

day _ moon = temp 1 | temp 2;

}

/*************************************************************************

/*功能:输入BCD阳历数据并输出BCD星期数据(仅允许1901-2099)。

调用函数示例:conver _ week(c _ sun,year _ sun,month _ sun,day _ sun)

例如,计算2004年6月16日的转换(0,0x4,0x10,0x16 );

C_sun、Year _ Sun、Month _ Sun和Day _ Sun都是BCD数据,C _ Sun是世纪标记,c_sun=0是21。

Ji,c_sun=1是19世纪。

调用函数后,原始数据不变,通过读取星期获取农历的BCD数据。

*/

code uchar table _ week【12】= { 0,3,3,6,1,4,6,2,5,0,3,5 };//每月校正数据表

/*

算法:日期+年份+闰年数+正数之和除以7就是星期,但如果是星期

闰年小于三月,上面的和要减一天再除以7。

周数为0

*/

void Conver _ week(c位,农历年、农历月、农历日)

{//c=0是21世纪,c=1是19世纪。所有输入和输出数据都是BCD数据。

uchar temp1,temp2

temp 1 = year/16;//BCD-& gt;Hex首先将数据转换为十六进制。

temp 2 = year % 16;

year = temp 1 * 10+temp 2;

temp 1 =月/16;

temp 2 = month % 16;

month = temp 1 * 10+temp 2;

temp 1 = day/16;

temp 2 = day % 16;

day = temp 1 * 10+temp 2;

if(c = = 0){ year+= 0x 64;}//如果是21世纪,则在年数上加上100。

temp 1 = year/0x 4;//经过的闰年数仅在1900之后。

temp 2 = year+temp 1;

temp 2 = temp 2% 0x 7;//为了节省资源,先进行一次余数,避免数大于0xff,避免使用整数数据。

temp 2 = temp 2+日+表_周【月-1】;

if(年份% 0x4 = = 0 & amp& amp月份& lt3)temp 2-= 1;

week = temp 2% 0x 7;

}