⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctime.c

📁 用NXP公司P89LPC9401单片机开发液晶显示,包括开发资料,各功能驱动程序.
💻 C
字号:
//***********************************************************************
//FILE:	cime.c	
//功能:	将公历日期转换为农历日期和星期
//***********************************************************************
#include"main.h"
#include"time.h"
//***********************************************************************
uchar Cyear,Cmonth,Cday;
uchar Weekday;
//***********************************************************************
uint code RunDays[12]={					//闰年本月以前天数累加表
 0,31,60,91,121,152,
 182,213,244,274,305,335};
//***********************************************************************
uint code PingDays[12]={				//平年本月以前天数累加表
 0,31,59,90,120,151,
 181,212,243,273,304,334};
//***********************************************************************
uchar code RunWeekTab[12]={				//闰年月星期表
 3,6,0,3,5,1,3,6,2,4,0,2};
//***********************************************************************
uchar code PingWeekTab[12]={			//平年月星期表
 4,0,0,3,5,1,3,6,2,4,0,2};
//***********************************************************************
//公历农历转换表(2000-2099)
//第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 
//对应农历第1-4 月的大小
//第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表
//示农历第13 个月大小(为1代表此月大,为0代表为小)
//第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的
//公历日期
//注:由于公历表示的范围是2000-2009,所以农历的范围是
//1999-2099,所以这里第一个数据是1999年的信息
uchar code CyearTab[101][3]={
 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
 //***********************************************************************
void  DayBeforeNewYear(uint xdays)		//公历日在春节日前的处理
{
	bit runmonth;						//闰月标志
	uchar buf1,buf2,buf3;
	if(Year==0)							//如果当前是2000年
		Cyear=99;						//则把农历置为1999年
	else
		Cyear=Year-1;					//否则农历年比公历少一天
	Cmonth=12;							//农历月=12月
	runmonth=0;							//闰月标志设为0
	buf1=CyearTab[Year][0];				//读取闰月状态
	buf1&=0xf0;							//取高位闰月信息
	buf1>>=4;							//取得闰月
	buf2=CyearTab[Year][1];				//读后8个月的大小月信息
	if(buf1!=0)							//如果有闰月
	{
		buf3=CyearTab[Year][2];			//读取第三个字节
		buf2<<=1;		
		if((buf3&0x80)!=0)
			buf2|=0x01;					//将第13个月的信息加到buf2的最低位

		buf3=((buf2&0x01)==0)?29:30;	//取12月的天数
		while(xdays>buf3)				//如果xdays大于此月的天数
    	{						
			xdays=xdays-buf3;			//则减去此月的天数
			if(runmonth!=1)				//如果当前不是闰月
				Cmonth--;				//则将月减1
			if(Cmonth==buf1)			//如果此月是闰月,则将标志取反
				runmonth=!runmonth;	
			buf2>>=1;					//将下个月的大小月信息移到bit0
			buf3=((buf2&0x01)==0)?29:30;//取得需处理的月的天数
	    }
	}
	else								//今年没有闰月
	{
		buf3=((buf2&0x01)==0)?29:30;	//取12月的天数
		while(xdays>buf3)				//如果xdays>本月天数
    	{
			xdays=xdays-buf3;			//减去本月天数
			Cmonth--;					//农历月减一
			buf2>>=1;					//取下一个月的状态
			buf3=((buf2&0x01)==0)?29:30;//取下个月的天数	
	    }
	}
	Cday=buf3-(uchar)xdays+1;			//计算农历日
}
//***********************************************************************
void  DayAfterNewYear(uint xdays)		//公历日在春节后的处理	
{	
	bit runmonth;						//闰月标志
	uchar buf1,buf2,buf3;
	uint  buf4;
	Cyear=Year;							//农历年=公历年
	Cmonth=1;							//农历月=1月
	runmonth=0;							//闰月标志设为0,1月不会是闰月
	buf1=CyearTab[Year+1][0];			//读取闰月状态
	buf3=CyearTab[Year+1][1];			//读取5到12月的月信息
	buf2=buf1&0x0f;							
	buf2<<=4;				
	buf2+=(buf3>>4);					
	buf3<<=4;							//将12个月的信息存
	buf4=((uint)buf2)*256+buf3;			//于一个整型数据方便处理
	buf1&=0xf0;							//取高位闰月信息
	buf1>>=4;							//取得闰月
	if(buf1!=0)							//如果有闰月
	{	
		buf2=CyearTab[Year+1][2];		//读取第三个字节
		if((buf2&0x80)!=0)
			buf4|=0x08;					//将第13个月的信息加到整型buf4中
		buf2=((buf4&0x8000)==0)?29:30;	//取1月的天数
		while(xdays>=buf2)				//如果xdays大于此月的天数
    	{						
			xdays=xdays-buf2;			//则减去此月的天数
			if(runmonth!=1)				//如果当前不是闰月
				Cmonth++;				//则将月加1
			if(Cmonth==buf1)			//如果此月是闰月,则将标志取反
				runmonth=!runmonth;	
			buf4<<=1;					//将下个月的大小月信息移到bit0
			buf2=((buf4&0x8000)==0)?29:30;//取得需处理的月的天数
	    }
	}
	else								//如果没有闰月
	{	
		buf2=((buf4&0x8000)==0)?29:30;	//取得1月的信息
		while(xdays>=buf2)				//如果xdays大于等于此月田鼠
    	{
			xdays=xdays-buf2;			//xdays-=本月天数
			Cmonth++;					//月加1
			buf4<<=1;					//取下一个月信息
			buf2=((buf4&0x8000)==0)?29:30;//取下一个月的天数
	    }
	}
	Cday=(uchar)xdays+1;				//求得农历日
}

//***********************************************************************
void  ConvertDate()						//公历转农历函数
{
	uchar buf1,buf2;
	uint  buf3,buf4;					//下面取得此年的农历春节信息
	buf1=CyearTab[Year+1][2];			//注意YEAR+1,由于开始从1999年
	buf1&=0x7f;									
	buf2=buf1/32;						//春节对应公历日
	buf1=buf1%32;						//春节对应公历月
	if((Year&0x03)==0)					//如果是闰年,对应闰年表
	{
		buf4=RunDays[Month-1]+Day-1;	//则取得此月以前过了多少天
		buf3=RunDays[buf2-1]+buf1-1;	//春节月以前过了多少天
	}
	else								
	{
		buf4=PingDays[Month-1]+Day-1;	//同上,但是对应平年表
		buf3=PingDays[buf2-1]+buf1-1;
	}
	if(Month<buf2)						
		DayBeforeNewYear(buf3-buf4);	//公历日在春节前,调用对应函数
   	else if(Month==buf2&&Day<buf1)		
		DayBeforeNewYear(buf1-Day);		
	else								//公历日在春节后,调用对应函数
		DayAfterNewYear(buf4-buf3);
}
//***********************************************************************	
void  GetWeek()							//公历日转星期函数
{
	uchar buf;
	if((Year&0x03)==0)
		buf=RunWeekTab[Month-1];		//取闰年星期表
	else
		buf=PingWeekTab[Month-1];		//取平年星期表
	Weekday=(Year+Year/4+buf+Day+2)%7;	//计算星期
}
//********************************END************************************	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -