
除了天数差计算,基本上是完成了你所提出的功能(天数差计算其实已经提供了年内序数计算方方法,可以在此基础上完善即可)。包含星期计算、公历转农历、农历转公历、节气查询。数据与算法均为原创,绝非网上复制而来。附件中有源代码,同时附带农历数据提取工具,可提取1600到7000年之间的任意年份区间,提取后的数据为压缩数据,占用空间小,同时数据包含数九、三伏、入梅和出梅,非常适合写一份完整的万年历。
部分核心算法函数如下:
//判断闰年,参数:年份,返回值:0-平年,1-闰年int IsLeapYear(int iYear);
//计算日期在年内的序数,参数:年,月,日,年内序数,返回值:0-失败,1-成功
int GetDaysNumInYear(int iYear, int iMonth, int iDay,int nDays);
//从年内序数计算月、日,参数:年,年内序数,月,日,返回值:0-失败,1-成功
int GetDateFromDays(int iYear, int nDays, int iMonth, int iDay);
//检验年、月、日的合法性,参数:年,月,日,返回值:0-失败,1-成功
int DateCheck(int iYear,int iMonth,int iDay);
//获取农历新年的公历年内序数,参数:农历年,返回值:农历新年的公历年内序数
int LunarGetNewYearOrdinal(int iLunarYear);
//获取农历月的天数,参数:农历年,农历月,是否为闰月,返回值:该农历月的天数,为0代表参数无效
int LunarGetDaysofMonth(int iLunarYear,int iLunarMonth,int IsLeapMonth);
//展开大小月数据表(某一年的),参数:农历年,从上一年十一月开始到当前年份(闰)十二月的每月天数,返回值:0-失败,1-成功
int LunarExpandDX(int iLunarYear,int iDayOfMonth[15]);
//获取农历某一年的闰月情况,参数:农历年,返回值,该年的闰月月份,0表示无闰月
int LunarGetLeapMonth(int iLunarYear);
//公历转农历,参数:公历年、月、日,农历年、月、日,是否为闰月,返回值:0-失败,1-成功
int Gongli2Nongli(int iYear,int iMonth,int iDay,int iLunarYear,int iLunarMonth,int iLunarDay,int iIsLeapMonth);
//农历转公历,参数:家历年、月、日,是否为闰月,公历年、月、日,返回值:0-失败,1-成功
int Nongli2Gongli(int iLunarYear,int iLunarMonth,int iLunarDay,int iIsLeapMonth,int iYear,int iMonth,int iDay);
//得到指定年份的节气信息,首个是小寒
int GetJieQi(int iYear,int uMonth,unsigned int uJieQi[2]);
//计算星期
unsigned int GetDayOfWeek(int iYear,int uMonth,int uDay);
源代码请看
吧。提取码:ooj7这是一个1602计时的程序,稍微改一下就是万年历了
//12MHz#include<AT89X51H>
unsigned char Sec,Min,Hour;
#define DB P2
#define RS P3_0
#define RW P3_1
#define E P3_2
void delay1ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void nop(unsigned char time){while(time--);}
void LCD_WriteCmd(unsigned char cmd)
{
RS=0;
DB=cmd;
E=0;
nop(5);
E=1;
nop(5);
}
void LCD_WriteData(unsigned char dat)
{
RS=1;
DB=dat;
E=0;
nop(5);
E=1;
nop(5);
}
void Init1602(void)
{
RW=0;
LCD_WriteCmd(0x38);
delay1ms();
LCD_WriteCmd(0x0c);
delay1ms();
LCD_WriteCmd(0x06);
delay1ms();
LCD_WriteCmd(0x01);
delay1ms();
}
void LCD_Clear()
{
LCD_WriteCmd(0x01);
delay1ms();
}
void LCD_SetAddress(unsigned char x,unsigned char y)
{
if(y)
LCD_WriteCmd(0xc0+x);
else
LCD_WriteCmd(0x80+x);
delay1ms();
}
void LCD_DrawChar(unsigned char dat)
{
LCD_WriteData(dat);
delay1ms();
}
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x3C;
TL0 = 0x0B0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
InitTimer0();//初始化50ms定时器中断
Init1602();//初始化1602
LCD_Clear();//1602清屏
while(1)
{
LCD_SetAddress(4,0);//显示时间
LCD_DrawChar(Hour/10+'0');
LCD_DrawChar(Hour%10+'0');
LCD_DrawChar(':');
LCD_DrawChar(Min/10+'0');
LCD_DrawChar(Min%10+'0');
LCD_DrawChar(':');
LCD_DrawChar(Sec/10+'0');
LCD_DrawChar(Sec%10+'0');
}
}
void Timer0Interrupt(void) interrupt 1
{
static unsigned char cont;
TH0 += 0x3C;
TL0 += 0x0B0;
if(++cont==20)//2050ms=1s
{
cont=0;
if(++Sec==60)
{
Sec=0;
if(++Min==60)
{
Min=0;
if(++Hour==24)
{
Hour=0;
}
}
}
}
}
效果:
以上就是关于万年历查询程序. C语言代码全部的内容,包括:万年历查询程序. C语言代码、求不需要时钟芯片单片万年历LCD1602显示程序。坐等,急急急 基于STC89C52、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)