当前位置: 首页 > wzjs >正文

常德政府网站网页设计工资一般多少

常德政府网站,网页设计工资一般多少,爱查企业在线查询,北京奢侈品商场排名目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、延时函数2、时钟芯片DS32313、液晶显示屏LCD128644、农历数据处理5、独立按键6、定时器0 四、主函数总结 系列文章目录 前言 由于需要比较大的Flash空间(大于20KB)存储农历相关数据&…

目录

  • 系列文章目录
  • 前言
  • 一、效果展示
  • 二、原理分析
  • 三、各模块代码
    • 1、延时函数
    • 2、时钟芯片DS3231
    • 3、液晶显示屏LCD12864
    • 4、农历数据处理
    • 5、独立按键
    • 6、定时器0
  • 四、主函数
  • 总结

系列文章目录


前言

由于需要比较大的Flash空间(大于20KB)存储农历相关数据,STC89C52RC的Flash空间只有8KB,不够用,所以就用了STC12C5A60S2来做,Flash空间有60K,而且STC12C5A60S2是1T单片机,相同晶振频率下,速度是STC89C52RC的12倍。DS3231时钟芯片除了可以从中读取时间,还可以测温度,无需另外再接DS18B20测温度,比较省事。LCD12864的屏幕较大,方便看时间。用了4个独立按键,有按下检测、长按检测、松手检测。

普中给的例程比较粗糙,而且有错误,只能作为参考。我参考了例程,找出了错误并改正,也进行了完善、拓展。除了能显示农历日期、生肖,还能显示节气、干支和更多的节日。

如果发现有错漏或者注释错误,请在评论区告知我,或者B站私信我,谢谢!

效果查看/操作演示:B站搜索“甘腾胜”或“gantengsheng”查看。
源代码下载:B站对应视频的简介有工程文件下载链接。

一、效果展示

1、总览
在这里插入图片描述

2、节气和公历节日显示(如果是节气,则节气和星期轮流显示;如果当天有多个公历节日,则多个公历节日轮流显示)
在这里插入图片描述

3、干支显示(如果不是公历节日,则第四行显示月日时的干支)
在这里插入图片描述

4、如果节日太长,则在正常走时模式(有星号提示)按K2时显示超过八个字的节日,同时也能看到年月日时的干支(当天有少于等于八个字的公历节日时在主界面看不到)
在这里插入图片描述
在这里插入图片描述

5、农历节日显示(如果是农历节日,则温度和农历节日轮流显示)
在这里插入图片描述
在这里插入图片描述
6、X月的第X个星期X的节日显示
在这里插入图片描述

二、原理分析

1、LCD12864的显示
LCD12864液晶显示屏内置汉字字模,不用再自行用其他软件取模了,方便显示。值得注意的是,由于Keil的固有Bug,部分汉字需要处理一下才能正常显示。

【Keil的Bug】
由于Keil本身的固有Bug,Keil编译器会忽略0xFD值的字符串,导致汉字内码以0xFD结尾的汉字和紧跟着后面的汉字全部显示为乱码。
解决办法:在相关汉字后面加“ \xfd ”
例如:LCD_ShowString(0,0,“正\xfd月十三\xfd”);

下面是从GB2312中挑出来的相关汉字:
褒 饼 昌 除 待 谍 洱 俘 庚 过 糊 积 箭 烬 君 魁 例 笼 慢 谬
凝 琵 讫 驱 三 升 数 她 听 妄 锡 淆 旋 妖 引 育 札 正 铸 佚
冽 邶 埤 荦 蔟 摭 啐 帻 猃 恺 泯 潺 妪 纨 琮 椠 辇 挲 臊 忑
睚 铨 稞 瘕 颀 螨 簖 酏 觚 鳊 鼾

由于汉字字模采用GB2312编码,所以keil设置(点击扳手图标进入设置)中文件编码不能选UTF-8,否则汉字显示会出现乱码,编码选择GB2312就能正常显示了,同时也需要用文件编辑器(例如:Notepad4),将文件main.c的编码改为“GBK,GB2312”,否则液晶屏不能正常显示汉字。

2、农历日期的存储与计算

农历(Chinese Calendar),是中国现行的传统历法,属于阴阳合历,也就是阴历和阳历的合历,是根据月相的变化周期,每一次月相朔望变化为一个月,参考太阳回归年为一年的长度,并加入二十四节气与设置闰月以使平均历年与回归年相适应。农历融合阴历与阳历形成为一种阴阳合历历法,因使用“夏正”,古时称为夏历。

农历是以月亮圆缺变化的周期为依据,一个朔望月为一个月,约29.53天,全年一般是354天或355天,比公历年(也称回归年、太阳年)的365天或366天少了11天。 现行农历规定朔日为农历月的第一个农历日。农历作为特殊的阴阳历,既能反映季节、农时和物候特征,又能体现月相变化和潮汐大小等自然现象。

农历日期的计算跟天体的运动周期有关,如果通过天体周期等来计算的话,需要很大的计算量,也会涉及浮点的运算,并且可能容易出错。所以用字节来存储2000~2099年每年的农历数据,然后根据公历的年月日来计算是农历日期。

农历月分大小月,大月30天,小月29天,无闰月一年共12个农历月,有闰月一年共13个农历月。用字节存储大小月的数据需要13Bit(13位),1表示大月,0表示小月,还要存储春节对应的公历月日,这里需要7Bit,最后还要存储是否有闰月以及有闰月时闰哪个月,这里需要4Bit,加起来总共24Bit,刚好三个字节。三个字节就可以存储一年的农历日期的相关数据。

以2000年和2001年的数据为例(数据来源于普中提供的例程)
0x0C,0x96,0x45, //2000
0x4D,0x4A,0xB8, //2001

【2001年】
将三个字节展开为二进制格式:
0100 1101 0100 1010 1011 1000
二进制格式共24位,从左到右分别为第1位到第24位
第1位到第4位(0100):表示2001年闰四月
第5位到第17位(1101 0100 1010 1):表示13个农历月的大小月情况,1为大月30天,0为小月29天
第18位到第19位(01):表示春节在公历2001年的1月
第20位到第25位(1 1000):表示春节在公历2001年的(1月)24日

【2000年】
将三个字节展开为二进制格式
0000 1100 1001 0110 0100 0101
展开为二进制格式共24位,从左到右分别为第1位到第24位
第1位到第4位(0000):表示2000年无闰月
第5位到第17位(1100 1001 0110 0):表示12个农历月的大小月情况,1为大月30天,0为小月29天
(因2000年无闰月,则使用第5位到第17位的前12位(1100 1001 0110),第13位的“0”无意义)
第18位到第19位(10):表示春节在公历2000年的2月
第20位到第25位(0 0101):表示春节在公历2000年的(2月)5日

具体怎么计算农历日期请详看代码。

3、节气数据的存储

节气也跟天体的运动有关,直接利用天体周期计算很复杂,所以也是通过查表的方法计算得出。同样存储了2000~2099年的节气数据。

数据来源:https://blog.csdn.net/qq_46041930/article/details/108653836
数据为二十四节气对应年的日期表,每年的二十四个节气需要用12个字节存储。
依次从1月开始,每月用一个字节存放,用15减去高四位数据即得到第一个节气对应日期
低四位数据加上15即得到第二个节气对应日期。

以2000年和2001年的数据为例:
0x96,0xB4,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86, //2000
0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87, //2001

以2000年第1个月的数据为例:0x96:
15-9=6:1月6日为小寒
15+6=21:1月21日为大寒
以2001年第1个月的数据为例:0xA5:
15-10=5:1月5日为小寒
15+5=20: 1月20日为大寒

4、农历节日

如果能根据公历日期计算出对应的农历日期,就很方便确定农历节日了,因为农历节日对应着固定的农历日期,例如,农历二月初二是龙抬头,正月初一是春节,春节的前一天是除夕。

5、公历节日

公历节日对应固定的日期则好处理,如果是X月的第X个星期X是XX节这种,则需要计算一下,需要先计算该月的第一天或最后一天是星期几,再通过日数计算得出。举个例子,每年五月的第二个星期日是母亲节,则五月的日数加5月1日的星期值等于15,则该天为母亲节,例如,5月1日为星期5,日数为10时,星期数和日数相加等于15,说明5月10日为母亲节。

其他情况(例如,一月最后一个星期日,三月第二个星期二)也是用类似的方法,具体详看代码。

6、星期的计算

本程序代码无需设置星期(只能设置年月日时分秒),星期通过公历年月日,以2000年的各个月头天的星期值作为参考进行计算得出。设置年月日时,自动计算星期值并写入时钟芯片。

7、温度的测量

用DS3231时钟芯片的原因,除了走时比DS1302准确之外,时钟芯片本身还能测温,直接读取时钟芯片相关的寄存器的数据就行了。

8、天干地支

天干地支是中国古代传统历法纪年的一部分,由十天干和十二地支组成。天干包括:甲、乙、丙、丁、戊、己、庚、辛、壬、癸。地支包括:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。天干的读音分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。地支的读音分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、未(wèi)、申(shēn)、酉(yǒu)、戌(xū)、亥(hài)。

天干地支源自中国远古时代对天象的观测,用于纪年、纪月、纪日和纪时。它们不仅在历法中应用广泛,还在《易经》和相关术数中有重要应用。天干地支的组合形成了六十个基本单位,称为“干支纪法”,古人以此作为年、月、日、时的序号。
在这里插入图片描述

(1)干支纪年

干支纪年一个周期的第一年为“甲子”,第二年为“乙丑”,依此类推,60年一个周期;一个周期完了重复使用,周而复始。(60是10、12的最小公倍数,所以每60年为一周期)。如1644年大概为甲申年,60年后的1704年同为甲申年,300年后的1944年仍为甲申年。

在这里插入图片描述
(2)干支纪月

干支纪月是由十二辰纪月发展而来。在古代早以十二辰纪月,即为月建。在以钟表盘面理解日月五星的运行时,我们就可很清楚的看到月建是日月相会时的辰位。干支纪月的推算较为容易,每年的各月地支已经固定,只要推算月的天干配固定每月地支就行。

有歌诀为证(寅月为正月,寅为虎,又称“五虎遁元”):
甲己之年丙作首,——逢年干是甲或己的年份,正月的月干从丙上起。
乙庚之岁戊为头,——逢年干是乙或庚的年份,正月的月干从戊上起。
丙辛必定寻庚起,——逢年干是丙或辛的年份,正月的月干从庚上起。
丁壬壬位顺行流,——逢年干是丁或壬的年份,正月的月干从壬上起。
更有戊癸何方觅,甲寅之上好追求。——逢年干是戊或癸的年份,正月的月干从甲上起。

在这里插入图片描述

干支纪月法采用每个地支对应二十四节气自某节气(非中气)至下一个节气,以交节时间决定起始的一个月期间,不是农历某月初一至月底。

在这里插入图片描述

(3)干支纪日

干支纪日,60日大致合2个月一个周期;一个周期完了重复使用,周而复始,循环下去。

本代码以2000年1月1日的“戊午日”作为参考进行计算。

(4)干支纪时

60时辰合5日一个周期;一个周期完了重复使用,周而复始,循环下去。必须注意的是子时分为0时到1时的早子时(晨子)和23时到24时的晚子时(夜子),所以遇到甲或己之日,0时到1时是甲子时,但23时到24时是丙子时。晚子时又称子夜或夜子。

在这里插入图片描述

9、生肖

干支纪元法,用“十天干”和“十二地支”两两搭配,来表示年、月、日的序号,六十年一循环周期。为了便于民间百姓记忆,古人还专门设计了12种动物(“十二生肖”)与“十二地支”互相搭配。十二生肖对应十二地支,每一生肖表示一岁。

十二生肖是十二地支的形象化代表,即子(鼠)、丑(牛)、寅(虎)、卯(兔)、辰(龙)、巳(蛇)、午(马)、未(羊)、申(猴)、酉(鸡)、戌(狗)、亥(猪)。

10、按键的检测

如果通过延时来消抖的话,会阻塞主程序的运行,所以用了定时器扫描检测的方法,每隔20ms检测一次按键按下状态。定时器扫描按键呢,也可以检测短按、长按、松手的情况,方便实现不同的操作。

例如,本代码在设置时间时,短按数值变化1,长按数值连续变化,松手瞬间将设置好之后的时间数据写入时钟芯片。这样就比较科学,如果设置时间时数据每改变一次就写入时钟芯片一次的话,会导致长按的时候数值变化较慢,不方便调节。

三、各模块代码

1、延时函数

h文件

#ifndef	__DELAY_H__
#define	__DELAY_H__void Delay(unsigned int xms);#endif

c文件

/*** @brief	延时函数,延时xms毫秒* @param	xms 延时的时间,范围:0~65535* @retval	无*/
void Delay(unsigned int xms)	//1T@12.0000MHz
{unsigned char i,j;while(xms){i=12;j=680;do{while(--j);} while(--i);xms--;}
}

2、时钟芯片DS3231

h文件

#ifndef	__DS3231_H__
#define	__DS3231_H__extern char Time[];
extern char Alarm[];
void DS3231_I2C_Start(void);
void DS3231_I2C_Stop(void);
void DS3231_I2C_SendByte(unsigned char Byte);
unsigned char DS3231_I2C_ReceiveByte(unsigned char AckBit);
void DS3231_WriteByte(unsigned char WordAddress,Data);
unsigned char DS3231_ReadByte(unsigned char WordAddress);
void DS3231_SetTime(void);
void DS3231_ReadTime(void);
void DS3231_SetAlarm(void);
void DS3231_ReadAlarm(void);
void DS3231_ConvertT(void);
unsigned char DS3231_CheckBusy(void);
float DS3231_ReadT(void);#endif

c文件

#include <STC12C5A60S2.H>#define DS3231_ADDRESS 0xD0	//DS3231的I2C地址//DS3231引脚定义
sbit DS3231_SDA=P2^3;
sbit DS3231_SCL=P2^4;//DS3231的时间地址:年,月,日,时,分,秒,星期
unsigned char code TimeAddress[7]={0x06,0x05,0x04,0x02,0x01,0x00,0x03,};//DS3231的闹钟地址:A1日期/星期,A1时,A1分,A1秒,A2日期/星期,A2时,A2分
unsigned char code AlarmAddress[7]={0x0A,0x09,0x08,0x07,0x0D,0x0C,0x0B,};//时间数组:年,月,日,时,分,秒,星期
char Time[]={25,2,28,11,23,53,5};	//时间设置的初始值//闹钟数组:A1日期/星期,A1时,A1分,A1秒,A2日期/星期,A2时,A2分
char Alarm[]={1,6,7,0,1,6,7};	//闹钟设置的初始值/*** @brief  I2C开始* @param  无* @retval 无*/
void DS3231_I2C_Start(void)
{DS3231_SDA=1;DS3231_SCL=1;DS3231_SDA=0;DS3231_SCL=0;
}/*** @brief  I2C停止* @param  无* @retval 无*/
void DS3231_I2C_Stop(void)
{DS3231_SDA=0;DS3231_SCL=1;DS3231_SDA=1;
}/*** @brief  I2C发送一个字节* @param  Byte 要发送的字节* @retval 无*/
void DS3231_I2C_SendByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){DS3231_SDA=Byte&(0x80>>i);DS3231_SCL=1;DS3231_SCL=0;}DS3231_SCL=1;	//额外一个时钟,不处理应答信号DS3231_SCL=0;
}/*** @brief  I2C接收一个字节* @param  AckBit 要发送的应答位,0为应答,1为非应答* @retval 接收到的一个字节数据*/
unsigned char DS3231_I2C_ReceiveByte(unsigned char AckBit)
{unsigned char i,Byte=0x00;DS3231_SDA=1;for(i=0;i<8;i++){DS3231_SCL=1;if(DS3231_SDA){Byte|=(0x80>>i);}DS3231_SCL=0;}DS3231_SDA=AckBit;	//发送应答位DS3231_SCL=1;DS3231_SCL=0;return Byte;
}/*** @brief  DS3231写入一个字节* @param  WordAddress 要写入字节的地址* @param  Data 要写入的数据* @retval 无*/
void DS3231_WriteByte(unsigned char WordAddress,Data)
{DS3231_I2C_Start();DS3231_I2C_SendByte(DS3231_ADDRESS);DS3231_I2C_SendByte(WordAddress);DS3231_I2C_SendByte(Data);DS3231_I2C_Stop();
}/*** @brief  DS3231读取一个字节* @param  WordAddress 要读出字节的地址* @retval 读出的数据*/
unsigned char DS3231_ReadByte(unsigned char WordAddress)
{unsigned char Data;DS3231_I2C_Start();DS3231_I2C_SendByte(DS3231_ADDRESS);DS3231_I2C_SendByte(WordAddress);DS3231_I2C_Start();DS3231_I2C_SendByte(DS3231_ADDRESS|0x01);Data=DS3231_I2C_ReceiveByte(1);DS3231_I2C_Stop();return Data;
}/*** @brief  DS3231设置时间,调用之后,Time数组的数字会被设置到DS3231中* @param  无* @retval 无*/
void DS3231_SetTime(void)
{unsigned char i;for(i=0;i<7;i++)	//依次写入:年,月,日,时,分,秒,星期{DS3231_WriteByte(TimeAddress[i],Time[i]/10*16+Time[i]%10);	//十进制转换为BCD码}
}/*** @brief  DS3231读取时间,调用之后,DS3231中的数据会被读取到Time数组中* @param  无* @retval 无*/
void DS3231_ReadTime(void)
{unsigned char Temp,i;for(i=0;i<7;i++)	//依次读取:年,月,日,时,分,秒,星期{Temp=DS3231_ReadByte(TimeAddress[i]);Time[i]=Temp/16*10+Temp%16;	//BCD码转十进制后读取}
}/*** @brief  DS3231设置闹钟数据* @param  无* @retval 无*/
void DS3231_SetAlarm(void)
{unsigned char i;for(i=0;i<7;i++)	//依次写入:A1日期/星期,A1时,A1分,A1秒,A2日期/星期,A2时,A2分{DS3231_WriteByte(AlarmAddress[i],Time[i]/10*16+Time[i]%10);	//十进制转换为BCD码}
}/*** @brief  DS3231读取闹钟数据* @param  无* @retval 无*/
void DS3231_ReadAlarm(void)
{unsigned char Temp,i;for(i=0;i<7;i++)	//依次读取:A1日期/星期,A1时,A1分,A1秒,A2日期/星期,A2时,A2分{Temp=DS3231_ReadByte(AlarmAddress[i]);Alarm[i]=Temp/16*10+Temp%16;	//BCD码转十进制后读取}
}/*** @brief  DS3231转换温度* @param  无* @retval 无*/
void DS3231_ConvertT(void)
{unsigned char Data;Data=DS3231_ReadByte(0x0E);DS3231_WriteByte(0x0E,Data|0x20);
}/*** @brief  DS3231检查是否已转换完温度* @param  无* @retval 无*/
unsigned char DS3231_CheckBusy(void)
{unsigned char BusyState;BusyState=DS3231_ReadByte(0x0F);BusyState&=0x04;return BusyState;
}/*** @brief  DS3231读取温度* @param  无* @retval 无*/
float DS3231_ReadT(void)
{unsigned char TM,TL;int Temp;float T;TM=DS3231_ReadByte(0x11);TL=DS3231_ReadByte(0x12);Temp=(TM<<8)|TL;Temp>>=6;T=Temp/4.0;return T;
}

