我的基于单片机的公历转农历函数终于写出来了~

这段时间我都把精力投入到单片机编程开发上面,经常熬夜,有时感觉好累,又怕耽误了其他其他事情。最近一直在做一个基于单片机的超级万年历,用LCD12864作显示屏。虽然网上都有很多人做过了,但是我没做过,所以我也要做,要自己一个字一个字的的编写,不管是成功还是失败,这个过程总能让我学到很多东西,我认为。曾经在一个个网友的程序上面看到这个这么一句话:未曾尝试,就不能说失败。尝试对一个人的成长是很重要的。至少我前几天的努力就证明我尝试过了,也成功一大半了。万年历中的公历转农历的计算是个难点之一,现在我经过努力编写出来了,相信有信心有奋斗下去的勇气,接下来的工作会更成功的。

为了纪念我这次成功,我把这个公历转农历的函数放在这里,给自己的成长留点记印:

库名:gton.h

 

程序:

#ifndef _gton_h__    //防止重载
#define _gton_h__
uchar idata datenong[4];  //
uchar code data1[]={     //(200-(2100-year)-1)*3+Offset1(0,1,2选取第几位字节)
0x04,0xAe,0x53, //1901  0 (200-(2100-1901)-1)*3=0
0x0A,0x57,0x48, //1902 3   (200-(2100-1902)-1)*3=3
0x55,0x26,0xBd, //1903 6 (200-(2100-1903)-1)*3=3
0x0d,0x26,0x50, //1904 9   (200-(2100-year)-1)*3
0x0d,0x95,0x44, //1905 12 
0x46,0xAA,0xB9, //1906 15
0x05,0x6A,0x4d, //1907
0x09,0xAd,0x42, //1908
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 
0x0C,0x96,0x45, //2000
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
0x0d,0x53,0x49, //2100
};

//公历各个月的天数:
uchar code days_in_a_mon[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
    {31,29,31,30,31,30,31,31,30,31,30,31}};


uchar yearstype(uint y)   
{
 if(!(y%100 && y%4)||!(y%400)) return(1); else return(0); 
}


void nongli(uint year,uchar mon,uchar day)
{
 uchar i;
 uchar dayspring,monspring;
 uint days=0,days1=0;
 uchar days_nong=0,mon_nong=0,data11=0,data22=0,data33=0,data44=0,fm1=0;
 bit flag=0,flag1=0,fm=0; //flag平润年标志,1表示平;fm为春节到当日期间存在闰月的标志
 dayspring=data1[(200-(2100-year)-1)*3+2]&0x1f; //春节是的公历日
 monspring=((data1[(200-(2100-year)-1)*3+2]&0x60)>>5);//春节时的公历月

 flag=yearstype(year);
 for(i=0;i<mon-1;i++)
 {
  days+=days_in_a_mon[flag][i];
 }
 days+=day;
 for(i=0;i<monspring-1;i++)
 {
  days1+=days_in_a_mon[flag][i]; 
 }
 days1+=dayspring;


 if(days==days1)
 {
  datenong[0]=0;
  datenong[1]=1;
  datenong[2]=0;
  datenong[3]=1;
 }//春节
 else if(days>days1) //当日在春节之后
 {
  data11=data1[(200-(2100-year)-1)*3]&0x0f;//1-4月的天数大小(大为30天,小为29天)
  data22=data1[(200-(2100-year)-1)*3+1]; //5-12月的天数大小
  data33=(data1[(200-(2100-year)-1)*3+2]&0x80)>>7;//第13个月的大小(有闰月才有)
  data44=(data1[(200-(2100-year)-1)*3]&0xf0)>>4;//闰月所在的月份,0表示无闰月

  days-=days1;
  mon_nong=1;
  fm=0;
  flag1=0;
  days_nong=30*(data11>>3)+29*(!(data11>>3));
  while(days>=days_nong)
  {
   flag1=1;
   days-=days_nong;
   if(data44==mon_nong) //此月时润月
   {
    fm=1; //标志
   }
   mon_nong++;
   if(mon_nong<5) //1-4月
   {
    days_nong=30*((data11>>(4-mon_nong))&0x01)+29*(!(((data11>>(4-mon_nong))&0x01)));
   }
   else if((mon_nong==13)&&(fm==1)) //有闰月的一年的最后一个月
   {
    days_nong=30*data33+29*(!data33);
   }
   else if(mon_nong>=5 && mon_nong<13)  //5-12月
   {
    days_nong=30*((data22>>(12-mon_nong))&0x01)+29*(!((data22>>(12-mon_nong))&0x01));
   }
  }
  if(fm==1) //其中有闰月,要减去一个月
  {
   fm=0;
   mon_nong--;
  }
  datenong[0]=mon_nong/10;
  datenong[1]=mon_nong%10;
  datenong[2]=(days+1)/10;
  datenong[3]=(days+1)%10;
 }
 else if(days<days1) //当日在春节之前
 {
  data11=data1[(200-(2100-year)-1)*3-3]&0x0f;//上一年1-4月的天数大小(大为30天,小为29天)
  data22=data1[(200-(2100-year)-1)*3+1-3]; //上一年5-12月的天数大小
  data33=(data1[(200-(2100-year)-1)*3+2-3]>>7);//上一年第13个月的大小(有闰月才有)
  data44=((data1[(200-(2100-year)-1)*3-3]&0xf0)>>4);//上一年闰月所在的月份,0表示无闰月
  

  days=days1-days; //当天离春节的天数
  mon_nong=12;
  fm=0;
 // flag1=0;
  if(data44==0)
  {
   days_nong=30*(data22&0x01)+29*(!(data22&0x01));
   fm1=0;
  }
  else
  {
   days_nong=30*data33+29*(!data33);
   fm1=1;

    }

  while(days>days_nong)
  {
   //flag1=1;
   days-=days_nong;
   if(data44==mon_nong) //此月时润月
   {
    fm=1; //标志
   }
   mon_nong--;
   if(mon_nong<(5-fm1)) //1-4月
   {
    days_nong=30*((data11>>(4-mon_nong-fm1))&0x01)+29*(!(((data11>>(4-mon_nong-fm1))&0x01)));
   }
   else  //5-12月
   {
    days_nong=30*((data22>>(12-mon_nong-fm1))&0x01)+29*(!((data22>>(12-mon_nong-fm1))&0x01));
   }
  }
  //if(flag1==1) {mon_nong--;flag1=0;} //
  if(fm==1) //其中有闰月,要加上一个月
  {
   fm=0;
   mon_nong++;
  }
  datenong[0]=mon_nong/10;
  datenong[1]=mon_nong%10;
  datenong[2]=(days_nong-days+1)/10;
  datenong[3]=(days_nong-days+1)%10;
 }
}

#endif

永不止步步 发表于12-20 10:47 浏览65219次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:302217个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号