最強萬年曆1

nongli.c

/****************************************Copyright (c)**************************************************
**                              四川唐門高新技術開發有限公司
**                                     研    發    部
**                                獨門暗器之孔雀翎研究室 
**
**                                http://www.蜀中唐門.com
**
**                                   維護健康 信守誠諾
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: nongli.c
**創   建   人: 賴皮 
**最後修改日期: 2011年10月
**描        述: 最強萬年曆   
**              支持所有的單片機、ARM、AVR、MSP430、PIC等(支持C開發)
**              可嵌入任何標準C編譯器  BC++、VC、ADS、KEIL等
**用        法: 在ADS,Keil,BC++上可仿真
**
#include "nongli.c"
void main(void)
{
    unsigned char week;
    unsigned char NLyear[4];
    unsigned char JQdate;
             char str[15];


    while(1)
    {
        GetChinaCalendar   (2007,2,8,NLyear);  //NLyear={20,06,12,21}
        GetChinaCalendarStr(2007,2,8,str);     //str   ={"丙戌年臘月廿一"}
        GetWeek            (2007,2,8,&week);   //week  =4
        GetJieQi           (2007,2,8,&JQdate); //JQdate=4 意思爲本月的4號是個節氣
        GetJieQiStr        (2007,2,4,str);     //str   ={"立春"}
        GetJieQiStr        (2007,2,8,str);     //str   ={"離雨水還有11天"}
        GetShengXiaoStr    (2007,3,4,str);     //str   ={"豬"}
   }
}
**
**          [email protected]
********************************************************************************************************
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 賴皮 
** 版  本: v1.0
** 日 期: 2007年02月6日
** 描 述: 
**          這是改寫網友Campo的萬年曆C51。
**          原作使用了數組查表法,效率較高。
**          移植到ARM上,我改寫了進入參數。返回採用指針傳遞
**          增加了天干地支轉換              ★〓個人原創〓★
**          輸入公曆日期得到農曆字符串
**          非本人原創部分僅供研究與學習之用。如想商業使用,
**          請與原作者Campo聯繫——雖然我也不知道他的聯繫方式 ^o^
**
**★〓 僅以此獻給我的寶貝女兒小涵,我的小狗狗要過第一個春節了 〓★
**★〓    任何人都可以發佈和使用,希望保留本文件信息。謝謝    〓★
**         
**------------------------------------------------------------------------------------------------------
********************************************************************************************************
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 賴皮 
** 版  本: v2.0(情人節版)   我會在2月14日發佈-->願天下有情人終成眷屬
**                                              願和我一樣已經進城的人幸福美滿
** 日 期: 2007年02月8日
** 描 述:   
**          應網友的要求增加24節氣的支持    ★〓個人原創〓★
**          爲了節約空間我未採用複雜算法  而先把節氣標誌做了個表格(好累人哦)
**          一年的24個節氣的日期只需要3個字節編碼,每個bit對應一個節氣 高->低
**          50年的節氣表,只需要150個字節的存儲空間 
**          如果本月的節氣日期等於基本日期 bit=0  else  bit=1
**
**★〓   僅以此獻給我親愛的劉筒, 我一定會給你種柚子和櫻桃的   〓★
**★〓    任何人都可以發佈和使用,希望保留本文件信息。謝謝    〓★
**         
**------------------------------------------------------------------------------------------------------
********************************************************************************************************
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 賴皮 
** 版  本: v3.0(元宵節版)   今天是元宵節
**                                         
** 日 期: 2007年03月04日
** 描 述:   
**          增加12生肖                       ★〓個人原創〓★
**          12生肖比較簡單,只要知道12地支就可以了
**          子-->鼠,醜-->牛,寅-->虎 ... 
**          鼠不分大小都喊老 (誰能對上)                   
**          增加移植選項,因爲不同的平臺要把常量表格定義到ROM段需要不同的關鍵字
**          目前只給出ARM、C51兩種,用戶可自己擴展
**
**★〓   僅以此獻給我親愛的媽老漢兒, 我一定會掙大錢的(未來)   〓★
**★〓    任何人都可以發佈和使用,希望保留本文件信息。謝謝    〓★
**         
**------------------------------------------------------------------------------------------------------********************************************************************************************************
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 賴皮 
** 版  本: v3.1(2012版)   迎接2012
**                                         
** 日 期: 2011年10月
** 描 述:   
**         修正一些小bug
**
**★〓   僅以此獻給我親愛的媽媽, 希望你手術成功(肯定)         〓★
**★〓    任何人都可以發佈和使用,希望保留本文件信息。謝謝    〓★
**         
**------------------------------------------------------------------------------------------------------
********************************************************************************************************
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人: 
** 版  本: 
** 日 期: 
** 描 述:  
**         
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/


/****************************************************************************
* 移植到不同平臺需要改動的地方
* 可根據需要添加PIC、AVR等定義關鍵字
****************************************************************************/
#define     C51         0
#define     ARM         1  