3、液晶显示屏LCD12864

h文件

#ifndef __LCD12864_H__
#define __LCD12864_H__void LCD_WriteCommand(unsigned char Command);
void LCD_WriteData(unsigned char Data);
void LCD_SetCursor(unsigned char Line,unsigned char Column);
void LCD_Init();
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowChinese(unsigned char Line,unsigned char Column,unsigned char Code1,unsigned char Code2);
void LCD_ShowImage(unsigned char *Image);
void LCD_Clear(void);
void LCD_GraphicMode(void);
void LCD_NormalMode(void);#endif

c文件

#include <STC12C5A60S2.H>//引脚配置:
sbit LCD_RS=P2^5;
sbit LCD_RW=P2^6;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0//函数定义:
/*** @brief  LCD12864私有延时函数,延时25us* @param  无* @retval 无*/
void LCD_Delay25us(void)	//1T@12.0000MHz
{unsigned char i;i=72;while(--i);
}/*** @brief  LCD12864私有延时函数,延时2ms* @param  无* @retval 无*/
void LCD_Delay2ms(void)	//1T@12.0000MHz
{unsigned char i,j;i=24;j=84;do{while(--j);}while(--i);
}/*** @brief  LCD12864写指令* @param  Command 要写入的指令* @retval 无*/
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DataPort=Command;LCD_EN=1;LCD_Delay25us();	//不检查忙碌状态,但要进行适当的延时LCD_EN=0;	//下降沿锁存数据LCD_Delay25us();
}/*** @brief  LCD12864写数据* @param  Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_EN=1;LCD_Delay25us();LCD_EN=0;LCD_Delay25us();
}/*** @brief  LCD12864使用普通指令时设置光标位置* @param  Line 行位置,范围:1~4* @param  Column 列位置,范围:1~8* @retval 无*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{Line--;Column--;switch(Line){case 0: Column|=0x80;break;case 1: Column|=0x90;break;case 2: Column|=0x88;break;case 3: Column|=0x98;break;}LCD_WriteCommand(Column);
}/*** @brief  LCD12864初始化函数* @param  无* @retval 无*/
void LCD_Init()
{LCD_WriteCommand(0x30);	//普通模式,基本指令操作LCD_WriteCommand(0x0C);	//显示开,光标关,闪烁关LCD_WriteCommand(0x06);	//数据读写操作后,光标自动加一,画面不动LCD_WriteCommand(0x01);	//光标复位,清屏LCD_Delay2ms();	//LCD操作指令0x01需要的时间较长,要延时久点
}/*** @brief  在LCD12864指定位置上显示一个字符* @param  Line 行位置,范围:1~4* @param  Column 列位置,范围:1~8* @param  Char 要显示的字符* @retval 无*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);
}/*** @brief  在LCD12864指定位置开始显示所给字符串* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~8* @param  String 要显示的字符串* @retval 无*/
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{LCD_SetCursor(Line,Column);while(*String!='\0'){LCD_WriteData(*String);String++;		}
}/*** @brief  返回值=X的Y次方*/
int LCD_Pow(int X,int Y)
{unsigned char i;int Result=1;for(i=0;i<Y;i++){Result*=X;}return Result;
}/*** @brief  在LCD12864指定位置开始显示所给数字* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~8* @param  Number 要显示的数字,范围:0~65535* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief  在LCD12864指定位置开始以有符号十进制显示所给数字* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~8* @param  Number 要显示的数字,范围:-32768~32767* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{unsigned char i;unsigned int Number1;LCD_SetCursor(Line,Column);if(Number>=0){LCD_WriteData('+');Number1=Number;}else{LCD_WriteData('-');Number1=-Number;}for(i=Length;i>0;i--){LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief  在LCD12864指定位置开始以十六进制显示所给数字* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~8* @param  Number 要显示的数字,范围:0~0xFFFF* @param  Length 要显示数字的长度,范围:1~4* @retval 无*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i,SingleNumber;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;if(SingleNumber<10){LCD_WriteData(SingleNumber+'0');}else{LCD_WriteData(SingleNumber-10+'A');}}
}/*** @brief  在LCD12864指定位置开始以二进制显示所给数字* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~8* @param  Number 要显示的数字,范围:0~1111 1111 1111 1111* @param  Length 要显示数字的长度,范围:1~16* @retval 无*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');}
}/*** @brief  在LCD12864指定位置显示指定编码的汉字* @param  Line 起始行位置,范围:1~4* @param  Column 起始列位置,范围:1~8* @param  Code1 要显示汉字的第一个字节,范围:0xA1~0xF7* @param  Code2 要显示汉字的第一个字节,范围:0xA0~0xFF* @retval 无*/
void LCD_ShowChinese(unsigned char Line,unsigned char Column,unsigned char Code1,unsigned char Code2)
{LCD_SetCursor(Line,Column);LCD_WriteData(Code1);LCD_WriteData(Code2);
}/*** @brief  将自定义的图片数据写入GDRAM,显示一幅图片,向右为X轴正方向,向下为Y轴正方向* @brief  图片大小要求:宽128像素,高64像素* @brief  取模设置:逐行式取模,高位在左* @param  Image 要显示的图片的数组首地址* @retval 无*/
void LCD_ShowImage(unsigned char *Image)
{unsigned char i,j;LCD_WriteCommand(0x34);	//绘图模式,显示关for(i=0;i<64;i++){LCD_WriteCommand(0x80+i%32);	//先写入Y的地址,上半屏和下半屏的Y地址是一样的,都是从0x80开始if(i<32){LCD_WriteCommand(0x80);}	//再写入上半屏X的首地址0x80,写入2次数据后地址计数器会自动加一,连续写入16次数据即可else{LCD_WriteCommand(0x88);}	//下半屏X的首地址0x88(16*8=128,对应LCD宽度的像素)for(j=0;j<16;j++){LCD_WriteData(*Image);Image++;	//地址自增}}LCD_WriteCommand(0x36);	//绘图模式,显示开
}/*** @brief  清空GDRAM(绘图模式下没有清空GDRAM的指令,需要自己写函数清空)* @param  无* @retval 无*/
void LCD_Clear(void)
{unsigned char i,j;LCD_WriteCommand(0x34);	//绘图模式,显示关for(i=0;i<32;i++){LCD_WriteCommand(0x80+i);	//先写Y地址LCD_WriteCommand(0x80);	//再写X地址,写入2次数据后地址计数器自动加一,i为0时,先写第1行,再写第32行for(j=0;j<32;j++)		//整个屏幕相当于是2个128*32的屏幕上下叠起来{LCD_WriteData(0x00);	//将0x00写入GDRAM}}LCD_WriteCommand(0x36);	//绘图模式,显示开
}/*** @brief  设置到绘图模式* @param  无* @retval 无*/
void LCD_GraphicMode(void)
{LCD_WriteCommand(0x01);	//光标复位,清屏(如果不清屏,由普通模式转成绘图模式时,普通模式下的数据还会显示)LCD_Delay2ms();LCD_WriteCommand(0x34);	//绘图模式,显示关,扩充指令LCD_Clear();	//清空GDRAM的数据
}/*** @brief  设置到普通模式* @param  无* @retval 无*/
void LCD_NormalMode(void)
{LCD_WriteCommand(0x30);	//普通模式,基本指令LCD_WriteCommand(0x01);	//光标复位,清屏(如果不清屏,由绘图模式转成普通模式时,绘图模式下的数据还会显示)LCD_Delay2ms();
}

4、农历数据处理

h文件

#ifndef __LUNARTIME__
#define __LUNARTIME__extern unsigned char LunarYear,LunarMonth,LunarDay; //农历年月日全局变量
extern unsigned char LunarLeapMonth;  //农历闰月全局变量,无时为0
extern xdata char code *TianGan[];
extern xdata char code *DiZhi[];
bit IsLeapYear(unsigned char Year);
unsigned char GetWeek(unsigned char Year,unsigned char Month,unsigned char Day);
unsigned char GetLunarDays(unsigned char LunarYear,unsigned char LunarMonth);
unsigned char GetLunarLeapMonth(unsigned char LunarYear);
void ConvertSolarToLunar(unsigned char Year,unsigned char Month,unsigned char Day);
bit IsLunarNewYear(unsigned char Year,unsigned char Month,unsigned char Day);
unsigned char GetSolarTerms(unsigned char Year,unsigned char Month,unsigned char Day);
char GetSolarTermsMonth(unsigned char Year,unsigned char Month,unsigned char Day);
unsigned char GetMonthGanZhi(char SolarTermsMonth);
unsigned int CalculateDays(unsigned char Year,unsigned char Month,unsigned char Day);#endif

c文件

