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;
}