#define     CPU_TYPE    ARM    // 用戶根據不同平臺指定 如果是51該處應改爲 C51       


#if CPU_TYPE ==  C51           
  #define KeyWord code   // 在C51下code 代碼放到ROM段
#else
#define KeyWord const  // 在ARM下const代碼放到ROM段
#endif
/* 剪裁相關不用的代碼 */
#define JieQiEn             1  // 1:使能節氣相關代碼
#define ShengXiaoEn         1  // 1:使能生肖相關代碼


static unsigned char KeyWord year_code[]={
0x04,0xAe,0x53, //1901 0
0x0A,0x57,0x48, //1902 3
0x55,0x26,0xBd, //1903 6
0x0d,0x26,0x50, //1904 9
0x0d,0x95,0x44, //1905 12
0x46,0xAA,0xB9, //1906 15
0x05,0x6A,0x4d, //1907 18
0x09,0xAd,0x42, //1908 21
0x24,0xAe,0xB6, //1909
0x04,0xAe,0x4A, //1910
0x6A,0x4d,0xBe, //1911
0x0A,0x4d,0x52, //1912
0x0d,0x25,0x46, //1913
0x5d,0x52,0xBA, //1914
0x0B,0x54,0x4e, //1915
0x0d,0x6A,0x43, //1916
0x29,0x6d,0x37, //1917
0x09,0x5B,0x4B, //1918
0x74,0x9B,0xC1, //1919
0x04,0x97,0x54, //1920
0x0A,0x4B,0x48, //1921
0x5B,0x25,0xBC, //1922
0x06,0xA5,0x50, //1923
0x06,0xd4,0x45, //1924
0x4A,0xdA,0xB8, //1925
0x02,0xB6,0x4d, //1926
0x09,0x57,0x42, //1927
0x24,0x97,0xB7, //1928
0x04,0x97,0x4A, //1929
0x66,0x4B,0x3e, //1930
0x0d,0x4A,0x51, //1931
0x0e,0xA5,0x46, //1932
0x56,0xd4,0xBA, //1933
0x05,0xAd,0x4e, //1934
0x02,0xB6,0x44, //1935
0x39,0x37,0x38, //1936
0x09,0x2e,0x4B, //1937
0x7C,0x96,0xBf, //1938
0x0C,0x95,0x53, //1939
0x0d,0x4A,0x48, //1940
0x6d,0xA5,0x3B, //1941
0x0B,0x55,0x4f, //1942
0x05,0x6A,0x45, //1943
0x4A,0xAd,0xB9, //1944
0x02,0x5d,0x4d, //1945
0x09,0x2d,0x42, //1946
0x2C,0x95,0xB6, //1947
0x0A,0x95,0x4A, //1948
0x7B,0x4A,0xBd, //1949
0x06,0xCA,0x51, //1950
0x0B,0x55,0x46, //1951
0x55,0x5A,0xBB, //1952
0x04,0xdA,0x4e, //1953
0x0A,0x5B,0x43, //1954
0x35,0x2B,0xB8, //1955
0x05,0x2B,0x4C, //1956
0x8A,0x95,0x3f, //1957
0x0e,0x95,0x52, //1958
0x06,0xAA,0x48, //1959
0x7A,0xd5,0x3C, //1960
0x0A,0xB5,0x4f, //1961
0x04,0xB6,0x45, //1962
0x4A,0x57,0x39, //1963
0x0A,0x57,0x4d, //1964
0x05,0x26,0x42, //1965
0x3e,0x93,0x35, //1966
0x0d,0x95,0x49, //1967
0x75,0xAA,0xBe, //1968
0x05,0x6A,0x51, //1969
0x09,0x6d,0x46, //1970
0x54,0xAe,0xBB, //1971
0x04,0xAd,0x4f, //1972
0x0A,0x4d,0x43, //1973
0x4d,0x26,0xB7, //1974
0x0d,0x25,0x4B, //1975
0x8d,0x52,0xBf, //1976
0x0B,0x54,0x52, //1977
0x0B,0x6A,0x47, //1978
0x69,0x6d,0x3C, //1979
0x09,0x5B,0x50, //1980
0x04,0x9B,0x45, //1981
0x4A,0x4B,0xB9, //1982
0x0A,0x4B,0x4d, //1983
0xAB,0x25,0xC2, //1984
0x06,0xA5,0x54, //1985
0x06,0xd4,0x49, //1986
0x6A,0xdA,0x3d, //1987
0x0A,0xB6,0x51, //1988
0x09,0x37,0x46, //1989
0x54,0x97,0xBB, //1990
0x04,0x97,0x4f, //1991
0x06,0x4B,0x44, //1992
0x36,0xA5,0x37, //1993
0x0e,0xA5,0x4A, //1994
0x86,0xB2,0xBf, //1995
0x05,0xAC,0x53, //1996
0x0A,0xB6,0x47, //1997
0x59,0x36,0xBC, //1998
0x09,0x2e,0x50, //1999 294
0x0C,0x96,0x45, //2000 297
0x4d,0x4A,0xB8, //2001
0x0d,0x4A,0x4C, //2002
0x0d,0xA5,0x41, //2003
0x25,0xAA,0xB6, //2004
0x05,0x6A,0x49, //2005
0x7A,0xAd,0xBd, //2006
0x02,0x5d,0x52, //2007
0x09,0x2d,0x47, //2008
0x5C,0x95,0xBA, //2009
0x0A,0x95,0x4e, //2010
0x0B,0x4A,0x43, //2011
0x4B,0x55,0x37, //2012
0x0A,0xd5,0x4A, //2013
0x95,0x5A,0xBf, //2014
0x04,0xBA,0x53, //2015
0x0A,0x5B,0x48, //2016
0x65,0x2B,0xBC, //2017
0x05,0x2B,0x50, //2018
0x0A,0x93,0x45, //2019
0x47,0x4A,0xB9, //2020
0x06,0xAA,0x4C, //2021
0x0A,0xd5,0x41, //2022
0x24,0xdA,0xB6, //2023
0x04,0xB6,0x4A, //2024
0x69,0x57,0x3d, //2025
0x0A,0x4e,0x51, //2026
0x0d,0x26,0x46, //2027
0x5e,0x93,0x3A, //2028
0x0d,0x53,0x4d, //2029
0x05,0xAA,0x43, //2030
0x36,0xB5,0x37, //2031
0x09,0x6d,0x4B, //2032
0xB4,0xAe,0xBf, //2033
0x04,0xAd,0x53, //2034
0x0A,0x4d,0x48, //2035
0x6d,0x25,0xBC, //2036
0x0d,0x25,0x4f, //2037
0x0d,0x52,0x44, //2038
0x5d,0xAA,0x38, //2039
0x0B,0x5A,0x4C, //2040
0x05,0x6d,0x41, //2041
0x24,0xAd,0xB6, //2042
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, //2052
0x04,0x97,0x53, //2053
0x06,0x4B,0x48, //2054
0x66,0xA5,0x3C, //2055
0x0e,0xA5,0x4f, //2056
0x06,0xB2,0x44, //2057
0x4A,0xB6,0x38, //2058
0x0A,0xAe,0x4C, //2059
0x09,0x2e,0x42, //2060
0x3C,0x97,0x35, //2061
0x0C,0x96,0x49, //2062
0x7d,0x4A,0xBd, //2063
0x0d,0x4A,0x51, //2064
0x0d,0xA5,0x45, //2065
0x55,0xAA,0xBA, //2066
0x05,0x6A,0x4e, //2067
0x0A,0x6d,0x43, //2068
0x45,0x2e,0xB7, //2069
0x05,0x2d,0x4B, //2070
0x8A,0x95,0xBf, //2071
0x0A,0x95,0x53, //2072
0x0B,0x4A,0x47, //2073
0x6B,0x55,0x3B, //2074
0x0A,0xd5,0x4f, //2075
0x05,0x5A,0x45, //2076
0x4A,0x5d,0x38, //2077
0x0A,0x5B,0x4C, //2078
0x05,0x2B,0x42, //2079
0x3A,0x93,0xB6, //2080
0x06,0x93,0x49, //2081
0x77,0x29,0xBd, //2082
0x06,0xAA,0x51, //2083
0x0A,0xd5,0x46, //2084
0x54,0xdA,0xBA, //2085
0x04,0xB6,0x4e, //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
};