#include <STC12C5A60S2.H>extern char Time[];	//时间缓存(声明这个数组是在外部定义的)
unsigned char xdata MonthDays[]={31,28,31,30,31,30,31,31,30,31,30,31};	//平年每个月份的天数表
unsigned int code AccumulatedDays1[]={0,31,59,90,120,151,181,212,243,273,304,334};	//平年月份累计天数表
unsigned int code AccumulatedDays2[]={0,31,60,91,121,152,182,213,244,274,305,335};	//闰年月份累计天数表
unsigned char LunarYear,LunarMonth,LunarDay; //农历年月日全局变量
unsigned char LunarLeapMonth;  //农历闰月全局变量,无时为0
//2000年各月第一天星期表(用来自动计算所设置日期的星期值)
unsigned char code Week2000[12]={6,2,3,6,1,4,6,2,5,7,3,5};//用一维的字符指针数组来保存字符串,实际上这个一维数组并不存放真正的字符串,而只是存放字符串的地址
//指针指向字符串中的第一个字符,例如*TianGan[0]指向"甲"的第一个字符
xdata char code *TianGan[]={"甲","乙","丙","丁","戊","己","庚\xfd","辛","壬","癸"};	//天干
xdata char code *DiZhi[]={"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};	//地支//2000~2099年农历表
//数据来源:普中开发板店家提供的例程
unsigned char code LunarCalendar[300]={
/*数据含义每年三个字节,
第一个字节:B7~B4表示闰月月份,值为0表示无闰月,B3~B0对应农历第1~4月的大小月情况,
第二个字节:B7-B0对应农历第5~12月的大小月情况,
第三个字节:B7表示农历第13个月的大小月情况(如果无闰月,则该位无意义),B6~B5表示春节的公历月份,B4~B0表示春节的公历日期
月份对应的位为1则表示此农历月为大月(30天),为0则表示小月(29天)以2000年和2001年的数据为例【2001年】
将三个字节展开为二进制格式:
0100 1101 0100 1010 1011 1000
二进制格式共24位,从左到右分别为第1位到第24位
第1位到第4位(0100):表示2001年闰四月
第5位到第17位(1101 0100 1010 1):表示13个农历月的大小月情况,1为大月30天,0为小月29天
第18位到第19位(01):表示春节在公历2001年的1月
第20位到第25位(1 1000):表示春节在公历2001年的(1月)24日【2000年】
将三个字节展开为二进制格式
0000 1100 1001 0110 0100 0101
展开为二进制格式共24位,从左到右分别为第1位到第24位
第1位到第4位(0000):表示2000年无闰月
第5位到第17位(1100 1001 0110 0):表示12个农历月的大小月情况,1为大月30天,0为小月29天
(因2000年无闰月,则使用第5位到第17位的前12位(1100 1001 0110),第13位的“0”无意义)
第18位到第19位(10):表示春节在公历2000年的2月
第20位到第25位(0 0101):表示春节在公历2000年的(2月)5日
*/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 
};//2000~2099年节气表
//数据来源:https://blog.csdn.net/qq_46041930/article/details/108653836
unsigned char code The24SolarTerms[1200]={
/*数据含义数据为二十四节气对应年的日期表
依次从1月开始,每月用一个字节存放,用15减去高四位数据即得到第一个节气对应日期
低四位数据加上15即得到第二个节气对应日期以2000年第1个月的数据为例:0x96:
15-9=6:1月6日为小寒
15+6=21:1月21日为大寒
以2001年第1个月的数据为例:0xA5:
15-10=5:1月5日为小寒
15+5=20: 1月20日为大寒
*/
0x96,0xB4,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,	//2000
0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,	//2001
0xA5,0xB4,0x96,0xA5,0x96,0x96,0x88,0x88,0x78,0x78,0x87,0x87,	//2002
0x95,0xB4,0x96,0xA5,0x96,0x97,0x88,0x78,0x78,0x69,0x78,0x87,	//2003
0x96,0xB4,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,	//2004
0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,	//2005
0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,	//2006
0x95,0xB4,0x96,0xA5,0x96,0x97,0x88,0x78,0x78,0x69,0x78,0x87,	//2007
0x96,0xB4,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,	//2008
0xA5,0xB3,0xA5,0xB5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,	//2009
0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,	//2010
0x95,0xB4,0x96,0xA5,0x96,0x97,0x88,0x78,0x78,0x79,0x78,0x87,	//2011
0x96,0xB4,0xA5,0xB5,0xA5,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,	//2012
0xA5,0xB3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x87,	//2013
0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,	//2014
0x95,0xB4,0x96,0xA5,0x96,0x97,0x88,0x78,0x78,0x79,0x77,0x87,	//2015
0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,	//2016
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x87,	//2017
0xA5,0xB4,0xA6,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,	//2018
0xA5,0xB4,0x96,0xA5,0x96,0x96,0x88,0x78,0x78,0x79,0x77,0x87,	//2019
0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x86,	//2020
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,	//2021
0xA5,0xB4,0xA5,0xB5,0xA6,0x96,0x88,0x88,0x88,0x78,0x87,0x87,	//2022
0xA5,0xB4,0x96,0xA5,0x96,0x96,0x88,0x78,0x78,0x79,0x77,0x87,	//2023
0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,	//2024
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,	//2025
0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,	//2026
0xA5,0xB4,0x96,0xA5,0x96,0x96,0x88,0x78,0x78,0x78,0x87,0x87,	//2027
0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,	//2028
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,	//2029
0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,	//2030
0xA5,0xB4,0x96,0xA5,0x96,0x96,0x88,0x78,0x78,0x78,0x87,0x87,	//2031
0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,	//2032
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,	//2033
0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,	//2034
0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,	//2035
0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,	//2036
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,	//2037
0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,	//2038
0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,	//2039
0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,	//2040
0xA5,0xC3,0xA5,0xB5,0xA5,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,	//2041
0xA5,0xB3,0xA5,0xB5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,	//2042
0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,	//2043
0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x88,0x87,0x96,	//2044
0xA5,0xC3,0xA5,0xB4,0xA5,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,	//2045
0xA5,0xB3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x87,	//2046
0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,	//2047
0x95,0xB4,0xA5,0xB4,0xA5,0xA5,0x97,0x87,0x87,0x88,0x86,0x96,	//2048
0xA4,0xC3,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x86,	//2049
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x87,	//2050
0xA5,0xB4,0xA5,0xA5,0xA6,0x96,0x88,0x88,0x88,0x78,0x87,0x87,	//2051
0xA5,0xB4,0xA5,0xB4,0xA5,0xA5,0x97,0x87,0x97,0x88,0x86,0x96,	//2052
0xA4,0xC3,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x86,	//2053
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x87,	//2054
0xA5,0xB4,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,	//2055
0xA5,0xB4,0xA5,0xB4,0xA5,0xA5,0x97,0x87,0x87,0x88,0x86,0x96,	//2056
0xA4,0xC3,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,	//2057
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,	//2058
0xA5,0xB4,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,	//2059
0xA5,0xB4,0xA5,0xB4,0xA5,0xA5,0x97,0x87,0x87,0x87,0x96,0x96,	//2060
0xA4,0xC3,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,	//2061
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,	//2062
0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,	//2063
0xA5,0xB4,0xA5,0xB4,0xA5,0xA5,0x97,0x87,0x87,0x87,0x96,0x96,	//2064
0xA4,0xC3,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,	//2065
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,	//2066
0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,	//2067
0xA5,0xB4,0xA5,0xB4,0xB5,0xA5,0x97,0x97,0x87,0x87,0x96,0x96,	//2068
0xA4,0xC3,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,	//2069
0xA5,0xC3,0xA5,0xB5,0xA5,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,	//2070
0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,	//2071
0xA5,0xB4,0xA5,0xB4,0xB5,0xA5,0x97,0x97,0x87,0x87,0x96,0x96,	//2072
0xA4,0xC3,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x88,0x87,0x96,	//2073
0xA5,0xC3,0xA5,0xB5,0xA5,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,	//2074
0xA5,0xB3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x87,	//2075
0xA5,0xB4,0xA5,0xB4,0xB5,0xA5,0x97,0x97,0x87,0x87,0x96,0x96,	//2076
0xA4,0xC3,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x88,0x87,0x96,	//2077
0xA5,0xC3,0xA5,0xB4,0xA5,0xA6,0x97,0x88,0x87,0x78,0x87,0x86,	//2078
0xA5,0xB3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x87,	//2079
0xA5,0xB4,0xA5,0xB4,0xB5,0xA5,0x97,0x97,0x87,0x87,0x96,0x96,	//2080
0xA4,0xC3,0xA5,0xB4,0xA5,0xA5,0x97,0x87,0x87,0x88,0x86,0x96,	//2081
0xA5,0xC3,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x86,	//2082
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x87,	//2083
0xA5,0xB4,0xB4,0xB4,0xB5,0xA5,0x97,0x97,0x97,0x87,0x96,0x96,	//2084
0xB4,0xC3,0xA5,0xB4,0xA5,0xA5,0x97,0x87,0x87,0x88,0x86,0x96,	//2085
0xA4,0xC3,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x86,	//2086
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x87,	//2087
0xA5,0xB4,0xB4,0xB4,0xB5,0xB5,0x97,0x97,0x97,0x87,0x96,0x96,	//2088
0xB4,0xC3,0xA5,0xB4,0xA5,0xA5,0x97,0x87,0x87,0x88,0x86,0x96,	//2089
0xA4,0xC3,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,	//2090
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,	//2091
0xA5,0xB4,0xB4,0xB4,0xB5,0xB5,0x97,0x97,0x97,0x87,0x96,0x96,	//2092
0xB4,0xC3,0xA5,0xB4,0xA5,0xA5,0x97,0x87,0x87,0x87,0x96,0x96,	//2093
0xA4,0xC3,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,	//2094
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,	//2095
0xA5,0xB3,0xB4,0xB4,0xB5,0xB5,0x97,0x97,0x97,0x87,0x96,0x96,	//2096
0xB4,0xC3,0xA5,0xB4,0xA5,0xA5,0x97,0x97,0x87,0x87,0x96,0x96,	//2097
0xA4,0xC3,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,	//2098
0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,	//2099	
};/*** @brief  判断是否为闰年* @param  Year  公历年(后两位)(2000~2099),范围:0~99* @retval 1表示闰年,0表示平年*/
bit IsLeapYear(unsigned char Year)
{unsigned int Temp;Temp=2000+Year;if( ( (Temp%4)==0) && ((Temp%100)!=0) || ((Temp%400)==0) ){return 1;}else{return 0;}
}/*** @brief  判断某年月日(公历)为星期几* @param  Year  公历年(后两位)(2000~2099),范围:0~99* @param  Month 公历月,范围:1~12* @param  Day   公历日,每个月份的日期范围不一样* @retval 星期的数据,范围:1~7,对应周一到周日*/
unsigned char GetWeek(unsigned char Year,unsigned char Month,unsigned char Day)
{unsigned char Temp;unsigned char m,n;m=Year/4;n=Year%4;if(Month<3 && n!=0){Temp=( Week2000[Month-1] -1 + 5*m+n+1+(Day-1) )%7+1;}else{Temp=( Week2000[Month-1] -1 + 5*m+n+(Day-1) )%7+1;}return Temp;
}/*** @brief  获取农历某月的天数* @param  LunarYear 要查询的年份(农历),范围:0~99* @param  LunarMonth 农历的第几个月,范围:1~13* @retval 无*/
unsigned char GetLunarDays(unsigned char LunarYear,unsigned char LunarMonth)
{unsigned char Temp;switch(LunarMonth){case 1:Temp=LunarCalendar[3*LunarYear]&0x08;break;case 2:Temp=LunarCalendar[3*LunarYear]&0x04;break;case 3:Temp=LunarCalendar[3*LunarYear]&0x02;break;case 4:Temp=LunarCalendar[3*LunarYear]&0x01;break;case 5:Temp=LunarCalendar[3*LunarYear+1]&0x80;break;case 6:Temp=LunarCalendar[3*LunarYear+1]&0x40;break;case 7:Temp=LunarCalendar[3*LunarYear+1]&0x20;break;case 8:Temp=LunarCalendar[3*LunarYear+1]&0x10;break;case 9:Temp=LunarCalendar[3*LunarYear+1]&0x08;break;case 10:Temp=LunarCalendar[3*LunarYear+1]&0x04;break;case 11:Temp=LunarCalendar[3*LunarYear+1]&0x02;break;case 12:Temp=LunarCalendar[3*LunarYear+1]&0x01;break;case 13:Temp=LunarCalendar[3*LunarYear+2]&0x80;break;default:break;}if(Temp==0){return 29;}else{return 30;}
}/*** @brief  获取闰月情况* @param  LunarYear 要查询的年份(农历),范围:0~99* @retval 所闰的月份,范围:0~12,0表示无闰月*/
unsigned char GetLunarLeapMonth(unsigned char LunarYear)
{unsigned char Temp;Temp=(LunarCalendar[3*LunarYear]&0xF0)>>4;return Temp;
}/*** @brief  公历转农历* @param  Year  公历年(后两位)(2000~2099),范围:0~99* @param  Month 公历月,范围:1~12* @param  Day   公历日,每个月份的日期范围不一样* @retval 无*/
void ConvertSolarToLunar(unsigned char Year,unsigned char Month,unsigned char Day)
{unsigned char LunarNewYearMonth,LunarNewYearDay;	//春节公历月日unsigned int Temp1,Temp2;	//缓存变量LunarNewYearMonth=(LunarCalendar[3*Year+2]&0x60)>>5;	//春节所在公历的月数LunarNewYearDay=LunarCalendar[3*Year+2]&0x1F;	//春节所在公历的日数LunarLeapMonth=GetLunarLeapMonth(Year);  //获取当年闰月情况if(LunarNewYearMonth==1){Temp1=LunarNewYearDay-1;}   //计算春节离当年元旦的天数else{Temp1=31+LunarNewYearDay-1;}if(IsLeapYear(Year))	//判断此年是否为闰年{Temp2=AccumulatedDays2[Month-1]+Day-1;}else{Temp2=AccumulatedDays1[Month-1]+Day-1;}if(Temp2>=Temp1)	//如果此月日在春节后{LunarYear=Year;LunarMonth=1;Temp2=Temp2-Temp1;	//计算此月日离春节的天数Temp1=GetLunarDays(Year,LunarMonth);while(Temp2>=Temp1){LunarMonth++;Temp2=Temp2-Temp1;Temp1=GetLunarDays(Year,LunarMonth); //计算当月天数}LunarDay=Temp2+1;}else	//如果此月日在春节前{if(Year==0)	//如果是农历2000年春节前{	//农历表中没有农历1999年冬月和腊月的数据,这里需要特殊处理一下LunarYear=99;	//农历1999年Temp1=Temp1-Temp2;	//计算此月日离春节的天数LunarMonth=12;Temp2=29;	//农历1999年12月有29天if(Temp1>=Temp2){LunarMonth=11;Temp1=Temp1-Temp2;Temp2=30;	//农历1999年11月有30天}}else{LunarYear=Year-1;Temp1=Temp1-Temp2;	//计算此月日离春节的天数LunarLeapMonth=GetLunarLeapMonth(Year-1);if(LunarLeapMonth==0)   //若当年没有闰月{LunarMonth=12;}else{LunarMonth=13;}Temp2=GetLunarDays(Year-1,LunarMonth);while(Temp1>=Temp2){LunarMonth--;Temp1=Temp1-Temp2;Temp2=GetLunarDays(Year-1,LunarMonth);}}LunarDay=Temp2-Temp1+1;}
}/*** @brief  判断给定的公历年月日是否是春节* @param  Year  公历年(后两位)(2000~2099),范围:0~99* @param  Month 公历月,范围:1~12* @param  Day   公历日,每个月份的日期范围不一样* @retval 1:是春节,0:不是春节*/
bit IsLunarNewYear(unsigned char Year,unsigned char Month,unsigned char Day)
{unsigned char LunarNewYearMonth,LunarNewYearDay;	//春节公历月日unsigned char Temp1,Temp2;	//缓存变量LunarNewYearMonth=(LunarCalendar[3*Year+2]&0x60)>>5;	//春节所在公历的月数LunarNewYearDay=LunarCalendar[3*Year+2]&0x1F;	//春节所在公历的日数if(LunarNewYearMonth==1){Temp1=LunarNewYearDay-1;}   //计算春节离当年元旦的天数else{Temp1=31+LunarNewYearDay-1;}if(Month==1){Temp2=Day-1;}   //计算给定的公历年月日离当年元旦的天数else if(Month==2){Temp2=31+Day-1;}else{Temp2=0;}if(Temp1==Temp2){return 1;}else{return 0;}
}/*** @brief  判断是否是二十四节气* @param  Year  公历年(后两位)(2000~2099),范围:0~99* @param  Month 公历月,范围:1~12* @param  Day   公历日,每个月份的日期范围不一样* @retval 是不是二十四节气,不是:返回0,是:返回1~24* @retval  1:立春, 2:雨水, 3:惊蛰, 4:春分, 5:清明, 6:谷雨  7:立夏, 8:小满, 9:芒种,10:夏至,11:小暑,12:大暑* @retval 13:立秋,14:处暑,15:白露,16:秋分,17:寒露,18:霜降 19:立冬,20:小雪,21:大雪,22:冬至,23:小寒,24:大寒*/
unsigned char GetSolarTerms(unsigned char Year,unsigned char Month,unsigned char Day)
{unsigned char Temp=0;if( 15-(The24SolarTerms[12*Year+(Month-1)]/16)==Day ){Temp=(23-1+2*(Month-1))%24+1;}else if( 15+(The24SolarTerms[12*Year+(Month-1)]%16)==Day ){Temp=(24-1+2*(Month-1))%24+1;}return Temp;
}/*** @brief  获取节气月份(用节气分开成12个月)* @param  Year  公历年(后两位)(2000~2099),范围:0~99* @param  Month 公历月,范围:1~12* @param  Day   公历日,每个月份的日期范围不一样* @retval 返回-2~10,-2=子,-1=丑,0=寅,1=卯,2=辰,3=巳,4=午,5=未,6=申,7=酉,8=戌,9=亥,10=子* @retval 寅月:立春~惊蛰,卯月:惊蛰~清明,辰月:清明~立夏,巳月:立夏~芒种,午月:芒种~小暑,未月:小暑~立秋* @retval 申月:立秋~白露,酉月:白露~寒露,戌月:寒露~立冬,亥月:立冬~大雪,子月:大雪~小寒,丑月:小寒~立春*/
char GetSolarTermsMonth(unsigned char Year,unsigned char Month,unsigned char Day)
{char TempMonth;if( Day >= 15-(The24SolarTerms[12*Year+(Month-1)]/16) ){TempMonth=Month-2;}else{TempMonth=Month-3;}return TempMonth;
}/*** @brief  获取节气月份的天干地支* @param  SolarTermsMonth  干支月(用节气分开成12个月),范围:-2~10* @retval 干支信息,高四位表示天干,低四位表示地支* @retval 高四位范围:0~9(甲乙丙丁戊己庚辛壬癸),低四位范围:0~11(子丑寅卯辰巳午未申酉戌亥)*/
unsigned char GetMonthGanZhi(char SolarTermsMonth)
{unsigned char TempGanZhi=0;if(SolarTermsMonth>=0)	//如果是立春或立春之后,则农历年份跟公历年份相同{	//((Time[0]-4+10)%10%5)*2+2为寅月天干信息TempGanZhi=( (((Time[0]-4+10)%10%5)*2+2+SolarTermsMonth)%10 )*16;}else	//如果是立春之前,则农历年份=公历年份-1{TempGanZhi=( (((Time[0]-4+10-1)%10%5)*2+2+SolarTermsMonth+2)%10 )*16;}TempGanZhi+=(SolarTermsMonth+2)%12;return TempGanZhi;
}/*** @brief  计算输入日期到2000年1月1日的天数* @param  Year  公历年(后两位)(2000~2099),范围:0~99* @param  Month 公历月,范围:1~12* @param  Day   公历日,每个月份的日期范围不一样* @retval 输入日期到2000年1月1日的天数*/
unsigned int CalculateDays(unsigned char Year,unsigned char Month,unsigned char Day)
{unsigned char i;unsigned int TempDays=0;for(i=0;i<Year;i++){if(IsLeapYear(i)){TempDays+=366;}else{TempDays+=365;}}MonthDays[1]=28;if(IsLeapYear(Year)){MonthDays[1]=29;}for(i=0;i<Month-1;i++){TempDays+=MonthDays[i];}TempDays+=Day-1;return TempDays;
}

5、独立按键

h文件

#ifndef __KEYSCAN_H__
#define __KEYSCAN_H__unsigned char Key(void);
void Key_Tick(void);#endif

c文件

#include <STC12C5A60S2.H>sbit Key1=P3^4;
sbit Key2=P3^5;
sbit Key3=P3^6;
sbit Key4=P3^7;unsigned char KeyNumber;/*** @brief  获取独立按键键码* @brief  主程序中获取键码值之后键码值清零,在下一次定时器扫描按键之前再次获取键码值,一定会返回0* @param  无* @retval 按下按键的键码,范围:0~12,0表示无按键按下*/
unsigned char Key(void)
{unsigned char KeyTemp=0;KeyTemp=KeyNumber;KeyNumber=0;return KeyTemp;
}/*** @brief  按键驱动函数,在中断中调用* @param  无* @retval 无*/
void Key_Tick(void)
{static unsigned char NowState,LastState;static unsigned int KeyCount;LastState=NowState;	//保存上一次的按键状态NowState=0;	//如果没有按键按下,则NowState为0//获取当前按键状态if(Key1==0){NowState=1;}if(Key2==0){NowState=2;}if(Key3==0){NowState=3;}if(Key4==0){NowState=4;}//如果上个时间点按键未按下,这个时间点按键按下,则是按下瞬间if(LastState==0){switch(NowState){case 1:KeyNumber=1;break;case 2:KeyNumber=2;break;case 3:KeyNumber=3;break;case 4:KeyNumber=4;break;default:break;}}//如果上个时间点按键按下,这个时间点按键按下,则是一直按住按键if(LastState && NowState){KeyCount++;if(KeyCount>=15)	//按下超过300ms才被检测为长按(定时器中断函数中每隔20ms检测一次按键){if(LastState==1 && NowState==1){KeyNumber=5;}if(LastState==2 && NowState==2){KeyNumber=6;}if(LastState==3 && NowState==3){KeyNumber=7;}if(LastState==4 && NowState==4){KeyNumber=8;}}}else{KeyCount=0;}//如果上个时间点按键按下,这个时间点按键未按下,则是松手瞬间if(NowState==0){switch(LastState){case 1:KeyNumber=9;break;case 2:KeyNumber=10;break;case 3:KeyNumber=11;break;case 4:KeyNumber=12;break;default:break;}}}

6、定时器0

h文件

#ifndef __TIMER0_H__
#define __TIMER0_H__void Timer0_Init(void);#endif

c文件

#include <STC12C5A60S2.H>/*** @brief	定时器0初始化* @param  无* @retval 无*/
void Timer0_Init(void)
{AUXR|=0x80;	//定时器时钟1T模式TMOD&=0xF0;	//设置定时器模式TMOD|=0x01;	//设置定时器模式(16位不自动重载)TL0=0xA0;	//设置定时初值,定时5ms,1T@12.0000MHzTH0=0x15;	//设置定时初值,定时5ms,1T@12.0000MHzTF0=0;	//清除TF0标志TR0=1;	//定时器0开始计时ET0=1;	//打开定时器0中断允许EA=1;	//打开总中断PT0=0;	//当PT0=0时,定时器0为低优先级,当PT0=1时,定时器0为高优先级
}/*定时器中断函数模板
void Timer0_Routine() interrupt 1	//定时器0中断函数
{static unsigned int T0Count;	//定义静态变量TL0=0xA0;	//设置定时初值,定时5ms,1T@12.0000MHzTH0=0x15;	//设置定时初值,定时5ms,1T@12.0000MHzT0Count++;if(T0Count>=100){T0Count=0;}
}
*/

四、主函数

main.c

/*说明
by甘腾胜@202500228
【效果展示】可以在B站搜索“甘腾胜”或“gantengsheng”查看
【单片机】STC12C5A60S2
【晶振】1T@12.0000MHz
【外设】LCD12864、DS3231、独立按键
【接线】
(1)独立按键:K1接P34,K2接P35,K3接P36,K4接P37
(2)DS3231:SDA接P23,SCL接P24
(3)LCD12864:RS接P25,RW接P26,EN接P27,数据口接P0
【操作】K1	K2	K3	K4	
一、正常走时模式:
K1:切换为调整时间模式
K2:切换为显示更多界面(超过8个字的节日、年月日时的干支)
二、调整时间模式:
K1:切换为正常走时模式
K2:切换选择要设置的时间(年、月、日、时、分、秒)
K3:减,短按减1,长按连续减小(设置秒的时候,清零)
K4:增,短按加1,长按连续增加
三、显示更多界面:
K2:切换为调整时间模式
【编码设置说明】
keil鐨勮缃紙鎵虫墜鍥炬爣杩涘叆璁剧疆锛夐噷闈㈢紪鐮佽閫堿NSI鎴朑B2312锛堝缓璁級锛屼笉鑳介€塙TF-8锛屽惁鍒欐眽瀛楁樉绀轰細鍑虹幇涔辩爜锛堝涓婁笅鎵€绀猴級
上面第一行注释在UTF-8编码下是能正常显示的,不用理会
keil设置(点击扳手图标进入设置)中文件编码不能选UTF-8,否则汉字显示会出现乱码,编码选择GB2312就能正常显示了
同时也需要用文件编辑器(例如:Notepad4),将文件main.c的编码改为“GBK,GB2312”,否则液晶屏不能正常显示汉字
【Keil的Bug】
由于Keil本身的固有Bug,Keil编译器会忽略0xFD值的字符串,导致汉字内码以0xFD结尾的汉字和紧跟着后面的汉字全部显示为乱码。
解决办法:在相关汉字后面加“ \xfd ”
例如:LCD_ShowString(0,0,"正\xfd月十三\xfd");
下面是从GB2312中挑出来的相关汉字:
褒 饼 昌 除 待 谍 洱 俘 庚 过 糊 积 箭 烬 君 魁 例 笼 慢 谬
凝 琵 讫 驱 三 升 数 她 听 妄 锡 淆 旋 妖 引 育 札 正 铸 佚
冽 邶 埤 荦 蔟 摭 啐 帻 猃 恺 泯 潺 妪 纨 琮 椠 辇 挲 臊 忑
睚 铨 稞 瘕 颀 螨 簖 酏 觚 鳊 鼾
*/#include <STC12C5A60S2.H>
#include "Delay.h"
#include "LCD12864.h"
#include "DS3231.h"
#include "Timer0.h"
#include "LunarTime.h"
#include "KeyScan.h"unsigned char KeyNum;	//存储获得的键码值
unsigned char Mode;	//时间模式,0:正常走时模式,1:设置时间模式,2:显示更多信息界面
bit AllowChangeModeFlag=1;	//允许更改模式的标志,用来控制模式的切换,1:允许更改,0:不允许更改
unsigned char TimeSelect;	//设置时间时的时间选择变量,0:年,1:月,2:日,3:时,4:分,5:秒
unsigned char FlashFlag;	//设置时间时闪烁的标志,1:不显示,0:显示
unsigned int T0Count0,T0Count1,T0Count2,T0Count3,T0Count4;	//定时器计数全局变量
bit ReadTimeFlag;	//读取时间的标志,1:读取,0:不读取
bit ReadTempFlag;	//读取温度的标志,1:读取,0:不读取
float T;	//存储温度数据的变量
char xdata Temp1[]="20  -  -  ";	//年月日
char xdata Temp2[]="  :  :  ";	//时分秒
char xdata Temp3[]="    .   ";	//温度
unsigned char Offset;	//Offset为偏移量,用于正常显示有闰月时闰月后面的月份
unsigned char SolarTerm;	//节气,0:不是节气,1~24:立春、雨水...大寒
bit Holiday;	//公历节日,1:有节日,0:没有节日
unsigned char Festival;	//农历节日,0:没有节日,不为0则数值代表农历节日的顺序号
unsigned char LastDay;	//上一次的日,用来控制LCD12864最后一行的显示
unsigned char LastMonth;	//上一次的月,用来控制LCD12864最后一行的显示
unsigned char LastYear;	//上一次的年,用来控制LCD12864最后一行的显示
bit DateChangedFlag=1;	//日期有改变的标志,初始值为1,1:有改变,0:无改变
unsigned char TooMore;	//同一天有多个节日时,用来控制切换显示,0:表示当日只有一个节日,不为零则数值代表当月的日期
unsigned char TooLong;	//节日太长(超过八个字)时,用来控制在另一个界面显示,0:表示节日少于或等于8个字,不为零则数值代表当月的日期
unsigned char Order1;	//显示内容的序号,0:显示星期,1:显示节气
unsigned char Sum1=1;	//决定是否要显示节气,1:只显示星期,2:轮流显示星期和节气
unsigned char Order2;	//显示内容的序号,0:显示温度,1:显示农历节日
unsigned char Sum2=1;	//决定是否要显示农历节日,1:只显示温度,2:轮流显示温度和农历节日
unsigned char Order3;	//要显示内容的序号
unsigned char Sum3=1;	//第四行显示内容的总数量
unsigned char Overlap;	//节日重叠的标志,0:不重叠(如果有第X个星期X这种节日),不为零则数值表示该月重叠节日的序号
unsigned char NoOverlap;	//节日不重叠的标志,0:重叠(如果有第X个星期X这种节日),不为零则数值表示该月第X个星期X这种节日的序号
unsigned char MonthGanZhi;	//月份干支,高四位范围:0~9(甲乙丙丁戊己庚辛壬癸),低四位范围:0~11(子丑寅卯辰巳午未申酉戌亥)
unsigned int TotalDays;	//离2000年1月1日的总天数/*** @brief  检查时间,防止越界* @param  无* @retval 无*/
void CheckTime(void)	//时间越界判断,防止向时钟芯片写入错误数据
{if(Time[0]<0){Time[0]=99;}	//年越界判断,范围:0~99if(Time[0]>99){Time[0]=0;}if(Time[1]<1){Time[1]=12;}	//月越界判断,,范围:1~12if(Time[1]>12){Time[1]=1;}if(Time[1]==1 || Time[1]==3 || Time[1]==5 || Time[1]==7 || Time[1]==8 || Time[1]==10 || Time[1]==12)	//日越界判断,区分大小月、闰年2月、平年2月{if(Time[2]<1){Time[2]=31;}	//大月if(Time[2]>31){Time[2]=1;}}else if(Time[1]==4 || Time[1]==6 || Time[1]==9 || Time[1]==11){if(Time[2]<1){Time[2]=30;}	//小月if(Time[2]>30){Time[2]=1;}}else if(Time[1]==2){if(Time[0]%4==0)	//年份范围是2000~2099,2000年是闰年{if(Time[2]<1){Time[2]=29;}	//闰年2月if(Time[2]>29){Time[2]=1;}}else{if(Time[2]<1){Time[2]=28;}	//平年2月if(Time[2]>28){Time[2]=1;}}}if(Time[3]<0){Time[3]=23;}	//时越界判断,范围:0~23if(Time[3]>23){Time[3]=0;}if(Time[4]<0){Time[4]=59;}	//分越界判断,范围:0~59if(Time[4]>59){Time[4]=0;}	if(Time[5]>59){Time[5]=0;}	//秒越界判断,范围:0~59if(Time[5]<0){Time[5]=59;}	//秒越界判断,范围:0~59Time[6]=GetWeek(Time[0],Time[1],Time[2]);	//根据年月日计算出星期
}/*** @brief  更新显示时间* @param  无* @retval 无*/
void ShowTime(void)
{//判断年月日是否有改变if(LastDay!=Time[2] || LastMonth!=Time[1] || LastYear!=Time[0]){DateChangedFlag=1;}LastDay=Time[2];LastMonth=Time[1];LastYear=Time[0];//年月日if(Mode==1 && FlashFlag==1 && TimeSelect==0){Temp1[2]=' ';Temp1[3]=' ';}else{Temp1[2]=Time[0]/10+'0';Temp1[3]=Time[0]%10+'0';}if(Mode==1 && FlashFlag==1 && TimeSelect==1){Temp1[5]=' ';Temp1[6]=' ';}else{Temp1[5]=Time[1]/10+'0';Temp1[6]=Time[1]%10+'0';}if(Mode==1 && FlashFlag==1 && TimeSelect==2){Temp1[8]=' ';Temp1[9]=' ';}else{Temp1[8]=Time[2]/10+'0';Temp1[9]=Time[2]%10+'0';}LCD_ShowString(1,1,Temp1);//时分秒if(Mode==1 && FlashFlag==1 && TimeSelect==3){Temp2[0]=' ';Temp2[1]=' ';}else{Temp2[0]=Time[3]/10+'0';Temp2[1]=Time[3]%10+'0';}if(Mode==1 && FlashFlag==1 && TimeSelect==4){Temp2[3]=' ';Temp2[4]=' ';}else{Temp2[3]=Time[4]/10+'0';Temp2[4]=Time[4]%10+'0';}if(Mode==1 && FlashFlag==1 && TimeSelect==5){Temp2[6]=' ';Temp2[7]=' ';}else{Temp2[6]=Time[5]/10+'0';Temp2[7]=Time[5]%10+'0';}LCD_ShowString(2,1,Temp2);if(DateChangedFlag)	//如果日期有改变{DateChangedFlag=0;//如果日或月或年改变,则第四行清空显示LCD_ShowString(4,1,"                ");//判断是否是二十四节气,来决定是否让星期和节气轮流显示SolarTerm=GetSolarTerms(Time[0],Time[1],Time[2]);if(SolarTerm){Sum1=2;Order1=1;T0Count4=0;}	//如果是节气,则立刻显示节气,并且定时器的计数清零else{Sum1=1;Order1=0;T0Count4=0;}//判断是否是农历节日,来决定是否让温度和农历节日轮流显示Festival=0;if(LunarLeapMonth==0 || LunarMonth<=LunarLeapMonth){if(LunarMonth== 1 && LunarDay== 1){Festival= 1;}	//春节if(LunarMonth== 1 && LunarDay==15){Festival= 2;}	//元宵节if(LunarMonth== 2 && LunarDay== 2){Festival= 3;}	//龙抬头if(LunarMonth== 5 && LunarDay== 5){Festival= 4;}	//端午节if(LunarMonth== 7 && LunarDay== 7){Festival= 5;}	//七夕节if(LunarMonth== 7 && LunarDay==15){Festival= 6;}	//中元节if(LunarMonth== 8 && LunarDay== 5){Festival= 7;}	//中秋节if(LunarMonth== 9 && LunarDay== 9){Festival= 8;}	//重阳节if(LunarMonth==10 && LunarDay== 1){Festival= 9;}	//寒衣节if(LunarMonth==12 && LunarDay== 8){Festival=10;}	//腊八节}if(LunarLeapMonth!=0 && LunarMonth>LunarLeapMonth+1){if(LunarMonth-1== 1 && LunarDay== 1){Festival= 1;}	//春节if(LunarMonth-1== 1 && LunarDay==15){Festival= 2;}	//元宵节if(LunarMonth-1== 2 && LunarDay== 2){Festival= 3;}	//龙抬头if(LunarMonth-1== 5 && LunarDay== 5){Festival= 4;}	//端午节if(LunarMonth-1== 7 && LunarDay== 7){Festival= 5;}	//七夕节if(LunarMonth-1== 7 && LunarDay==15){Festival= 6;}	//中元节if(LunarMonth-1== 8 && LunarDay==15){Festival= 7;}	//中秋节if(LunarMonth-1== 9 && LunarDay== 9){Festival= 8;}	//重阳节if(LunarMonth-1==10 && LunarDay== 1){Festival= 9;}	//寒衣节if(LunarMonth-1==12 && LunarDay== 8){Festival=10;}	//腊八节}if(Time[1]==1 || Time[1]==2)	//春节的时间在公历1月21日至2月20日之间变动{	//判断第二天是否是春节,如果是,则当天是除夕if(Time[2]==31)	//如果是1月31日{	//则判断当年2月1日时否是春节if(IsLunarNewYear(Time[0],2,1)){Festival=11;}	//除夕}else if(IsLunarNewYear(Time[0],Time[1],Time[2]+1)){Festival=11;}}if(Festival){Sum2=2;Order2=1;T0Count4=0;}else{Sum2=1;Order2=0;T0Count4=0;}//年干支(年的天干地支)if(Time[0]==0 && LunarYear==99)	//农历1999年(公历2000年2月5日前,即2000年春节之前),需要特殊处理一下{LCD_ShowString(3,1,"己卯");}else{switch(LunarYear%10)	//年干{case 4:LCD_ShowString(3,1,TianGan[0]);break;	//甲case 5:LCD_ShowString(3,1,TianGan[1]);break;	//乙case 6:LCD_ShowString(3,1,TianGan[2]);break;	//丙case 7:LCD_ShowString(3,1,TianGan[3]);break;	//丁case 8:LCD_ShowString(3,1,TianGan[4]);break;	//戊case 9:LCD_ShowString(3,1,TianGan[5]);break;	//己case 0:LCD_ShowString(3,1,TianGan[6]);break;	//庚case 1:LCD_ShowString(3,1,TianGan[7]);break;	//辛case 2:LCD_ShowString(3,1,TianGan[8]);break;	//壬case 3:LCD_ShowString(3,1,TianGan[9]);break;	//癸default:break;}switch(LunarYear%12)	//年支{case  8:LCD_ShowString(3,2,DiZhi[ 0]);break;	//子case  9:LCD_ShowString(3,2,DiZhi[ 1]);break;	//丑case 10:LCD_ShowString(3,2,DiZhi[ 2]);break;	//寅case 11:LCD_ShowString(3,2,DiZhi[ 3]);break;	//卯case  0:LCD_ShowString(3,2,DiZhi[ 4]);break;	//辰case  1:LCD_ShowString(3,2,DiZhi[ 5]);break;	//巳case  2:LCD_ShowString(3,2,DiZhi[ 6]);break;	//午case  3:LCD_ShowString(3,2,DiZhi[ 7]);break;	//未case  4:LCD_ShowString(3,2,DiZhi[ 8]);break;	//申case  5:LCD_ShowString(3,2,DiZhi[ 9]);break;	//酉case  6:LCD_ShowString(3,2,DiZhi[10]);break;	//戌case  7:LCD_ShowString(3,2,DiZhi[11]);break;	//亥default:break;}}//生肖if(Time[0]==0 && LunarYear==99)	//农历1999年,需要特殊处理一下{LCD_ShowString(3,3,"兔年");}else{switch(LunarYear%12){case  8:LCD_ShowString(3,3,"鼠");break;case  9:LCD_ShowString(3,3,"牛");break;case 10:LCD_ShowString(3,3,"虎");break;case 11:LCD_ShowString(3,3,"兔");break;case  0:LCD_ShowString(3,3,"龙");break;case  1:LCD_ShowString(3,3,"蛇");break;case  2:LCD_ShowString(3,3,"马");break;case  3:LCD_ShowString(3,3,"羊");break;case  4:LCD_ShowString(3,3,"猴");break;case  5:LCD_ShowString(3,3,"鸡");break;case  6:LCD_ShowString(3,3,"狗");break;case  7:LCD_ShowString(3,3,"猪");break;default:break;}LCD_ShowString(3,4,"年");}//农历月if(LunarLeapMonth==0 || LunarMonth<=LunarLeapMonth || LunarMonth>LunarLeapMonth+1){	//如果无闰月,或农历月小于闰月,或农历月大于闰月+1if( (LunarMonth>LunarLeapMonth+1) && (LunarLeapMonth!=0) ){Offset=1;}else{Offset=0;}	//Offset为偏移量,用于正常显示有闰月时闰月后面的月份switch(LunarMonth-Offset){case  1:LCD_ShowString(3,5,"正\xfd");break;case  2:LCD_ShowString(3,5,"二");break;case  3:LCD_ShowString(3,5,"三\xfd");break;case  4:LCD_ShowString(3,5,"四");break;case  5:LCD_ShowString(3,5,"五");break;case  6:LCD_ShowString(3,5,"六");break;case  7:LCD_ShowString(3,5,"七");break;case  8:LCD_ShowString(3,5,"八");break;case  9:LCD_ShowString(3,5,"九");break;case 10:LCD_ShowString(3,5,"十");break;case 11:LCD_ShowString(3,5,"冬");break;case 12:LCD_ShowString(3,5,"腊");break;default:break;}LCD_ShowString(3,6,"月");}else	//如果是闰月{switch(LunarLeapMonth){case  1:LCD_ShowString(3,5,"闰正\xfd");break;	//其实2000~2099年之间没有闰正月case  2:LCD_ShowString(3,5,"闰二");break;case  3:LCD_ShowString(3,5,"闰三\xfd");break;case  4:LCD_ShowString(3,5,"闰四");break;case  5:LCD_ShowString(3,5,"闰五");break;case  6:LCD_ShowString(3,5,"闰六");break;case  7:LCD_ShowString(3,5,"闰七");break;case  8:LCD_ShowString(3,5,"闰八");break;case  9:LCD_ShowString(3,5,"闰九");break;case 10:LCD_ShowString(3,5,"闰十");break;case 11:LCD_ShowString(3,5,"闰冬");break;case 12:LCD_ShowString(3,5,"闰腊");break;default:break;}}//农历日switch(LunarDay){case  1:LCD_ShowString(3,7,"初一");break;case  2:LCD_ShowString(3,7,"初二");break;case  3:LCD_ShowString(3,7,"初三\xfd");break;case  4:LCD_ShowString(3,7,"初四");break;case  5:LCD_ShowString(3,7,"初五");break;case  6:LCD_ShowString(3,7,"初六");break;case  7:LCD_ShowString(3,7,"初七");break;case  8:LCD_ShowString(3,7,"初八");break;case  9:LCD_ShowString(3,7,"初九");break;case 10:LCD_ShowString(3,7,"初十");break;case 11:LCD_ShowString(3,7,"十一");break;case 12:LCD_ShowString(3,7,"十二");break;case 13:LCD_ShowString(3,7,"十三\xfd");break;case 14:LCD_ShowString(3,7,"十四");break;case 15:LCD_ShowString(3,7,"十五");break;case 16:LCD_ShowString(3,7,"十六");break;case 17:LCD_ShowString(3,7,"十七");break;case 18:LCD_ShowString(3,7,"十八");break;case 19:LCD_ShowString(3,7,"十九");break;case 20:LCD_ShowString(3,7,"二十");break;case 21:LCD_ShowString(3,7,"廿一");break;case 22:LCD_ShowString(3,7,"廿二");break;case 23:LCD_ShowString(3,7,"廿三\xfd");break;case 24:LCD_ShowString(3,7,"廿四");break;case 25:LCD_ShowString(3,7,"廿五");break;case 26:LCD_ShowString(3,7,"廿六");break;case 27:LCD_ShowString(3,7,"廿七");break;case 28:LCD_ShowString(3,7,"廿八");break;case 29:LCD_ShowString(3,7,"廿九");break;case 30:LCD_ShowString(3,7,"三\xfd十");break;default:break;}//公历节日Holiday=1;	//有节日的标志置1TooLong=0;	//节日汉字太多的标志清零Overlap=0;	//节日重叠的标志清零NoOverlap=0;	//节日不重叠的标志清零Sum3=1;Order3=0;T0Count4=0;	//重置这三个变量的值if(Time[1]==1)	//1月{switch(Time[2]){case  1:break;	//元旦(1月1日)case  5:break;	//哈尔滨国际冰雪节case 10:break;	//中国人民警察节case 21:break;	//国际拥抱日case 26:break;	//国际海关日case 27:TooLong=27;Holiday=0;break;	//缅怀大屠杀受难者国际纪念日(文字太多,在ShowMore函数中显示,即在显示更多的界面显示)default:Holiday=0;break;	//如果不是固定日期的节日,则Holiday为0}if((GetWeek(Time[0],1,31)%7+Time[2])==31)	//一月最后一个星期日(范围:1月25日~1月31日){if(Holiday){Sum3++;Overlap=1;}	//国际麻风节(如果跟固定日期的节日有重叠)else{NoOverlap=1;}}}else if(Time[1]==2)	//2月{switch(Time[2]){case  2:break;	//世界湿地日case  4:break;	//世界抗癌症日case 10:break;	//国际气象节case 14:break;	//情人节case 20:break;	//世界社会公正日case 21:break;	//国际母语日default:Holiday=0;break;}}else if(Time[1]==3)	//3月{switch(Time[2]){case  1:Sum3=2;break;	//国际海豹日、国际民防日case  3:Sum3=2;break;	//全国爱耳日、世界野生动植物日case  5:break;	//学雷锋纪念日case  6:break;	//世界青光眼日case  7:break;	//女生节case  8:break;	//国际妇女节case 12:break;	//中国植树节case 15:break;	//国际消费者权益日case 20:Sum3=2;break;	//世界无肉日、国际幸福日case 21:Sum3=3;TooLong=21;break;	//世界森林日、世界睡眠日、世界儿歌日、国际消除种族歧视日case 22:break;	//世界水日case 23:break;	//世界气象日case 24:break;	//世界防止结核病日case 27:break;	//世界戏剧日default:Holiday=0;break;}if( ((GetWeek(Time[0],3,1)-1+3)%7+1+Time[2])==15 )	//三月第二个星期四(范围:3月8日~3月14日){if(Holiday){Sum3++;Overlap=1;}	//世界肾脏节else{NoOverlap=1;}}if( ((GetWeek(Time[0],3,1)-1+5)%7+1+Time[2])==22 )	//三月第三个星期二(范围:3月15日~3月21日){if(Holiday){Sum3++;Overlap=2;}	//世界社会工作日else{NoOverlap=2;}}if( ( ((GetWeek(Time[0],3,31)-1+6)%7+1)%7+Time[2] ) ==31 )	//三月最后一个星期一(范围:3月25日~3月31日){	//全国中小学生安全教育日TooLong=33;	//文字太多,在ShowMore函数中显示(随便设一个不是21的数)}}else if(Time[1]==4)	//4月{switch(Time[2]){case  1:Sum3=2;break;	//愚人节、国际爱鸟日case  2:Sum3=2;break;	//国际儿童图书日、世界自闭症日case  7:break;	//世界卫生日case  8:TooLong=8;Holiday=0;break;	//国际珍稀动物保护日case 11:break;	//世界帕金森病日case 12:break;	//世界航天日case 15:break;	//国家安全教育日case 16:break;	//世界噪音日case 17:break;	//世界血友病日case 20:break;	//联合国中文日case 22:Sum3=2;break;	//世界地球日、世界法律日case 23:break;	//世界读书日case 24:break;	//中国航天日case 25:break;	//世界防治疟疾日case 26:Sum3=2;break;	//世界知识产权日、中国疟疾日case 28:break;default:Holiday=0;break;}if( ( ((GetWeek(Time[0],4,30)-1+4)%7+1)%7+Time[2] ) ==30 )	//四月最后一个星期三(范围:4月24日~4月30日){if(Holiday){Sum3++;Overlap=1;}	//国际行政专员日else{NoOverlap=1;}}}else if(Time[1]==5)	//5月{switch(Time[2]){case  1:break;	//国际劳动节case  4:break;	//中国五四青年节case  8:break;	//世界红十字日case 10:break;	//中国品牌日case 11:break;	//防治肥胖日case 12:Sum3=2;break;	//国际护士节、全国防灾减灾日case 15:Sum3=2;break;	//国际家庭日、全国碘缺乏病日case 17:break;	//世界电信日case 18:break;	//国际博物馆日case 19:break;	//中国旅游日case 20:Sum3=2;TooLong=20;break;	//中国网络情人节、中国学生营养日、全国母乳喂养宣传日case 22:break;	//国际生物多样性日case 25:break;	//国际爱肤日case 30:break;	//全国科技工作者日case 31:break;	//世界无烟日default:Holiday=0;break;}if( ((GetWeek(Time[0],5,1)-1+5)%7+1+Time[2])==8 )	//五月第一个星期二(范围:5月1日~5月7日){if(Holiday){Sum3++;Overlap=1;}	//世界防治哮喘日else{NoOverlap=1;}}if((GetWeek(Time[0],5,1)+Time[2]==15))	//五月第二个星期日(范围:5月8日~5月14日){if(Holiday){Sum3++;Overlap=2;}	//母亲节else{NoOverlap=2;}}if((GetWeek(Time[0],5,1)+Time[2]==22))	//五月第三个星期日(范围:5月15日~5月21日){if(Holiday){Sum3++;Overlap=3;}	//全国助残日else{NoOverlap=3;}}}else if(Time[1]==6)	//6月{switch(Time[2]){case  1:break;	//国际儿童节case  5:break;	//世界环境日case  6:break;	//全国爱眼日case  7:break;	//世界食品安全日case  9:break;	//世界认可日case 23:break;	//国际奥林匹克日case 25:break;	//全国土地日case 26:break;	//国际禁毒日default:Holiday=0;break;}if( ((GetWeek(Time[0],6,1)-1+1)%7+1+Time[2])==15 )	//六月第二个星期六(范围:6月8日~6月14日){if(Holiday){Sum3++;Overlap=1;}	//文化和自然遗产日else{NoOverlap=1;}}if((GetWeek(Time[0],6,1)+Time[2]==22))	//六月第三个星期日(范围:6月15日~6月21日){if(Holiday){Sum3++;Overlap=2;}	//父亲节else{NoOverlap=2;}}}else if(Time[1]==7)	//7月{switch(Time[2]){case  1:Sum3=2;break;	//建党节、香港回归日case  7:break;	//七七抗战纪念日case 11:Sum3=2;break;	//世界人口日、中国航海日case 30:break;	//国际友谊日default:Holiday=0;break;}}else if(Time[1]==8)	//8月{switch(Time[2]){case  1:break;	//建军节case  8:break;	//全民健身日case 12:break;	//国际青年节case 13:break;	//国际左撇子日case 15:Sum3=2;break;	//全国生态日、日本无条件投降日case 19:break;	//中国医师节case 25:break;	//全国残疾预防日case 29:break;	//全国测绘法宣传日default:Holiday=0;break;}}else if(Time[1]==9)	//9月{switch(Time[2]){case  3:TooLong=3;Holiday=0;break;	//中国人民抗日战争胜利纪念日case  5:break;	//中华慈善日case 10:break;	//教师节case 12:TooLong=12;Holiday=0;break;	//中国预防出生缺陷日case 16:break;	//国际臭氧层保护日case 18:break;	//九一八纪念日case 20:Sum3=2;break;	//全国爱牙日、公民道德宣传日case 21:break;	//国际和平日case 27:break;	//世界旅游日case 30:break;	//烈士纪念日default:Holiday=0;break;}if( ((GetWeek(Time[0],9,1)-1+1)%7+1+Time[2])==22 )	//九月第三个星期六(范围:9月15日~9月21日){TooLong=33;	//全民国防教育日,在显示更多的界面显示if(Holiday){Sum3++;Overlap=1;}	//全国科普日,九月第三周双休日(周六)else{NoOverlap=1;}}if((GetWeek(Time[0],9,1)%7+Time[2])==22)	//九月第三周双休日(周日)(范围:9月15日~9月21日){if(Holiday){Sum3++;Overlap=2;}	//全国科普日else{NoOverlap=2;}}if((GetWeek(Time[0],9,1)+Time[2])==29)	//九月第四个星期日(范围:9月22日~9月28日){if(Holiday){Sum3++;Overlap=3;}	//国际聋人节else{NoOverlap=3;}}if(SolarTerm==16)	//秋分(范围:9月22日~9月24日){TooLong=34;	//中国农民丰收节}}else if(Time[1]==10)	//10月{switch(Time[2]){case  1:Sum3=2;break;	//国庆节、国际音乐节case  4:break;	//世界动物日case  5:break;	//世界教师日case  7:break;	//国际住房日case  9:break;	//世界邮政日case 10:break;	//世界精神卫生日case 13:TooLong=13;break;	//世界保健日、国际减轻自然灾害日case 15:Sum3=2;break;	//国际盲人节、全球洗手日case 16:break;	//世界粮食节case 17:Sum3=2;break;	//世界消除贫困日、国家扶贫日case 24:Sum3=2;break;	//联合国日、程序员节case 29:break;	//世界银屑病日default:Holiday=0;break;}if( ((GetWeek(Time[0],10,1)-1+6)%7+1+Time[2])==8 )	//十月第一个星期一(范围:10月1日~10月7日){if(Holiday){Sum3++;Overlap=1;}	//国际建筑日else{NoOverlap=1;}}if( ((GetWeek(Time[0],10,1)-1+3)%7+1+Time[2])==15 )	//十月第二个星期四(范围:10月8日~10月14日){if(Holiday){Sum3++;Overlap=2;}	//世界视力日else{NoOverlap=2;}}}else if(Time[1]==11)	//11月{switch(Time[2]){case  1:break;	//万圣节case  8:break;	//中国记者日case  9:break;	//消防宣传日case 14:break;	//世界糖尿病日case 16:break;	//国际宽容日case 17:break;	//国际大学生节case 25:TooLong=25;Holiday=0;break;	//国际消除家庭暴力日default:Holiday=0;break;}if( ((GetWeek(Time[0],11,1)-1+3)%7+1+Time[2])==29 )	//十一月第四个星期四(范围:11月22日~11月28日){if(Holiday){Sum3++;Overlap=1;}	//感恩节else{NoOverlap=1;}}}else if(Time[1]==12)	//12月{switch(Time[2]){case  1:break;	//世界艾滋病日case  2:break;	//全国交通安全日case  3:break;	//世界残疾人日case  4:Sum3=2;break;	//国家宪法日、全国法制宣传日case  5:break;	//国际志愿者日case  9:break;	//世界足球日case 13:TooLong=13;Holiday=0;break;	//南京大屠杀死难者国家公祭日case 20:break;	//澳门回归纪念日case 21:break;	//国际篮球日case 24:break;	//平安夜case 25:break;	//圣诞节default:Holiday=0;break;}}if(TooLong)	//如果节日超过8个字,则在第1行第6列显示一个“*”号,表示有当天有超过8个字的节日,正常走时模式按K2可以查看{if(Time[1]==1){if(TooLong==27)	//缅怀大屠杀受难者国际纪念日{LCD_ShowChar(1,6,'*');}}else if(Time[1]==3){if(TooLong==21)	//国际消除种族歧视日{LCD_ShowChar(1,6,'*');}if(TooLong==33)	//三月最后一个星期一(范围:3月25日~3月31日){	//全国中小学生安全教育日LCD_ShowChar(1,6,'*');}}else if(Time[1]==4){if(TooLong==8)	//国际珍稀动物保护日{LCD_ShowChar(1,6,'*');}}else if(Time[1]==5){if(TooLong==20)	//全国母乳喂养宣传日{LCD_ShowChar(1,6,'*');}}else if(Time[1]==9){if(TooLong==3)	//中国人民抗日战争胜利纪念日{LCD_ShowChar(1,6,'*');}if(TooLong==12)	//中国预防出生缺陷日{LCD_ShowChar(1,6,'*');}if(TooLong==33)	//全民国防教育日{LCD_ShowChar(1,6,'*');}if(TooLong==34)	//中国农民丰收节{LCD_ShowChar(1,6,'*');}}else if(Time[1]==10){if(TooLong==13)	//国际减轻自然灾害日{LCD_ShowChar(1,6,'*');}}else if(Time[1]==11){if(TooLong==25)	//国际消除家庭暴力日{LCD_ShowChar(1,6,'*');}}else if(Time[1]==12){if(TooLong==13)	//南京大屠杀死难者国家公祭日{LCD_ShowChar(1,6,'*');}}}else	//如果没有文字超过8个字的节日,则不显示“*”号{LCD_ShowChar(1,6,' ');}}//星期if(Order1==0){switch(Time[6]){case 1:LCD_ShowString(1,7,"Mon ");break;case 2:LCD_ShowString(1,7,"Tue ");break;case 3:LCD_ShowString(1,7,"Wen ");break;case 4:LCD_ShowString(1,7,"Thu ");break;case 5:LCD_ShowString(1,7,"Fri ");break;case 6:LCD_ShowString(1,7,"Sat ");break;case 7:LCD_ShowString(1,7,"Sun ");break;default:break;}}//二十四节气else if(Order1==1){switch(SolarTerm){case  1:LCD_ShowString(1,7,"立春");break;case  2:LCD_ShowString(1,7,"雨水");break;case  3:LCD_ShowString(1,7,"惊蛰");break;case  4:LCD_ShowString(1,7,"春分");break;case  5:LCD_ShowString(1,7,"清明");break;case  6:LCD_ShowString(1,7,"谷雨");break;case  7:LCD_ShowString(1,7,"立夏");break;case  8:LCD_ShowString(1,7,"小满");break;case  9:LCD_ShowString(1,7,"芒种");break;case 10:LCD_ShowString(1,7,"夏至");break;case 11:LCD_ShowString(1,7,"小暑");break;case 12:LCD_ShowString(1,7,"大暑");break;case 13:LCD_ShowString(1,7,"立秋");break;case 14:LCD_ShowString(1,7,"处暑");break;case 15:LCD_ShowString(1,7,"白露");break;case 16:LCD_ShowString(1,7,"秋分");break;case 17:LCD_ShowString(1,7,"寒露");break;case 18:LCD_ShowString(1,7,"霜降");break;case 19:LCD_ShowString(1,7,"立冬");break;case 20:LCD_ShowString(1,7,"小雪");break;case 21:LCD_ShowString(1,7,"大雪");break;case 22:LCD_ShowString(1,7,"冬至");break;case 23:LCD_ShowString(1,7,"小寒");break;case 24:LCD_ShowString(1,7,"大寒");break;default:break;}}//温度if(Order2==0){LCD_ShowString(2,5,Temp3);}//农历节日else if(Order2==1){switch(Festival){case  1:LCD_ShowString(2,5,"    春节");break;case  2:LCD_ShowString(2,5,"  元宵节");break;case  3:LCD_ShowString(2,5,"  龙抬头");break;case  4:LCD_ShowString(2,5,"  端午节");break;case  5:LCD_ShowString(2,5,"  七夕节");break;case  6:LCD_ShowString(2,5,"  中元节");break;case  7:LCD_ShowString(2,5,"  中秋节");break;case  8:LCD_ShowString(2,5,"  重阳节");break;case  9:LCD_ShowString(2,5,"  寒衣节");break;case 10:LCD_ShowString(2,5,"  腊八节");break;case 11:LCD_ShowString(2,5,"    除\xfd夕");break;default:break;}}//公历节日if(Order3==0)	//同一天的第一个节日{if(Time[1]==1){switch(Time[2]){case  1:LCD_ShowString(4,1,"元旦");break;case  5:LCD_ShowString(4,1,"哈尔滨国际冰雪节");break;case 10:LCD_ShowString(4,1,"中国人民警察节");break;case 21:LCD_ShowString(4,1,"国际拥抱日");break;case 26:LCD_ShowString(4,1,"国际海关日      ");break;default:break;}if(NoOverlap==1)	//一月最后一个星期日(范围:1月25日~1月31日){LCD_ShowString(4,1,"国际麻风节");}}else if(Time[1]==2){switch(Time[2]){case  2:LCD_ShowString(4,1,"世界湿地日");break;case  4:LCD_ShowString(4,1,"世界抗癌症日");break;case 10:LCD_ShowString(4,1,"国际气象节");break;case 14:LCD_ShowString(4,1,"情人节");break;case 20:LCD_ShowString(4,1,"世界社会公正\xfd日");break;case 21:LCD_ShowString(4,1,"国际母语日");break;default:break;}if(Time[0]%4!=0 && Time[2]==28){LCD_ShowString(4,1,"国际罕见病日");NoOverlap=1;}if(Time[0]%4==0 && Time[2]==29){LCD_ShowString(4,1,"国际罕见病日");NoOverlap=1;}}else if(Time[1]==3){switch(Time[2]){case  1:LCD_ShowString(4,1,"国际海豹日");break;case  3:LCD_ShowString(4,1,"全国爱耳日      ");break;case  5:LCD_ShowString(4,1,"学雷锋纪念日");break;case  6:LCD_ShowString(4,1,"世界青光眼日");break;case  7:LCD_ShowString(4,1,"女生节");break;case  8:LCD_ShowString(4,1,"国际妇女节      ");break;case 12:LCD_ShowString(4,1,"中国植树节      ");break;case 15:LCD_ShowString(4,1,"国际消费者权益日");break;case 20:LCD_ShowString(4,1,"世界无肉日      ");break;case 21:LCD_ShowString(4,1,"世界森林日      ");break;case 22:LCD_ShowString(4,1,"世界水日");break;case 23:LCD_ShowString(4,1,"世界气象日");break;case 24:LCD_ShowString(4,1,"世界防止结核病日");break;case 27:LCD_ShowString(4,1,"世界戏剧日");break;default:break;}if(NoOverlap==1)	//三月第二个星期四(范围:3月8日~3月14日){LCD_ShowString(4,1,"世界肾脏日");}if(NoOverlap==2)	//三月第三个星期二(范围:3月15日~3月21日){LCD_ShowString(4,1,"世界社会工作日");}}else if(Time[1]==4){switch(Time[2]){case  1:LCD_ShowString(4,1,"愚人节    ");break;case  2:LCD_ShowString(4,1,"国际儿童图书日");break;case  7:LCD_ShowString(4,1,"世界卫生日");break;case 11:LCD_ShowString(4,1,"世界帕金森病日");break;case 12:LCD_ShowString(4,1,"世界航天日");break;case 15:LCD_ShowString(4,1,"国家安全教育\xfd日");break;case 16:LCD_ShowString(4,1,"世界噪音日");break;case 17:LCD_ShowString(4,1,"世界血友病日");break;case 20:LCD_ShowString(4,1,"联合国中文日");break;case 22:LCD_ShowString(4,1,"世界地球日");break;case 23:LCD_ShowString(4,1,"世界读书日");break;case 24:LCD_ShowString(4,1,"中国航天日      ");break;case 25:LCD_ShowString(4,1,"世界防治疟疾日  ");break;case 26:LCD_ShowString(4,1,"世界知识产权日  ");break;case 28:LCD_ShowString(4,1,"安全生产与健康日");break;default:break;}if(NoOverlap==1)	//四月最后一个星期三(范围:4月24日~4月30日){LCD_ShowString(4,1,"国际行政专员日");}}else if(Time[1]==5){switch(Time[2]){case  1:LCD_ShowString(4,1,"国际劳动节      ");break;case  4:LCD_ShowString(4,1,"中国五四青年节  ");break;case  8:LCD_ShowString(4,1,"世界红十字日    ");break;case 10:LCD_ShowString(4,1,"中国品牌日      ");break;case 11:LCD_ShowString(4,1,"防治肥胖日      ");break;case 12:LCD_ShowString(4,1,"国际护士节      ");break;case 15:LCD_ShowString(4,1,"国际家庭日      ");break;case 17:LCD_ShowString(4,1,"世界电信日      ");break;case 18:LCD_ShowString(4,1,"国际博物馆日    ");break;case 19:LCD_ShowString(4,1,"中国旅游日      ");break;case 20:LCD_ShowString(4,1,"中国网络情人节  ");break;case 22:LCD_ShowString(4,1,"国际生物多样性日");break;case 25:LCD_ShowString(4,1,"国际爱肤日");break;case 30:LCD_ShowString(4,1,"全国科技工作者日");break;case 31:LCD_ShowString(4,1,"世界无烟日");break;default:break;}if(NoOverlap==1)	//五月第一个星期二(范围:5月1日~5月7日){LCD_ShowString(4,1,"世界防治哮喘日");}if(NoOverlap==2)	//五月第二个星期日(范围:5月8日~5月14日){LCD_ShowString(4,1,"母亲节");}if(NoOverlap==3)	//五月第三个星期日(范围:5月15日~5月21日){LCD_ShowString(4,1,"全国助残日");}}else if(Time[1]==6){switch(Time[2]){case  1:LCD_ShowString(4,1,"国际儿童节");break;case  5:LCD_ShowString(4,1,"世界环境日");break;case  6:LCD_ShowString(4,1,"全国爱眼日");break;case  7:LCD_ShowString(4,1,"世界食品安全日");break;case  9:LCD_ShowString(4,1,"世界认可日      ");break;case 23:LCD_ShowString(4,1,"国际奥林匹克日");break;case 25:LCD_ShowString(4,1,"全国土地日");break;case 26:LCD_ShowString(4,1,"国际禁毒日");break;default:break;}if(NoOverlap==1)	//六月第二个星期六(范围:6月8日~6月14日){LCD_ShowString(4,1,"文化和自然遗产日");}if(NoOverlap==2)	//六月第三个星期日(范围:6月15日~6月21日){LCD_ShowString(4,1,"父亲节");}}else if(Time[1]==7){switch(Time[2]){case  1:LCD_ShowString(4,1,"建党节    ");break;case  7:LCD_ShowString(4,1,"七七抗战纪念日");break;case 11:LCD_ShowString(4,1,"世界人口日");break;case 30:LCD_ShowString(4,1,"国际友谊日");break;default:break;}}else if(Time[1]==8){switch(Time[2]){case  1:LCD_ShowString(4,1,"建军节");break;case  8:LCD_ShowString(4,1,"全民健身日");break;case 12:LCD_ShowString(4,1,"国际青年节");break;case 13:LCD_ShowString(4,1,"国际左撇子日");break;case 15:LCD_ShowString(4,1,"全国生态日      ");break;case 19:LCD_ShowString(4,1,"中国医师节");break;case 25:LCD_ShowString(4,1,"全国残疾预防日");break;case 29:LCD_ShowString(4,1,"全国测绘法宣传日");break;default:break;}}else if(Time[1]==9){switch(Time[2]){case  5:LCD_ShowString(4,1,"中华慈善日");break;case 10:LCD_ShowString(4,1,"教师节");break;case 16:LCD_ShowString(4,1,"国际臭氧层保护日");break;case 18:LCD_ShowString(4,1,"九一八纪念日    ");break;case 20:LCD_ShowString(4,1,"全国爱牙日      ");break;case 21:LCD_ShowString(4,1,"国际和平日      ");break;case 27:LCD_ShowString(4,1,"世界旅游日");break;case 30:LCD_ShowString(4,1,"烈士纪念日");break;default:break;}if(NoOverlap==1)	//九月第三周双休日(周六)(范围:9月15日~9月21日){LCD_ShowString(4,1,"全国科普日");}if(NoOverlap==2)	//九月第三周双休日(周日)(范围:9月15日~9月21日){LCD_ShowString(4,1,"全国科普日");}if(NoOverlap==3)	//九月第四个星期日(范围:9月15日~9月21日){LCD_ShowString(4,1,"国际聋人节");}if(NoOverlap==4)	//秋分(范围:9月22日~9月24日){LCD_ShowString(4,1,"中国农民丰收节");}}else if(Time[1]==10){switch(Time[2]){case  1:LCD_ShowString(4,1,"国庆节          ");break;case  4:LCD_ShowString(4,1,"世界动物日      ");break;case  5:LCD_ShowString(4,1,"世界教师日      ");break;case  7:LCD_ShowString(4,1,"国际住房日      ");break;case  9:LCD_ShowString(4,1,"世界邮政日      ");break;case 10:LCD_ShowString(4,1,"世界精神卫生日  ");break;case 13:LCD_ShowString(4,1,"世界保健日      ");break;case 15:LCD_ShowString(4,1,"国际盲人节");break;case 16:LCD_ShowString(4,1,"世界粮食节");break;case 17:LCD_ShowString(4,1,"世界消除\xfd贫困日");break;case 24:LCD_ShowString(4,1,"联合国日");break;case 29:LCD_ShowString(4,1,"世界银屑病日");break;default:break;}if(NoOverlap==1)	//十月第一个星期一(范围:10月1日~10月7日){LCD_ShowString(4,1,"国际建筑日");}if(NoOverlap==2)	//十月第二个星期四(范围:10月8日~10月14日){LCD_ShowString(4,1,"世界视力日");}}else if(Time[1]==11){switch(Time[2]){case  1:LCD_ShowString(4,1,"万圣节");break;case  8:LCD_ShowString(4,1,"中国记者日");break;case  9:LCD_ShowString(4,1,"消防宣传日");break;case 14:LCD_ShowString(4,1,"世界糖尿病日");break;case 16:LCD_ShowString(4,1,"国际宽容日");break;case 17:LCD_ShowString(4,1,"国际大学生节");break;default:break;}if(NoOverlap==1)	//十一月第四个星期四(范围:11月22日~11月28日){LCD_ShowString(4,1,"感恩节");}}else if(Time[1]==12){switch(Time[2]){case  1:LCD_ShowString(4,1,"世界艾滋病日");break;case  2:LCD_ShowString(4,1,"全国交通安全日");break;case  3:LCD_ShowString(4,1,"世界残疾人日");break;case  4:LCD_ShowString(4,1,"国家宪法日    ");break;case  5:LCD_ShowString(4,1,"国际志愿者日");break;case  9:LCD_ShowString(4,1,"世界足球日");break;case 20:LCD_ShowString(4,1,"澳门回归纪念日");break;case 21:LCD_ShowString(4,1,"国际篮球日");break;case 24:LCD_ShowString(4,1,"平安夜");break;case 25:LCD_ShowString(4,1,"圣诞节");break;default:break;}}}else if(Order3==1)	//同一天的第二个节日{if(Time[1]==3){switch(Time[2]){case  1:LCD_ShowString(4,1,"国际民防日");break;case  3:LCD_ShowString(4,1,"世界野生动植物日");break;case 20:LCD_ShowString(4,1,"国际幸福日      ");break;case 21:LCD_ShowString(4,1,"世界睡眠日      ");break;default:break;}}else if(Time[1]==4){switch(Time[2]){case  1:LCD_ShowString(4,1,"国际爱鸟日");break;case  2:LCD_ShowString(4,1,"世界自闭症日  ");break;case 22:LCD_ShowString(4,1,"世界法律日");break;case 26:LCD_ShowString(4,1,"中国疟疾日    ");break;default:break;}}else if(Time[1]==5){switch(Time[2]){case 12:LCD_ShowString(4,1,"全国防灾减灾日");break;case 15:LCD_ShowString(4,1,"全国碘缺乏病日");break;case 20:LCD_ShowString(4,1,"中国学生营养日");break;default:break;}}else if(Time[1]==7){switch(Time[2]){case  1:LCD_ShowString(4,1,"香港回归日");break;case 11:LCD_ShowString(4,1,"中国航海日");break;default:break;}}else if(Time[1]==8){switch(Time[2]){case 15:LCD_ShowString(4,1,"日本无条件投降日");break;default:break;}}else if(Time[1]==9){switch(Time[2]){case 20:LCD_ShowString(4,1,"公民道德宣传日");break;default:break;}}else if(Time[1]==10){switch(Time[2]){case  1:LCD_ShowString(4,1,"国际音乐节");break;case 15:LCD_ShowString(4,1,"全球洗手日");break;case 17:LCD_ShowString(4,1,"国家扶贫日    ");break;case 24:LCD_ShowString(4,1,"程序员节");break;default:break;}}else if(Time[1]==11){switch(Time[2]){case  1:LCD_ShowString(4,1,"万圣节");break;case  8:LCD_ShowString(4,1,"中国记者日");break;case  9:LCD_ShowString(4,1,"消防宣传日");break;case 14:LCD_ShowString(4,1,"世界糖尿病日");break;case 16:LCD_ShowString(4,1,"国际宽容日");break;case 17:LCD_ShowString(4,1,"国际大学生节");break;default:break;}}else if(Time[1]==12){switch(Time[2]){case  4:LCD_ShowString(4,1,"全国法制宣传日");break;default:break;}}}else if(Order3==2)	//同一天的第三个节日{if(Time[1]==3){switch(Time[2]){case 21:LCD_ShowString(4,1,"世界儿歌日      ");break;default:break;}}else if(Time[1]==5){switch(Time[2]){case 20:LCD_ShowString(4,1,"中国学生营养日");break;default:break;}}}if(Overlap)	//如果X月的X个星期X的节日与固定日期的节日有重叠{if(Time[1]==1){if(Overlap==1 && Order3==Sum3-1){LCD_ShowString(4,1,"国际麻风节      ");}	//一月最后一个星期日(范围:1月25日~1月31日)}else if(Time[1]==3){if(Overlap==1 && Order3==Sum3-1){LCD_ShowString(4,1,"世界肾脏日      ");}	//三月第二个星期四(范围:3月8日~3月14日)if(Overlap==2 && Order3==Sum3-1){LCD_ShowString(4,1,"世界社会工作日  ");}	//三月第三个星期二(范围:3月15日~3月21日)}else if(Time[1]==4){if(Overlap==1 && Order3==Sum3-1){LCD_ShowString(4,1,"国际行政专员日  ");}	//四月最后一个星期三(范围:4月24日~4月30日)}else if(Time[1]==5)	//5月{if(Overlap==1 && Order3==Sum3-1){LCD_ShowString(4,1,"世界防治哮喘日  ");}	//五月第一个星期二(范围:5月1日~5月7日)if(Overlap==2 && Order3==Sum3-1){LCD_ShowString(4,1,"母亲节          ");}	//五月第二个星期日(范围:5月8日~5月14日)if(Overlap==3 && Order3==Sum3-1){LCD_ShowString(4,1,"全国助残日      ");}	//五月第三个星期日(范围:5月15日~5月21日)}else if(Time[1]==6)	//6月{if(Overlap==1 && Order3==Sum3-1){LCD_ShowString(4,1,"文化和自然遗产日");}	//六月第二个星期六(范围:6月8日~6月14日)if(Overlap==2 && Order3==Sum3-1){LCD_ShowString(4,1,"父亲节          ");}	//六月第三个星期日(范围:6月15日~6月21日)}else if(Time[1]==9)	//9月{if(Overlap==1 && Order3==Sum3-1){LCD_ShowString(4,1,"全国科普日      ");}	//九月第三个星期六(范围:9月15日~9月21日)if(Overlap==2 && Order3==Sum3-1){LCD_ShowString(4,1,"全国科普日      ");}	//九月第三周双休日(范围:9月15日~9月21日)if(Overlap==3 && Order3==Sum3-1){LCD_ShowString(4,1,"国际聋人节      ");}	//九月第四个星期日(范围:9月15日~9月21日)}else if(Time[1]==10)	//10月{if(Overlap==1 && Order3==Sum3-1){LCD_ShowString(4,1,"国际建筑日      ");}	//十月第一个星期一(范围:10月1日~10月7日)if(Overlap==2 && Order3==Sum3-1){LCD_ShowString(4,1,"世界视力日      ");}	//十月第二个星期四(范围:10月8日~10月14日)}else if(Time[1]==11)	//11月{if(Overlap==1 && Order3==Sum3-1){LCD_ShowString(4,1,"感恩节          ");}	//十一月第四个星期四(范围:11月22日~11月28日)}}//如果没有节日,第四行就显示月日时的干支if(Holiday==0 && NoOverlap==0){//月干支MonthGanZhi=GetMonthGanZhi(GetSolarTermsMonth(Time[0],Time[1],Time[2]));switch(MonthGanZhi/16)	//月干{case  0:LCD_ShowString(4,1,TianGan[0]);break;	//甲case  1:LCD_ShowString(4,1,TianGan[1]);break;	//乙case  2:LCD_ShowString(4,1,TianGan[2]);break;	//丙case  3:LCD_ShowString(4,1,TianGan[3]);break;	//丁case  4:LCD_ShowString(4,1,TianGan[4]);break;	//戊case  5:LCD_ShowString(4,1,TianGan[5]);break;	//己case  6:LCD_ShowString(4,1,TianGan[6]);break;	//庚case  7:LCD_ShowString(4,1,TianGan[7]);break;	//辛case  8:LCD_ShowString(4,1,TianGan[8]);break;	//壬case  9:LCD_ShowString(4,1,TianGan[9]);break;	//癸default:break;}switch(MonthGanZhi%16)	//月支{case  0:LCD_ShowString(4,2,DiZhi[ 0]);break;	//子case  1:LCD_ShowString(4,2,DiZhi[ 1]);break;	//丑case  2:LCD_ShowString(4,2,DiZhi[ 2]);break;	//寅case  3:LCD_ShowString(4,2,DiZhi[ 3]);break;	//卯case  4:LCD_ShowString(4,2,DiZhi[ 4]);break;	//辰case  5:LCD_ShowString(4,2,DiZhi[ 5]);break;	//巳case  6:LCD_ShowString(4,2,DiZhi[ 6]);break;	//午case  7:LCD_ShowString(4,2,DiZhi[ 7]);break;	//未case  8:LCD_ShowString(4,2,DiZhi[ 8]);break;	//申case  9:LCD_ShowString(4,2,DiZhi[ 9]);break;	//酉case 10:LCD_ShowString(4,2,DiZhi[10]);break;	//戌case 11:LCD_ShowString(4,2,DiZhi[11]);break;	//亥default:break;}//日干支(2000年1月1日为戊午日,以此为基准)TotalDays=CalculateDays(Time[0],Time[1],Time[2]);	switch(TotalDays%10)	//日干{case  6:LCD_ShowString(4,4,TianGan[0]);break;	//甲case  7:LCD_ShowString(4,4,TianGan[1]);break;	//乙case  8:LCD_ShowString(4,4,TianGan[2]);break;	//丙case  9:LCD_ShowString(4,4,TianGan[3]);break;	//丁case  0:LCD_ShowString(4,4,TianGan[4]);break;	//戊case  1:LCD_ShowString(4,4,TianGan[5]);break;	//己case  2:LCD_ShowString(4,4,TianGan[6]);break;	//庚case  3:LCD_ShowString(4,4,TianGan[7]);break;	//辛case  4:LCD_ShowString(4,4,TianGan[8]);break;	//壬case  5:LCD_ShowString(4,4,TianGan[9]);break;	//癸default:break;}switch(TotalDays%12)	//日支{case  6:LCD_ShowString(4,5,DiZhi[ 0]);break;	//子case  7:LCD_ShowString(4,5,DiZhi[ 1]);break;	//丑case  8:LCD_ShowString(4,5,DiZhi[ 2]);break;	//寅case  9:LCD_ShowString(4,5,DiZhi[ 3]);break;	//卯case 10:LCD_ShowString(4,5,DiZhi[ 4]);break;	//辰case 11:LCD_ShowString(4,5,DiZhi[ 5]);break;	//巳case  0:LCD_ShowString(4,5,DiZhi[ 6]);break;	//午case  1:LCD_ShowString(4,5,DiZhi[ 7]);break;	//未case  2:LCD_ShowString(4,5,DiZhi[ 8]);break;	//申case  3:LCD_ShowString(4,5,DiZhi[ 9]);break;	//酉case  4:LCD_ShowString(4,5,DiZhi[10]);break;	//戌case  5:LCD_ShowString(4,5,DiZhi[11]);break;	//亥default:break;}//时干支switch((((TotalDays+Time[3]/23)%10+4)%10%5*2+(Time[3]+1)%24/2)%10)	//时干{// Time[3]/23:   23时后属于后一天case  0:LCD_ShowString(4,7,TianGan[0]);break;	//甲case  1:LCD_ShowString(4,7,TianGan[1]);break;	//乙case  2:LCD_ShowString(4,7,TianGan[2]);break;	//丙case  3:LCD_ShowString(4,7,TianGan[3]);break;	//丁case  4:LCD_ShowString(4,7,TianGan[4]);break;	//戊case  5:LCD_ShowString(4,7,TianGan[5]);break;	//己case  6:LCD_ShowString(4,7,TianGan[6]);break;	//庚case  7:LCD_ShowString(4,7,TianGan[7]);break;	//辛case  8:LCD_ShowString(4,7,TianGan[8]);break;	//壬case  9:LCD_ShowString(4,7,TianGan[9]);break;	//癸default:break;}if(Time[3]>=23 || Time[3]< 1){LCD_ShowString(4,8,DiZhi[ 0]);}	//子	//时支if(Time[3]>= 1 && Time[3]< 3){LCD_ShowString(4,8,DiZhi[ 1]);}	//丑if(Time[3]>= 3 && Time[3]< 5){LCD_ShowString(4,8,DiZhi[ 2]);}	//寅if(Time[3]>= 5 && Time[3]< 7){LCD_ShowString(4,8,DiZhi[ 3]);}	//卯if(Time[3]>= 7 && Time[3]< 9){LCD_ShowString(4,8,DiZhi[ 4]);}	//辰if(Time[3]>= 9 && Time[3]<11){LCD_ShowString(4,8,DiZhi[ 5]);}	//巳if(Time[3]>=11 && Time[3]<13){LCD_ShowString(4,8,DiZhi[ 6]);}	//午if(Time[3]>=13 && Time[3]<15){LCD_ShowString(4,8,DiZhi[ 7]);}	//未if(Time[3]>=15 && Time[3]<17){LCD_ShowString(4,8,DiZhi[ 8]);}	//申if(Time[3]>=17 && Time[3]<19){LCD_ShowString(4,8,DiZhi[ 9]);}	//酉if(Time[3]>=19 && Time[3]<21){LCD_ShowString(4,8,DiZhi[10]);}	//戌if(Time[3]>=21 && Time[3]<23){LCD_ShowString(4,8,DiZhi[11]);}	//亥}
}/*** @brief  显示更多信息* @param  无* @retval 无*/
void ShowMore(void)
{if(TooLong)	//如果是汉字太多(超过8个汉字)的节日{if(Time[1]==1){if(TooLong==27)	//缅怀大屠杀受难者国际纪念日{LCD_ShowString(1,1,"缅怀大屠杀受难者");LCD_ShowString(2,1,"国际纪念日");}}else if(Time[1]==3){if(TooLong==21)	//国际消除种族歧视日{LCD_ShowString(1,1,"国际消除\xfd种族歧视");LCD_ShowString(2,1,"日");}if(TooLong==33)	//三月最后一个星期一(范围:3月25日~3月31日){	//全国中小学生安全教育日LCD_ShowString(1,1,"全国中小学生安全");LCD_ShowString(2,1,"教育\xfd日");}}else if(Time[1]==4){if(TooLong==8)	//国际珍稀动物保护日{LCD_ShowString(1,1,"国际珍稀动物保护");LCD_ShowString(2,1,"日");}}else if(Time[1]==5){if(TooLong==20)	//全国母乳喂养宣传日{LCD_ShowString(1,1,"全国母乳喂养宣传");LCD_ShowString(2,1,"日");}}else if(Time[1]==9){if(TooLong==3)	//中国人民抗日战争胜利纪念日{LCD_ShowString(1,1,"中国人民抗日战争");LCD_ShowString(2,1,"胜利纪念日");}if(TooLong==12)	//中国预防出生缺陷日{LCD_ShowString(1,1,"中国预防出生缺陷");LCD_ShowString(2,1,"日");}if(TooLong==33)	//全民国防教育日{LCD_ShowString(1,1,"全民国防教育\xfd日");}if(TooLong==34)	//中国农民丰收节{LCD_ShowString(1,1,"中国农民丰收节");}}else if(Time[1]==10){if(TooLong==13)	//国际减轻自然灾害日{LCD_ShowString(1,1,"国际减轻自然灾害");LCD_ShowString(2,1,"日");}}else if(Time[1]==11){if(TooLong==25)	//国际消除家庭暴力日{LCD_ShowString(1,1,"国际消除\xfd家庭暴力");LCD_ShowString(2,1,"日");}}else if(Time[1]==12){if(TooLong==13)	//南京大屠杀死难者国家公祭日{LCD_ShowString(1,1,"南京大屠杀死难者");LCD_ShowString(2,1,"国家公祭日");}}}//年干支if(Time[0]==0 && LunarYear==99)	//农历1999年(公历2000年2月5日前,即2000年春节之前),需要特殊处理一下{LCD_ShowString(3,1,"己卯");}else{switch(LunarYear%10)	//年干{case 4:LCD_ShowString(3,1,TianGan[0]);break;	//甲case 5:LCD_ShowString(3,1,TianGan[1]);break;	//乙case 6:LCD_ShowString(3,1,TianGan[2]);break;	//丙case 7:LCD_ShowString(3,1,TianGan[3]);break;	//丁case 8:LCD_ShowString(3,1,TianGan[4]);break;	//戊case 9:LCD_ShowString(3,1,TianGan[5]);break;	//己case 0:LCD_ShowString(3,1,TianGan[6]);break;	//庚case 1:LCD_ShowString(3,1,TianGan[7]);break;	//辛case 2:LCD_ShowString(3,1,TianGan[8]);break;	//壬case 3:LCD_ShowString(3,1,TianGan[9]);break;	//癸default:break;}switch(LunarYear%12)	//年支{case  8:LCD_ShowString(3,2,DiZhi[ 0]);break;	//子case  9:LCD_ShowString(3,2,DiZhi[ 1]);break;	//丑case 10:LCD_ShowString(3,2,DiZhi[ 2]);break;	//寅case 11:LCD_ShowString(3,2,DiZhi[ 3]);break;	//卯case  0:LCD_ShowString(3,2,DiZhi[ 4]);break;	//辰case  1:LCD_ShowString(3,2,DiZhi[ 5]);break;	//巳case  2:LCD_ShowString(3,2,DiZhi[ 6]);break;	//午case  3:LCD_ShowString(3,2,DiZhi[ 7]);break;	//未case  4:LCD_ShowString(3,2,DiZhi[ 8]);break;	//申case  5:LCD_ShowString(3,2,DiZhi[ 9]);break;	//酉case  6:LCD_ShowString(3,2,DiZhi[10]);break;	//戌case  7:LCD_ShowString(3,2,DiZhi[11]);break;	//亥default:break;}}LCD_ShowString(3,3,"年");//月干支MonthGanZhi=GetMonthGanZhi(GetSolarTermsMonth(Time[0],Time[1],Time[2]));switch(MonthGanZhi/16)	//月干{case  0:LCD_ShowString(3,5,TianGan[0]);break;	//甲case  1:LCD_ShowString(3,5,TianGan[1]);break;	//乙case  2:LCD_ShowString(3,5,TianGan[2]);break;	//丙case  3:LCD_ShowString(3,5,TianGan[3]);break;	//丁case  4:LCD_ShowString(3,5,TianGan[4]);break;	//戊case  5:LCD_ShowString(3,5,TianGan[5]);break;	//己case  6:LCD_ShowString(3,5,TianGan[6]);break;	//庚case  7:LCD_ShowString(3,5,TianGan[7]);break;	//辛case  8:LCD_ShowString(3,5,TianGan[8]);break;	//壬case  9:LCD_ShowString(3,5,TianGan[9]);break;	//癸default:break;}switch(MonthGanZhi%16)	//月支{case  0:LCD_ShowString(3,6,DiZhi[ 0]);break;	//子case  1:LCD_ShowString(3,6,DiZhi[ 1]);break;	//丑case  2:LCD_ShowString(3,6,DiZhi[ 2]);break;	//寅case  3:LCD_ShowString(3,6,DiZhi[ 3]);break;	//卯case  4:LCD_ShowString(3,6,DiZhi[ 4]);break;	//辰case  5:LCD_ShowString(3,6,DiZhi[ 5]);break;	//巳case  6:LCD_ShowString(3,6,DiZhi[ 6]);break;	//午case  7:LCD_ShowString(3,6,DiZhi[ 7]);break;	//未case  8:LCD_ShowString(3,6,DiZhi[ 8]);break;	//申case  9:LCD_ShowString(3,6,DiZhi[ 9]);break;	//酉case 10:LCD_ShowString(3,6,DiZhi[10]);break;	//戌case 11:LCD_ShowString(3,6,DiZhi[11]);break;	//亥default:break;}LCD_ShowString(3,7,"月");//日干支(2000年1月1日为戊午日,以此为基准)TotalDays=CalculateDays(Time[0],Time[1],Time[2]);	switch(TotalDays%10)	//日干{case  6:LCD_ShowString(4,1,TianGan[0]);break;	//甲case  7:LCD_ShowString(4,1,TianGan[1]);break;	//乙case  8:LCD_ShowString(4,1,TianGan[2]);break;	//丙case  9:LCD_ShowString(4,1,TianGan[3]);break;	//丁case  0:LCD_ShowString(4,1,TianGan[4]);break;	//戊case  1:LCD_ShowString(4,1,TianGan[5]);break;	//己case  2:LCD_ShowString(4,1,TianGan[6]);break;	//庚case  3:LCD_ShowString(4,1,TianGan[7]);break;	//辛case  4:LCD_ShowString(4,1,TianGan[8]);break;	//壬case  5:LCD_ShowString(4,1,TianGan[9]);break;	//癸default:break;}switch(TotalDays%12)	//日支{case  6:LCD_ShowString(4,2,DiZhi[ 0]);break;	//子case  7:LCD_ShowString(4,2,DiZhi[ 1]);break;	//丑case  8:LCD_ShowString(4,2,DiZhi[ 2]);break;	//寅case  9:LCD_ShowString(4,2,DiZhi[ 3]);break;	//卯case 10:LCD_ShowString(4,2,DiZhi[ 4]);break;	//辰case 11:LCD_ShowString(4,2,DiZhi[ 5]);break;	//巳case  0:LCD_ShowString(4,2,DiZhi[ 6]);break;	//午case  1:LCD_ShowString(4,2,DiZhi[ 7]);break;	//未case  2:LCD_ShowString(4,2,DiZhi[ 8]);break;	//申case  3:LCD_ShowString(4,2,DiZhi[ 9]);break;	//酉case  4:LCD_ShowString(4,2,DiZhi[10]);break;	//戌case  5:LCD_ShowString(4,2,DiZhi[11]);break;	//亥default:break;}LCD_ShowString(4,3,"日");//时干支switch((((TotalDays+Time[3]/23)%10+4)%10%5*2+(Time[3]+1)%24/2)%10)	//时干{//Time[3]/23:23时后属于后一天case  0:LCD_ShowString(4,5,TianGan[0]);break;	//甲case  1:LCD_ShowString(4,5,TianGan[1]);break;	//乙case  2:LCD_ShowString(4,5,TianGan[2]);break;	//丙case  3:LCD_ShowString(4,5,TianGan[3]);break;	//丁case  4:LCD_ShowString(4,5,TianGan[4]);break;	//戊case  5:LCD_ShowString(4,5,TianGan[5]);break;	//己case  6:LCD_ShowString(4,5,TianGan[6]);break;	//庚case  7:LCD_ShowString(4,5,TianGan[7]);break;	//辛case  8:LCD_ShowString(4,5,TianGan[8]);break;	//壬case  9:LCD_ShowString(4,5,TianGan[9]);break;	//癸default:break;}if(Time[3]>=23 || Time[3]< 1){LCD_ShowString(4,6,DiZhi[ 0]);}	//子	//时支if(Time[3]>= 1 && Time[3]< 3){LCD_ShowString(4,6,DiZhi[ 1]);}	//丑if(Time[3]>= 3 && Time[3]< 5){LCD_ShowString(4,6,DiZhi[ 2]);}	//寅if(Time[3]>= 5 && Time[3]< 7){LCD_ShowString(4,6,DiZhi[ 3]);}	//卯if(Time[3]>= 7 && Time[3]< 9){LCD_ShowString(4,6,DiZhi[ 4]);}	//辰if(Time[3]>= 9 && Time[3]<11){LCD_ShowString(4,6,DiZhi[ 5]);}	//巳if(Time[3]>=11 && Time[3]<13){LCD_ShowString(4,6,DiZhi[ 6]);}	//午if(Time[3]>=13 && Time[3]<15){LCD_ShowString(4,6,DiZhi[ 7]);}	//未if(Time[3]>=15 && Time[3]<17){LCD_ShowString(4,6,DiZhi[ 8]);}	//申if(Time[3]>=17 && Time[3]<19){LCD_ShowString(4,6,DiZhi[ 9]);}	//酉if(Time[3]>=19 && Time[3]<21){LCD_ShowString(4,6,DiZhi[10]);}	//戌if(Time[3]>=21 && Time[3]<23){LCD_ShowString(4,6,DiZhi[11]);}	//亥LCD_ShowString(4,7,"时");
}/*** @brief  主函数,只能有且只有一个* @param  无* @retval 无*/
void main()
{	DS3231_ConvertT();	//转换温度LCD_Init();	//LCD12864初始化Timer0_Init();	//定时器0初始化DS3231_ReadTime();	//上电先读取一次时间if(Time[0]<0 || Time[0]>99 || Time[1]<1 || Time[1]>12 || Time[3]<0 ||Time[3]>23 || Time[4]<0 || Time[4]>59 || Time[5]>59 || Time[5]<0)	//如果年月日时分秒越界{CheckTime();	//就对时间进行调整DS3231_SetTime();	//再将调整后的时间写入时钟芯片}while(1){KeyNum=Key();if(KeyNum)	//如果有按键按下{if(KeyNum==1)	//如果K1按下{if(AllowChangeModeFlag && Mode==0)	//切换模式{AllowChangeModeFlag=0;Mode=1;TimeSelect=0;}if(AllowChangeModeFlag && Mode==1){AllowChangeModeFlag=0;Mode=0;}AllowChangeModeFlag=1;}if(KeyNum==2)	//如果K2按下{if(AllowChangeModeFlag && Mode==0)	//切换模式{AllowChangeModeFlag=0;Mode=2;LCD_NormalMode();	//清屏}if(AllowChangeModeFlag && Mode==2){AllowChangeModeFlag=0;Mode=0;LCD_NormalMode();	//清屏DateChangedFlag=1;}AllowChangeModeFlag=1;if(Mode==1){TimeSelect++;	//时间选择变量自增TimeSelect%=6;	//可以设置年、月、日、时、分、秒(星期不用设置,通过代码计算得出)}}if(KeyNum==3)	//如果K3短按{if(Mode==1)	//如果是设置时间模式{switch(TimeSelect)	//时间数值减小{case 0:Time[0]--;break;	//年case 1:Time[1]--;break; //月case 2:Time[2]--;break; //日case 3:Time[3]--;break; //时case 4:Time[4]--;break; //分case 5:Time[5]=0;break;	//秒(按下按键3,秒的数值清零)default:break;}CheckTime();	//检查时间值是否越界ConvertSolarToLunar(Time[0],Time[1],Time[2]);FlashFlag=0;	//调节时间后暂不闪烁T0Count3=0;ShowTime();	//更新显示Delay(333);}}if(KeyNum==4)	//如果K4短按{if(Mode==1){switch(TimeSelect)	//时间数值增加{case 0:Time[0]++;break;case 1:Time[1]++;break;case 2:Time[2]++;break;case 3:Time[3]++;break;case 4:Time[4]++;break;case 5:Time[5]++;break;default:break;}CheckTime();	//检查时间值是否越界ConvertSolarToLunar(Time[0],Time[1],Time[2]);FlashFlag=0;	//调节时间后暂不闪烁T0Count3=0;ShowTime();	//更新显示Delay(333);}}if(KeyNum==7)	//如果K3长按{if(Mode==1){switch(TimeSelect)	//时间数值连续减小{case 0:Time[0]--;break;case 1:Time[1]--;break;case 2:Time[2]--;break;case 3:Time[3]--;break;case 4:Time[4]--;break;case 5:Time[5]=0;break;default:break;}CheckTime();	//检查时间值是否越界ConvertSolarToLunar(Time[0],Time[1],Time[2]);FlashFlag=0;	//调节时间后暂不闪烁T0Count3=0;ShowTime();	//更新显示Delay(67);	//防止数值变化过快}}if(KeyNum==8)	//如果K4长按{if(Mode==1){switch(TimeSelect)	//时间数值连续增加{case 0:Time[0]++;break;case 1:Time[1]++;break;case 2:Time[2]++;break;case 3:Time[3]++;break;case 4:Time[4]++;break;case 5:Time[5]++;break;}CheckTime();	//检查时间值是否越界ConvertSolarToLunar(Time[0],Time[1],Time[2]);FlashFlag=0;	//调节时间后暂不闪烁T0Count3=0;ShowTime();	//更新显示Delay(67);	//防止数值变化过快}}if(KeyNum==11 || KeyNum==12)	//如果K3或K4松开(松开瞬间){if(Mode==1){DS3231_SetTime();	//将修改后的时间写入时钟芯片}}}if(Mode==0 || Mode==1){if(ReadTimeFlag && !KeyNum)	//如果读取时间的标志为1{	//有按键按下时不进入此if,防止调整后的时间还没写入时钟芯片就又从时钟芯片中读取数据ReadTimeFlag=0;	//读取时间的标志清零DS3231_ReadTime();ConvertSolarToLunar(Time[0],Time[1],Time[2]);ShowTime();}if(ReadTempFlag)	//如果读取温度的标志为1{	//在ShowTime函数中显示温度ReadTempFlag=0;	//读取温度的标志清零if(DS3231_CheckBusy()==0){T=DS3231_ReadT();DS3231_ConvertT();}					if(T<0)	//如果温度小于0{Temp3[1]='-';	//显示负号T=-T;	//将温度变为正数}else	//如果温度大于等于0{Temp3[1]='+';	//显示正号}Temp3[2]=(unsigned char)T/10+'0';Temp3[3]=(unsigned char)T%10+'0';Temp3[5]=(unsigned long)(T*10)%10+'0';Temp3[6]=0xA1;Temp3[7]=0xE6;	//℃}}else if(Mode==2)	//显示更多信息{ShowMore();}}
}void Timer0_Routine() interrupt 1	//定时器0中断函数
{TL0=0xA0;	//设置定时初值,定时5ms,1T@12.0000MHzTH0=0x15;	//设置定时初值,定时5ms,1T@12.0000MHzT0Count0++;T0Count1++;T0Count2++;T0Count3++;T0Count4++;if(T0Count0>=4)	//每隔20ms检测一次按键{T0Count0=0;Key_Tick();}if(T0Count1>=20)	//每隔100ms读取一次时间{T0Count1=0;ReadTimeFlag=1;}if(T0Count2>=66)	//每隔330ms读取一次温度{T0Count2=0;ReadTempFlag=1;}if(T0Count3>=100)	//设置时间时每隔500ms翻转一次FlashFlag的值,即以1s的周期闪烁{T0Count3=0;FlashFlag=!FlashFlag;}if(T0Count4>=400)	//每隔2s切换节日/温度/节气/星期的显示(如果有农历节日或者是二十四节气之一或者有多个节日的话){T0Count4=0;Order1++;Order2++;Order3++;Order1%=Sum1;Order2%=Sum2;Order3%=Sum3;}
}/*公历节日
【一月】
1月1日:元旦
1月5日:哈尔滨国际冰雪节
1月10日:中国人民警察节
1月21日:国际拥抱日
1月26日:国际海关日
1月27日:缅怀大屠杀受难者国际纪念日
一月最后一个星期日:国际麻风节
【二月】
2月2日:世界湿地日
2月4日:世界抗癌症日
2月10日:国际气象节
2月14日:情人节
2月20日:世界社会公正日
2月21日:国际母语日
二月最后一日:国际罕见病日
【三月】
3月1日:国际海豹日
3月1日:国际民防日
3月3日:全国爱耳日
3月3日:世界野生动植物日
3月5日:学雷锋纪念日
3月6日:世界青光眼日
3月7日:女生节
3月8日:国际妇女节
3月12日:中国植树节
3月15日:国际消费者权益日
3月20日:世界无肉日
3月20日:国际幸福日
3月21日:世界森林日
3月21日:世界睡眠日
3月21日:世界儿歌日
3月21日:国际消除种族歧视日
3月22日:世界水日
3月23日:世界气象日
3月24日:世界防止结核病日
3月27日:世界戏剧日
三月第二个星期四:世界肾脏日
三月第三个星期二:世界社会工作日
三月最后一个星期一:全国中小学生安全教育日
【四月】
4月1日:愚人节
4月1日:国际爱鸟日
4月2日:国际儿童图书日
4月2日:世界自闭症日
4月4日:寒食节
4月7日:世界卫生日
4月8日:国际珍稀动物保护日
4月11日:世界帕金森病日
4月12日:世界航天日
4月15日:国家安全教育日
4月16日:世界噪音日
4月17日:世界血友病日
4月20日:联合国中文日
4月22日:世界地球日
4月22日:世界法律日
4月23日:世界读书日
4月24日:中国航天日
4月25日:世界防治疟疾日
4月26日:世界知识产权日
4月26日:中国疟疾日
4月28日:安全生产与健康日
四月最后一个星期三:国际行政专员日
【五月】
5月1日:国际劳动节
5月4日:中国五四青年节
5月8日:世界红十字日
5月10日:中国品牌日
5月11日:防治肥胖日
5月12日:国际护士节
5月12日:全国防灾减灾日
5月15日:国际家庭日
5月15日:全国碘缺乏病日
5月17日:世界电信日
5月18日:国际博物馆日
5月19日:中国旅游日
5月20日:中国网络情人节
5月20日:全国母乳喂养宣传日
5月20日:中国学生营养日
5月22日:国际生物多样性日
5月25日:国际爱肤日
5月30日:全国科技工作者日
5月31日:世界无烟日
五月第二个星期日:母亲节
五月第一个星期二:世界防治哮喘日
五月第三个星期日:全国助残日
【六月】
6月1日:国际儿童节
6月5日:世界环境日
6月6日:全国爱眼日
6月7日:世界食品安全日
6月9日:世界认可日
6月23日:国际奥林匹克日
6月25日:全国土地日
6月26日:国际禁毒日
六月第三个星期日:父亲节
六月第二个星期六:文化和自然遗产日
【七月】
7月1日:建党节
7月1日:香港回归日
7月7日:七七抗战纪念日
7月11日:世界人口日
7月11日:中国航海日
7月30日:国际友谊日
【八月】
8月1日:建军节
8月8日:全民健身日
8月12日:国际青年节
8月13日:国际左撇子日
8月15日:全国生态日
8月15日:日本无条件投降日
8月19日:中国医师节
8月25日:全国残疾预防日
8月29日:全国测绘法宣传日
【九月】
9月3日:中国人民抗日战争胜利纪念日
9月5日:中华慈善日
9月10日:教师节
9月12日:中国预防出生缺陷日
9月16日:国际臭氧层保护日
9月18日:九一八纪念日
9月20日:全国爱牙日
9月20日:公民道德宣传日
9月21日:国际和平日
9月27日:世界旅游日
9月30日:烈士纪念日
九月第三个星期六:全民国防教育日
九月第三周公休日:全国科普日
九月第四个星期日:国际聋人节
秋分:中国农民丰收节
【十月】
10月1日:国庆节
10月1日:国际音乐节
10月4日:世界动物日
10月5日:世界教师日
10月7日:国际住房日
10月9日:世界邮政日
10月10日:世界精神卫生日
10月13日:国际减轻自然灾害日
10月13日:世界保健日
10月15日:国际盲人节
10月15日:全球洗手日
10月16日:世界粮食节
10月17日:世界消除贫困日
10月17日:国家扶贫日
10月24日:联合国日
10月24日:程序员节
10月29日:世界银屑病日
十月第一个星期一:国际建筑日
十月第二个星期四:世界视力日
【十一月】
11月1日:万圣节
11月8日:中国记者日
11月9日:消防宣传日
11月14日:世界糖尿病日
11月16日:国际宽容日
11月17日:国际大学生节
11月25日:国际消除家庭暴力日
十一月第四个星期四:感恩节
【十二月】
12月1日:世界艾滋病日
12月2日:全国交通安全日
12月3日:世界残疾人日
12月4日:国家宪法日
12月4日:全国法制宣传日
12月5日:国际志愿者日
12月9日:世界足球日
12月13日:南京大屠杀死难者国家公祭日
12月20日:澳门回归纪念日
12月21日:国际篮球日
12月24日:平安夜
12月25日:圣诞节
*/

总结

本来也想做一个普中开发板版本的,但是发现程序不能正常运行,估计是板上焊了很多其它的芯片导致引脚之间有影响,就懒得去找原因了。最近也很少空余的时间,所以就断断续续地研究了一番,终于做出来了。

http://www.dtcms.com/wzjs/35793.html

相关文章:

  • 深圳网站做的好的公司名称推广普通话手抄报
  • 阿升网站免费学设计百度注册网站
  • 新冠变异毒株最新消息搜索引擎优化的核心是
  • 合肥网站推广外包公司旅游新闻热点
  • 北京企业网站建设方重庆关键词快速排名
  • 淘宝店铺可以做网站优化么佛山网站建设
  • 阿里云安装网站百度搜索官网
  • 东莞营销网站建设服务拉新推广平台
  • 《网站建设》项目实训报告seo资讯推推蛙
  • 上海网站建设哪家公司好百度竞价关键词出价技巧
  • java开发的手机网站建设培训网站排名
  • 电商平台证明怎么开seo排名怎么做
  • 深圳龙华区招聘网最新招聘信息南京搜索引擎推广优化
  • 武威做网站社交网络的推广方法有哪些
  • 潍坊住房公积金中心快速网站排名优化
  • 网上开店怎么找货源湖南seo博客seo交流
  • 网站整体建设方案设计app推广是什么意思
  • 外汇直播室都是网站做的获客渠道有哪些
  • 动态网站开发平台深圳刚刚突然宣布
  • 泉州网站制作设计软文推广多少钱一篇
  • 建筑八大员证报考网站百度一下网页搜索
  • 窑湾古镇网站开发seo推广哪家好
  • 管理咨询公司服务口碑好seo搜索引擎优化人才
  • 蓝希菏泽网站建设seo投放是什么意思
  • 心理网站免费建设域名访问网站怎么进入
  • 那方面 搜索网站澎湃新闻
  • 上海百度网站建设推广手段和渠道有哪些
  • 做面料哪个网站好百度平台客服联系方式
  • 网页设计与网站建设区别宁波网络营销有哪些
  • 西安关键词优化软件北京优化seo