本帖最后由 ac9979 于 2019-11-5 22:09 编辑
前段时间用STC15L104W改了一个时钟,增加了农历显示功能,参照了你的程序,但是文件大小超出了范围,只好想办法精简程序,发现如果农历年和阳历不是同一年,可以递归调用本函数 GetSpringDay(GreYear+1, GreMon+12, GreDay),代码会少30%,这个判断就不需要了: if(F) //春节在公历日期后{ ……} 。
具体代码如下:
typedef unsigned int u16; //16位无符号整型数
typedef unsigned char u8; //8位无符号整型数
u8 dn(u8 yy,u8 mm,u8 dd); //公历转农历函数
u8 temp;
u8 NonY=0; //农历年
u8 NonM=0; //农历月
u8 NonD=0; //农历日
u16 nday[]={0,31,59,90,120,151,181,212,243,273,304,334,365,396}; //第n-1月有多少天
//公历年对应的农历数据,每年三字节,
//格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小
//第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小
//月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天).
//第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期
u8 code Data[]={
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</