/*月份數據表*/
static unsigned char  KeyWord day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
static unsigned short KeyWord day_code2[3]={0x111,0x130,0x14e};
/****************************************************************************
* 子函數,用於讀取數據表中農曆月的大月或小月,如果該月爲大返回1,爲小返回0
****************************************************************************/
static unsigned char GetMoonDay(unsigned char month_p,unsigned short table_addr)
{
switch (month_p)
{
case 1:
if((year_code[table_addr]&0x08)==0) return(0);
else return(1); 
case 2:
if((year_code[table_addr]&0x04)==0) return(0);
else return(1);
case 3:
if((year_code[table_addr]&0x02)==0) return(0);
else return(1);
case 4:
if((year_code[table_addr]&0x01)==0) return(0);
else return(1);
case 5:
if((year_code[table_addr+1]&0x80)==0) return(0);
else return(1);
case 6:
if((year_code[table_addr+1]&0x40)==0) return(0);
else return(1);
case 7:
if((year_code[table_addr+1]&0x20)==0) return(0);
else return(1);
case 8:
if((year_code[table_addr+1]&0x10)==0) return(0);
else return(1);
case 9:
if((year_code[table_addr+1]&0x08)==0) return(0);
else return(1);
case 10:
if((year_code[table_addr+1]&0x04)==0) return(0);
else return(1);
case 11:
if((year_code[table_addr+1]&0x02)==0) return(0);
else return(1);
case 12:
if((year_code[table_addr+1]&0x01)==0) return(0);
else return(1);
case 13:
if((year_code[table_addr+2]&0x80)==0) return(0);
else return(1);
}
return(0);
}


/*********************************************************************************************************
** 函數名稱:GetChinaCalendar
** 功能描述:公農曆轉換(只允許1901-2099年)
** 輸 入:  year        公曆年
**          month       公曆月
**          day         公曆日
**          p           儲存農曆日期地址
** 輸 出:  1           成功
**          0           失敗
** 作 者:  Campo
** 修  改:  賴皮
** 日 期:  2007年02月06日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
unsigned char GetChinaCalendar(
unsigned int  year,
unsigned char month,
unsigned char day,
unsigned char *p)

unsigned char temp1,temp2,temp3,month_p,yearH,yearL;
unsigned char flag_y;
unsigned short temp4,table_addr;


yearH=year/100; yearL=year%100;
if((yearH!=19)&&(yearH!=20)) return(0);

/* 定位數據表地址 */
table_addr=(int)(yearL-1)*3;
if(yearH==20) table_addr+=100*3;


/* 取當年春節所在的公曆月份 */
temp1=year_code[table_addr+2]&0x60;
temp1>>=5;


/* 取當年春節所在的公曆日 */
temp2=year_code[table_addr+2]&31; 


/* 計算當年春年離當年元旦的天數,春節只會在公曆1月或2月 */
if(temp1==1) temp3=temp2-1; 
else temp3=temp2+31-1; 


/* 計算公曆日離當年元旦的天數 */
if (month<10) temp4=day_code1[month-1]+day-1;
else   temp4=day_code2[month-10]+day-1;
/* 如果公曆月大於2月並且該年的2月爲閏月,天數加1 */
if ((month>2)&&(yearL%4==0)) temp4++;


/* 判斷公曆日在春節前還是春節後 */
if (temp4>=temp3)
{
temp4-=temp3;
month=1;
month_p=1;

flag_y=0;
if(GetMoonDay(month_p,table_addr)==0) temp1=29; //小月29天
else temp1=30; //大小30天
/* 從數據表中取該年的閏月月份,如爲0則該年無閏月 */
temp2=year_code[table_addr]/16;
while(temp4>=temp1)
{
temp4-=temp1;
month_p++;
if(month==temp2)
{
flag_y=~flag_y;
if(flag_y==0)month++;
}
else month++;
if(GetMoonDay(month_p,table_addr)==0) temp1=29;
else temp1=30;
}
day=temp4+1;
}
/* 公曆日在春節前使用下面代碼進行運算 */
else
{
temp3-=temp4;
if (yearL==0)
{
yearL=100-1;
yearH=19;
}
else yearL--;
table_addr-=3;
month=12;
temp2=year_code[table_addr]/16;
if (temp2==0) month_p=12; 
else month_p=13; 


flag_y=0;
if(GetMoonDay(month_p,table_addr)==0) temp1=29; 
else temp1=30; 
while(temp3>temp1)
{
temp3-=temp1;
month_p--;
if(flag_y==0) month--;
if(month==temp2) flag_y=~flag_y;
if(GetMoonDay(month_p,table_addr)==0) temp1=29;
else temp1=30;
}
day=temp1-temp3+1;
}


*p++=yearH;
*p++=yearL;
*p++=month;
*p=day;
return(1);
}


static unsigned char KeyWord table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正數據表
/*********************************************************************************************************
** 函數名稱:GetWeek
** 功能描述:輸入公曆日期得到星期(只允許1901-2099年)
** 輸 入:  year        公曆年
**          month       公曆月
**          day        公曆日
**          week        儲存星期地址
** 輸 出:  無
** 作 者:  Campo
** 修  改:  賴皮
** 日 期:  2007年02月06日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GetWeek(
unsigned int year,
unsigned char month,
unsigned char day,
unsigned char *week)
{
unsigned int temp2;
unsigned char yearH,yearL;

yearH=year/100; yearL=year%100;

/* 如果爲21世紀,年份數加100 */
if (yearH>19) yearL+=100;
/* 所過閏年數只算1900年之後的 */
temp2=yearL+yearL/4;
temp2=temp2%7; 
temp2=temp2+day+table_week[month-1];
if (yearL%4==0&&month<3) temp2--;
*week=(temp2%7);
}


/*********************************************************************************************************
** 函數名稱:GetSkyEarth
** 功能描述:輸入公曆日期得到一個甲子年(只允許1901-2099年)
** 輸 入:  year        公曆年
**          p           儲存一個甲子年地址
** 輸 出:  無
** 作 者:  賴皮        ★〓個人原創〓★
** 日 期:  2007年02月06日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static void GetSkyEarth(unsigned int year,unsigned char *p)
{
unsigned char x;

if(year>=1984)
{
year=year-1984;
x=year%60;
}
else
{
year=1984-year;
x=60-year%60;
}
*p=x;
}
static unsigned char KeyWord sky[][3]=  {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸",};
static unsigned char KeyWord earth[][3]={"子","醜","寅","卯","辰","巳","午","未","申","酉","戌","亥",};
static unsigned char KeyWord monthcode[][3]={"一","二","三","四","五","六","七","八","九","十","冬","臘",};
static unsigned char KeyWord nongliday[][3]={"初","十","廿","三",};
static void StrCopy(char *target,unsigned char const *source,unsigned char no)
{
#if CPU_TYPE == C51
    unsigned char i;
#else
    unsigned int i;
#endif

for(i=0;i<no;i++)
{
*target++=*source++;
}
}
/*********************************************************************************************************
** 函數名稱:GetChinaCalendarStr
** 功能描述:輸入公曆日期得到農曆字符串
**          如:GetChinaCalendarStr(2007,02,06,str) 返回str="丙戌年臘月十九"
** 輸 入:  year        公曆年
**          month       公曆月
**          day         公曆日
**          str         儲存農曆日期字符串地址   15Byte
** 輸 出:  無
** 作 者:  賴皮        ★〓個人原創〓★
** 日 期:  2007年02月06日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GetChinaCalendarStr(
unsigned int  year,
unsigned char month,
unsigned char day,
        char *str)
{
unsigned char NLyear[4];
unsigned char SEyear;

StrCopy(&str[0],(unsigned char *)"甲子年正月初一",15);
if(GetChinaCalendar(year,month,day,(unsigned char *)NLyear)==0) return;
GetSkyEarth(NLyear[0]*100+NLyear[1],&SEyear);
StrCopy(&str[0],(unsigned char *)  sky[SEyear%10],2); //  甲
StrCopy(&str[2],(unsigned char *)earth[SEyear%12],2); //  子

if(NLyear[2]==1) StrCopy(&str[6],(unsigned char *)"正",2);
else StrCopy(&str[6],(unsigned char *)monthcode[NLyear[2]-1],2);

if(NLyear[3]>10) StrCopy(&str[10],(unsigned char *)nongliday[NLyear[3]/10],2);
else StrCopy(&str[10],(unsigned char *)"初",2);
StrCopy(&str[12],(unsigned char *)monthcode[(NLyear[3]-1)%10],2);
}


/*********************************************************************************************************
**         以下爲24節氣計算相關程序
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/


#if  JieQiEn == 1
/*  
    每年24節氣標誌表   
    有興趣的朋友可按照上面給的原理添加其它年份的表格
    不是很清楚的朋友可給我發EMAIL
*/
static unsigned char KeyWord YearMonthBit[]=
{
0x4E,0xA6,0x99, //2000
0x9C,0xA2,0x98, //2001
0x80,0x00,0x18, //2002
0x00,0x10,0x24, //2003
0x4E,0xA6,0x99, //2004
0x9C,0xA2,0x98, //2005
0x80,0x82,0x18, //2006
0x00,0x10,0x24, //2007
0x4E,0xA6,0xD9, //2008
0x9E,0xA2,0x98, //2009


0x80,0x82,0x18, //2010
0x00,0x10,0x04, //2011
0x4E,0xE6,0xD9, //2012
0x9E,0xA6,0xA8, //2013
0x80,0x82,0x18, //2014
0x00,0x10,0x00, //2015
0x0F,0xE6,0xD9, //2016
0xBE,0xA6,0x98, //2017
0x88,0x82,0x18, //2018
0x80,0x00,0x00, //2019


0x0F,0xEF,0xD9, //2020
0xBE,0xA6,0x99, //2021
0x8C,0x82,0x98, //2022
0x80,0x00,0x00, //2023
0x0F,0xEF,0xDB, //2024
0xBE,0xA6,0x99, //2025
0x9C,0xA2,0x98, //2026
0x80,0x00,0x18, //2027
0x0F,0xEF,0xDB, //2028
0xBE,0xA6,0x99, //2029


0x9C,0xA2,0x98, //2030
0x80,0x00,0x18, //2031
0x0F,0xEF,0xDB, //2032
0xBE,0xA2,0x99, //2033
0x8C,0xA0,0x98, //2034
0x80,0x82,0x18, //2035
0x0B,0xEF,0xDB, //2036
0xBE,0xA6,0x99, //2037
0x8C,0xA2,0x98, //2038
0x80,0x82,0x18, //2039


0x0F,0xEF,0xDB, //2040
0xBE,0xE6,0xD9, //2041 
0x9E,0xA2,0x98, //2042
0x80,0x82,0x18, //2043
0x0F,0xEF,0xFB, //2044
0xBF,0xE6,0xD9, //2045
0x9E,0xA6,0x98, //2046
0x80,0x82,0x18, //2047
0x0F,0xFF,0xFF, //2048
0xFC,0xEF,0xD9, //2049
0xBE,0xA6,0x18, //2050
};
static unsigned char KeyWord days[]=
{
6,20,4,19,6,21,         //一月到三月  的節氣基本日期
5,20,6,21,6,21,         //四月到六月  的節氣基本日期
7,23,8,23,8,23,         //七月到九月  的節氣基本日期
8,24,8,22,7,22,         //十月到十二月的節氣基本日期
};
static char KeyWord JieQiStr[][5]=  //以公曆日期先後排序
{
 /*  名稱        角度    公曆日期     週期 */
"小寒",     //285     1月 6日
"大寒",     //300     1月20日    29.5天
"立春",     //315     2月 4日
"雨水",     //330     2月19日    29.8天
"驚蟄",     //345     3月 6日
"春分",     //  0     3月21日    30.2天
"清明",     // 15     4月 5日
"穀雨",     // 30     4月20日    30.7天
"立夏",     // 45     5月 6日
"夏滿",     // 60     5月21日    31.2天
"芒種",     // 75     6月 6日
"夏至",     // 90     6月21日    31.4天
"小暑",     //105     7月 7日
"大暑",     //120     7月23日    31.4天
"立秋",     //135     8月 8日
"處暑",     //150     8月23日    31.1天
"白露",     //165     9月 8日
"秋分",     //180     9月23日    30.7天
"寒露",     //195    10月 8日
"霜降",     //210    10月24日    30.1天
"立冬",     //225    11月 8日
"小雪",     //240    11月22日    29.7天
"大雪",     //255    12月 7日
"冬至",     //270    12月22日    29.5天
};
/*********************************************************************************************************
** 函數名稱:GetJieQi
** 功能描述:輸入公曆日期得到本月24節氣日期 day<15返回上半月節氣,反之返回下半月
**          如:GetJieQiStr(2007,02,08,str) 返回str[0]=4
** 輸 入:  year        公曆年
**          month       公曆月
**          day         公曆日
**          str         儲存對應本月節氣日期地址   1Byte
** 輸 出:  1           成功
**          0           失敗
** 作 者:  賴皮        ★〓個人原創〓★
** 日 期:  2007年02月08日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
unsigned char GetJieQi(
unsigned  int year,
unsigned char month,
unsigned char day,
unsigned char *JQdate)
{
unsigned char bak1,value,JQ;


if((year<2000)||(year>2050))     return 0;
if((month==0) ||(month>12))      return 0;
JQ = (month-1) *2 ;                        //獲得節氣順序標號(0~23
if(day >= 15) JQ++;                        //判斷是否是上半月


bak1=YearMonthBit[(year-2000)*3+JQ/8];          //獲得節氣日期相對值所在字節
value =((bak1<<(JQ%8))&0x80);                   //獲得節氣日期相對值狀態


*JQdate=days[JQ];
if( value != 0 )
{
//判斷年份,以決定節氣相對值1代表1,還是-1。
if( (JQ== 1||JQ== 11||JQ== 18||JQ== 21)&&year< 2044)  (*JQdate)++;
else                                                  (*JQdate)--;
}
return 1;
}
static unsigned char KeyWord MonthDayMax[]={31,28,31,30,31,30,31,31,30,31,30,31,};
/*********************************************************************************************************
** 函數名稱:GetJieQiStr
** 功能描述:輸入公曆日期得到24節氣字符串
**          如:GetJieQiStr(2007,02,08,str) 返回str="離雨水還有11天"
** 輸 入:  year        公曆年
**          month       公曆月
**          day         公曆日
**          str         儲存24節氣字符串地址   15Byte
** 輸 出:  1           成功
**          0           失敗
** 作 者:  賴皮        ★〓個人原創〓★
** 日 期:  2007年02月08日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
unsigned char GetJieQiStr(
unsigned int year,
unsigned char month,
unsigned char day,
        char *str)
{
unsigned char JQdate,JQ,MaxDay;


if(GetJieQi(year,month,day,&JQdate)==0) return 0;


JQ = (month-1) *2 ;                             //獲得節氣順序標號(0~23
if(day >= 15) JQ++;                             //判斷是否是上半月


if(day==JQdate)                                 //今天正是一個節氣日
{
StrCopy(str,(unsigned char *)JieQiStr[JQ],5);
return 1;
}
                                               //今天不是一個節氣日
StrCopy(str,(unsigned char *)"離小寒還有??天",15);
if(day<JQdate)                                  //如果今天日期小於本月的節氣日期
{
StrCopy(&str[2],(unsigned char *)JieQiStr[JQ],4);
day=JQdate-day;

else                                            //如果今天日期大於本月的節氣日期
{
StrCopy(&str[2],(unsigned char *)JieQiStr[(JQ+1)%24],4);   
//每年只有24個節氣 此處需限定 冬至翻轉會溢出
if(day < 15)
{
GetJieQi(year,month,15,&JQdate);
day=JQdate-day;
}
else                                        //翻月
{
MaxDay=MonthDayMax[month-1];
if(month==2)                            //潤月問題
{
if((year%4==0)&&((year%100!=0)||(year%400==0))) MaxDay++;
}
if(++month==13) month=1;
GetJieQi(year,month,1,&JQdate);
day=MaxDay-day+JQdate;
}
}
str[10]=day/10+'0';
str[11]=day%10+'0';
return 1;
}
#endif
/*********************************************************************************************************
**         以下爲12生肖計算相關程序
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if  ShengXiaoEn == 1
static char KeyWord ShengXiao[][3]=
{
"鼠","牛","虎","兔","龍","蛇",
"馬","羊","猴","雞","狗","豬",
};
/*********************************************************************************************************
** 函數名稱:GetShengXiaoStr
** 功能描述:輸入公曆日期得到12生肖字符串
**          如:GetShengXiaoStr    (2007,3,4,str);     //str   ={"豬"}
** 輸 入:  year        公曆年
**          month       公曆月
**          day         公曆日
**          str         儲存12生肖字符串地址   3Byte
** 輸 出:  無
** 作 者:  賴皮        ★〓個人原創〓★
** 日 期:  2007年03月04日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GetShengXiaoStr(
unsigned int  year,
unsigned char month,
unsigned char day,
        char *str)
{
unsigned char NLyear[4];
unsigned char SEyear;

if(GetChinaCalendar(year,month,day,(unsigned char *)NLyear)==0) return;
GetSkyEarth(NLyear[0]*100+NLyear[1],&SEyear);
StrCopy(str,(unsigned char *)ShengXiao[SEyear%12],3);
}
#endif
發佈了1 篇原創文章 · 獲贊 26 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章