190941|28

48

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【原创分享】DIY多功能12864液晶显示电子台历-V2.0版 [复制链接]

 
本帖最后由 henangongda-123 于 2018-7-30 16:31 编辑

Hello,大家好!经过半个多月的改进,本人的【DIY多功能12864液晶显示电子台历】V2.0版出来了!哈哈 在此分享给广大坛友及电子DIY爱好者。
一、方案描述:
STM8S207CBT6(主控MCU)+12864液晶(ST7920主控带字库/3.3V)+DS3231SN(实时时钟IC)+SHT31(温湿度传感器)+ON9658(可见光照度传感器)

二、主要功能:
1.提供2018-2099年内公历年、月、日、时、分、秒、星期等时间数据并显示;
2.自动根据公历时间转换农历时间并显示;
3.智能节日提醒、24节气提醒及每日常规内容提醒,并支持定制化生日提醒(公历、农历均可);
4.液晶背光亮度可调,并自带自然光照度传感器,可根据环境亮度自动调节背光亮度;
5.内部自带温湿度传感器,可准确测量室内温湿度数值并显示;
6.温度测量范围:-45-125℃,精度:±0.2℃(0-90℃环境);
7.湿度测量范围:0-100%RH,精度:±2%RH(0-90℃环境);
8.断电自动保存背光亮度选择及准确走时。

三、实物图片:

DIY多功能12864液晶显示电子台历-1.jpg (157.8 KB, 下载次数: 0)

DIY多功能12864液晶显示电子台历-1.jpg

DIY多功能12864液晶显示电子台历-2.jpg (176.4 KB, 下载次数: 0)

DIY多功能12864液晶显示电子台历-2.jpg

DIY多功能12864液晶显示电子台历-3.jpg (186.04 KB, 下载次数: 0)

DIY多功能12864液晶显示电子台历-3.jpg

DIY多功能12864液晶显示电子台历-4.jpg (198.72 KB, 下载次数: 0)

DIY多功能12864液晶显示电子台历-4.jpg

DIY多功能12864液晶显示电子台历-5.jpg (154.67 KB, 下载次数: 0)

DIY多功能12864液晶显示电子台历-5.jpg

DIY多功能12864液晶显示电子台历-6.jpg (159.33 KB, 下载次数: 0)

DIY多功能12864液晶显示电子台历-6.jpg

DIY多功能12864液晶显示电子台历-7.jpg (144.95 KB, 下载次数: 0)

DIY多功能12864液晶显示电子台历-7.jpg

DIY多功能12864液晶显示电子台历-8.png (1.26 MB, 下载次数: 0)

DIY多功能12864液晶显示电子台历-8.png

DIY多功能12864液晶显示电子台历-9.png (1.35 MB, 下载次数: 0)

DIY多功能12864液晶显示电子台历-9.png

PCB设计文件.rar

720.35 KB, 下载次数: 30

程序源代码.rar

177.79 KB, 下载次数: 58

DIY多功能12864液晶显示电子台历-使用说明书-V2.0版.pdf

1014.3 KB, 下载次数: 43

最新回复

非常感谢楼主,下载学习下   详情 回复 发表于 2019-10-8 10:44

赞赏

1

查看全部赞赏

点赞 关注(3)
个人签名

~~高性价比APT32单片机/MCU~~

 

回复
举报

48

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
部分源代码展示:
/**********************************************************************
文件名: 12864液晶显示电子台历
编  写: 21ic论坛 --- DIY讨论区 --- ID: henangongda123(阿勇)
                                EEWORLD论坛 --- DIY/开源硬件专区 --- ID: henangongda-123(阿勇)
                                电子发烧友论坛 --- 单片机/MCU论坛 --- ID: henangongda(阿勇)
时  间: 2018年05月26日
修  改:
        2018.05.26          建立初始版本;
                          2018.07.08          发布简易V1.0版(无LCD背光调节等功能);
                                2018.07.12          移植网友公开公历转农历算法成功;
                                2018.07.20          修改网友公开24节气查表算法成功;
                                2018.07.21          增加十二生肖显示及温度负数处理;
                                2018.07.26          发布V2.0版(带农历显示、背光亮度调节等功能);
备  注:
        1. CPU主时钟选择内部16MHz RC振荡器;
                          2. 接口说明:
                                   STM8S207CBT6  -----   外部设备
                                   ******** 12864液晶显示器 ********
                                   PD2           -----   YJ_RS
                                   PD3           -----   YJ_RW
                                   PD4           -----   YJ_E
                                   PC1           -----   YJ_PSB
                                   PC2(T1_CH2)   -----   YJ_ON(PWM背光调节)
                                   PB0-7         -----   YJ_DB0-7
                                   ******** STM8S硬件I2C ********
                                   PE1           -----   DS3231/SHT31_SCL
                                   PE2           -----   DS3231/SHT31_SDA
                                   ******** 照度传感器 ********
                                         PE7/AIN8      ----    ON9658/ADC
                                   ******** 按键开关 ********
                                   PC4           ----    S1
                                   PC5           ----    S2
                                   PC6           ----    S3
                                   PC7           ----    S4
声明: 1. 本DIY液晶显示部分参考了【杜洋老师】2007年发布的【DIY12864电子
         钟】小制作,非常感谢杜洋老师对电子爱好初学者所做的工作,谢谢!
                        2. 本DIY公历转农历算法为直接移植网友【赖皮】于2007年发布的【最强
                           万年历】原创程序,在此非常感谢其无私的共享精神,谢谢!
                        3. 本DIY中24节气算法为修改自网友【未查到原始作者ID名】公开查表算
                           法,其算法解析详见注释.
**********************************************************************/
//加载头文件
#include "stm8s207CB.h"

//宏定义
#define uchar unsigned char
#define uint unsigned int
#define ushort unsigned short
#define EEP_BASE 0x4000       //STM8S大容量Data EEPROM起始地址
#define EEPROM_Lock() FLASH_IAPSR&=(~0x08)  
#define EEPROM_Wait_Read_Over() while(!(FLASH_IAPSR&0x04))
#define EEPROM_Wrover_Clear() FLASH_IAPSR&=(~0x04)

//全局变量
uchar DS3231_R_Data[7];       //定义、保存读取DS3231数据寄存器值
uchar DS3231_W_Data[7];       //定义、保存写入DS3231数据寄存器值
uchar sec,min,hour,day,month,year,week;//定义、保存液晶显示用的年月日时分秒等时间数据
uchar sec_r,min_r,hour_r,day_r,month_r,year_r,week_r;//定义、保存DS3231读取的年月日时分秒等时间数据
int sec_w,min_w,hour_w,day_w,month_w,year_w,week_w;//定义、保存写入DS3231的年月日时分秒等时间数据
uchar year_n,day_n,month_n;   //定义保存农历年月日数据
uchar SHT31_R_Data[6];        //定义、保存读取SHT31数据值
int temperature;              //定义、保存SHT31读取的温度数值
int humidity;                 //定义、保存SHT31读取的湿度数值
int mother_day,father_day;    //定义、保存西方母亲节、父亲节日期
uint ADC_Data[3];             //定义、保存三次ADC采样数值

//系统运行全局标志
uchar mode=0;                 //系统工作模式
uchar display=0;              //系统显示界面
uchar set_flicker=0;          //参数调节闪烁
int brightness_set;           //背光亮度选择
uchar month_n_moonday;        //农历大小月
uchar solar_term;             //24节气值
uchar ADC_Number=0;           //ADC采样次数

/*================= 定制化化开机界面图片(宽度x高度=128*64)==================*/
//"欢迎使用 阿勇赠"
const uchar Pic_1[64][16] = {
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X0F,0XE0,
0X00,0X00,0X78,0X00,0X00,0X00,0X60,0X00,0X00,0X00,0X03,0X80,0X00,0X00,0X7F,0XF0,
0X00,0X00,0XFC,0X00,0X00,0X00,0XF0,0X00,0X00,0X00,0X03,0X80,0X00,0X01,0XF8,0X38,
0X00,0X00,0X9C,0X00,0X00,0X01,0XF0,0X00,0X00,0X02,0X01,0XC0,0X00,0X0F,0XF8,0X38,
0X00,0X00,0X1C,0X00,0X03,0X83,0XFD,0XE0,0X00,0X03,0X81,0XF0,0X00,0X07,0X1C,0X38,
0X00,0X00,0X38,0X00,0X01,0XDF,0XCF,0XF0,0X00,0X03,0XCF,0XF0,0X00,0X07,0X1C,0X38,
0X00,0X00,0X38,0X00,0X01,0XEF,0X0F,0X70,0X00,0X07,0XFF,0XC0,0X00,0X06,0X1F,0X30,
0X00,0X3C,0X31,0XC0,0X01,0XCF,0X0F,0X30,0X00,0X0F,0XCF,0X80,0X00,0X06,0XFF,0XB0,
0X00,0X7E,0X77,0XE0,0X00,0X03,0X9E,0X30,0X00,0X0F,0X8F,0XF0,0X00,0X07,0XFF,0X30,
0X03,0XFE,0X7F,0XE0,0X00,0X03,0XBE,0X70,0X00,0X1E,0X13,0XF8,0X00,0X06,0XFC,0X30,
0X01,0XFE,0XFD,0XE0,0X07,0XE3,0XE6,0X70,0X00,0X3E,0X27,0XF8,0X00,0X06,0X3C,0X30,
0X00,0X9C,0XF9,0XC0,0X07,0XE3,0XE7,0X60,0X00,0X7C,0X5F,0XF8,0X00,0X06,0X3F,0X30,
0X00,0X1C,0XF7,0X80,0X01,0XE3,0XC7,0XE0,0X00,0X7C,0X7F,0XF0,0X00,0X06,0X7F,0XB0,
0X03,0XFC,0XFE,0X00,0X00,0XE3,0XC7,0XE0,0X00,0X7C,0X73,0XE0,0X00,0X06,0XFF,0XB0,
0X0F,0XF8,0XF0,0X00,0X00,0XC3,0X86,0XC0,0X00,0X6C,0X7F,0XE0,0X00,0X07,0XFC,0X30,
0X00,0XF8,0X70,0X00,0X00,0X60,0X86,0X00,0X00,0X0C,0X7F,0X00,0X00,0X06,0XFC,0X30,
0X00,0XFC,0X70,0X00,0X00,0X30,0X06,0X00,0X00,0X0F,0X9F,0X00,0X00,0X0C,0X1C,0X38,
0X01,0XFC,0X7F,0X00,0X00,0X30,0X06,0X00,0X00,0X1D,0XE7,0X00,0X00,0X0C,0X1C,0X38,
0X03,0XCC,0XE7,0XC0,0X00,0X7C,0X06,0X00,0X00,0X1C,0X7E,0X00,0X00,0X0C,0X1C,0X38,
0X0F,0X85,0XE1,0XF0,0X01,0XFF,0XFE,0X00,0X00,0X1C,0X1E,0X00,0X00,0X0C,0X1F,0X38,
0X07,0X03,0XC0,0XF8,0X01,0XF3,0XFF,0XFF,0X00,0X1C,0X0F,0X80,0X00,0X18,0X19,0XF8,
0X00,0X0F,0X80,0X38,0X00,0X00,0X3F,0XFE,0X00,0X1B,0X3F,0XE0,0X00,0X10,0X08,0XF8,
0X00,0X00,0X00,0X1C,0X00,0X00,0X03,0XF0,0X00,0X18,0XF9,0XFC,0X00,0X00,0X08,0X78,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0XFF,0X80,0X00,0X08,0X38,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X08,0X00,0X7F,0XC0,0X00,0X00,0X18,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0X80,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7B,0X80,0X00,0X00,0X80,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X60,0X00,0X00,0X6F,0X00,0X00,0X05,0X80,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XF0,0X00,0X00,0X4F,0X00,0X03,0X89,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XE0,0X7C,0X00,0X0E,0X80,0X04,0XC2,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XE0,0X00,0X7E,0XC0,0X08,0XC7,0XB0,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X78,0X20,0X00,0X7E,0XC0,0X0B,0XFB,0X30,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X25,0X20,0X00,0X7C,0XC0,0X0B,0XFF,0XA0,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XEF,0XA0,0X00,0X5E,0XC0,0X0B,0X7F,0X60,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XEF,0XA0,0X00,0X5C,0X80,0X0B,0X57,0XC0,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XCF,0X20,0X00,0X1F,0X80,0X0B,0X5F,0X80,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X8F,0X20,0X00,0X3F,0XC0,0X0B,0X77,0X80,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X00,0X20,0X00,0XFC,0XC0,0X0E,0XC7,0X80,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X00,0X20,0X00,0XD8,0XC0,0X06,0X8C,0X80,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X00,0X20,0X00,0X31,0X80,0X05,0X8F,0X80,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X02,0X60,0X00,0X71,0X80,0X08,0X8C,0X80,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XE0,0X00,0X4B,0X00,0X18,0X0F,0X80,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X60,0X00,0X8F,0X00,0X00,0X05,0X80,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X20,0X03,0X06,0X00,0X00,0X00,0X80,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00
};

/*========================== 公历转农历数据表 ================================*/
//年份数据表(1901-2099年)
const uchar year_code[]={
0x04,0xAe,0x53,0x0A,0x57,0x48,0x55,0x26,0xBd,0x0d,0x26,0x50,0x0d,0x95,0x44, //1901-1905
0x46,0xAA,0xB9,0x05,0x6A,0x4d,0x09,0xAd,0x42,0x24,0xAe,0xB6,0x04,0xAe,0x4A, //1906-1910
0x6A,0x4d,0xBe,0x0A,0x4d,0x52,0x0d,0x25,0x46,0x5d,0x52,0xBA,0x0B,0x54,0x4e, //1911-1915
0x0d,0x6A,0x43,0x29,0x6d,0x37,0x09,0x5B,0x4B,0x74,0x9B,0xC1,0x04,0x97,0x54, //1916-1920
0x0A,0x4B,0x48,0x5B,0x25,0xBC,0x06,0xA5,0x50,0x06,0xd4,0x45,0x4A,0xdA,0xB8, //1921-1925
0x02,0xB6,0x4d,0x09,0x57,0x42,0x24,0x97,0xB7,0x04,0x97,0x4A,0x66,0x4B,0x3e, //1926-1930
0x0d,0x4A,0x51,0x0e,0xA5,0x46,0x56,0xd4,0xBA,0x05,0xAd,0x4e,0x02,0xB6,0x44, //1931-1935
0x39,0x37,0x38,0x09,0x2e,0x4B,0x7C,0x96,0xBf,0x0C,0x95,0x53,0x0d,0x4A,0x48, //1936-1940
0x6d,0xA5,0x3B,0x0B,0x55,0x4f,0x05,0x6A,0x45,0x4A,0xAd,0xB9,0x02,0x5d,0x4d, //1941-1945
0x09,0x2d,0x42,0x2C,0x95,0xB6,0x0A,0x95,0x4A,0x7B,0x4A,0xBd,0x06,0xCA,0x51, //1946-1950
0x0B,0x55,0x46,0x55,0x5A,0xBB,0x04,0xdA,0x4e,0x0A,0x5B,0x43,0x35,0x2B,0xB8, //1951-1955
0x05,0x2B,0x4C,0x8A,0x95,0x3f,0x0e,0x95,0x52,0x06,0xAA,0x48,0x7A,0xd5,0x3C, //1956-1960
0x0A,0xB5,0x4f,0x04,0xB6,0x45,0x4A,0x57,0x39,0x0A,0x57,0x4d,0x05,0x26,0x42, //1961-1965
0x3e,0x93,0x35,0x0d,0x95,0x49,0x75,0xAA,0xBe,0x05,0x6A,0x51,0x09,0x6d,0x46, //1966-1970
0x54,0xAe,0xBB,0x04,0xAd,0x4f,0x0A,0x4d,0x43,0x4d,0x26,0xB7,0x0d,0x25,0x4B, //1971-1975
0x8d,0x52,0xBf,0x0B,0x54,0x52,0x0B,0x6A,0x47,0x69,0x6d,0x3C,0x09,0x5B,0x50, //1976-1980
0x04,0x9B,0x45,0x4A,0x4B,0xB9,0x0A,0x4B,0x4d,0xAB,0x25,0xC2,0x06,0xA5,0x54, //1981-1985
0x06,0xd4,0x49,0x6A,0xdA,0x3d,0x0A,0xB6,0x51,0x09,0x37,0x46,0x54,0x97,0xBB, //1986-1990
0x04,0x97,0x4f,0x06,0x4B,0x44,0x36,0xA5,0x37,0x0e,0xA5,0x4A,0x86,0xB2,0xBf, //1991-1995
0x05,0xAC,0x53,0x0A,0xB6,0x47,0x59,0x36,0xBC,0x09,0x2e,0x50,0x0C,0x96,0x45, //1996-2000
0x4d,0x4A,0xB8,0x0d,0x4A,0x4C,0x0d,0xA5,0x41,0x25,0xAA,0xB6,0x05,0x6A,0x49, //2001-2005
0x7A,0xAd,0xBd,0x02,0x5d,0x52,0x09,0x2d,0x47,0x5C,0x95,0xBA,0x0A,0x95,0x4e, //2006-2010
0x0B,0x4A,0x43,0x4B,0x55,0x37,0x0A,0xd5,0x4A,0x95,0x5A,0xBf,0x04,0xBA,0x53, //2011-2015
0x0A,0x5B,0x48,0x65,0x2B,0xBC,0x05,0x2B,0x50,0x0A,0x93,0x45,0x47,0x4A,0xB9, //2016-2020 2018-351
0x06,0xAA,0x4C,0x0A,0xd5,0x41,0x24,0xdA,0xB6,0x04,0xB6,0x4A,0x69,0x57,0x3d, //2021-2025
0x0A,0x4e,0x51,0x0d,0x26,0x46,0x5e,0x93,0x3A,0x0d,0x53,0x4d,0x05,0xAA,0x43, //2026-2030
0x36,0xB5,0x37,0x09,0x6d,0x4B,0xB4,0xAe,0xBf,0x04,0xAd,0x53,0x0A,0x4d,0x48, //2031-2035
0x6d,0x25,0xBC,0x0d,0x25,0x4f,0x0d,0x52,0x44,0x5d,0xAA,0x38,0x0B,0x5A,0x4C, //2036-2040
0x05,0x6d,0x41,0x24,0xAd,0xB6,0x04,0x9B,0x4A,0x7A,0x4B,0xBe,0x0A,0x4B,0x51, //2041-2045
0x0A,0xA5,0x46,0x5B,0x52,0xBA,0x06,0xd2,0x4e,0x0A,0xdA,0x42,0x35,0x5B,0x37, //2046-2050
0x09,0x37,0x4B,0x84,0x97,0xC1,0x04,0x97,0x53,0x06,0x4B,0x48,0x66,0xA5,0x3C, //2051-2055
0x0e,0xA5,0x4f,0x06,0xB2,0x44,0x4A,0xB6,0x38,0x0A,0xAe,0x4C,0x09,0x2e,0x42, //2056-2060
0x3C,0x97,0x35,0x0C,0x96,0x49,0x7d,0x4A,0xBd,0x0d,0x4A,0x51,0x0d,0xA5,0x45, //2061-2065
0x55,0xAA,0xBA,0x05,0x6A,0x4e,0x0A,0x6d,0x43,0x45,0x2e,0xB7,0x05,0x2d,0x4B, //2066-2070
0x8A,0x95,0xBf,0x0A,0x95,0x53,0x0B,0x4A,0x47,0x6B,0x55,0x3B,0x0A,0xd5,0x4f, //2071-2075
0x05,0x5A,0x45,0x4A,0x5d,0x38,0x0A,0x5B,0x4C,0x05,0x2B,0x42,0x3A,0x93,0xB6, //2076-2080
0x06,0x93,0x49,0x77,0x29,0xBd,0x06,0xAA,0x51,0x0A,0xd5,0x46,0x54,0xdA,0xBA, //2081-2085
0x04,0xB6,0x4e,0x0A,0x57,0x43,0x45,0x27,0x38,0x0d,0x26,0x4A,0x8e,0x93,0x3e, //2086-2090
0x0d,0x52,0x52,0x0d,0xAA,0x47,0x66,0xB5,0x3B,0x05,0x6d,0x4f,0x04,0xAe,0x45, //2091-2095
0x4A,0x4e,0xB9,0x0A,0x4d,0x4C,0x0d,0x15,0x41,0x2d,0x92,0xB5                 //2096-2099
};
//月份数据表
const uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
const ushort day_code2[3]={0x111,0x130,0x14e};

/*========================== 24节气表 ================================*/
const uchar jie_qi[]={
0x06,0x15,0x04,0x13,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x15, //2000
0x05,0x14,0x04,0x12,0x05,0x14,0x05,0x14,0x05,0x15,0x05,0x15,
0x07,0x17,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2001
0x05,0x14,0x04,0x13,0x06,0x15,0x05,0x14,0x06,0x15,0x06,0x15,
0x07,0x17,0x08,0x17,0x08,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2002
0x06,0x14,0x04,0x13,0x06,0x15,0x05,0x14,0x06,0x15,0x06,0x16,
0x07,0x17,0x08,0x17,0x08,0x17,0x09,0x18,0x08,0x17,0x07,0x16, //2003
0x06,0x15,0x04,0x13,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x15, //2004
0x05,0x14,0x04,0x12,0x05,0x14,0x05,0x14,0x05,0x15,0x05,0x15,
0x07,0x17,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2005
0x05,0x14,0x04,0x13,0x06,0x15,0x05,0x14,0x05,0x15,0x06,0x15,
0x07,0x17,0x07,0x17,0x08,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2006
0x06,0x14,0x04,0x13,0x06,0x15,0x05,0x14,0x06,0x15,0x06,0x16,
0x07,0x17,0x08,0x17,0x08,0x17,0x09,0x18,0x08,0x17,0x07,0x16, //2007
0x06,0x15,0x04,0x13,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x16,0x08,0x17,0x07,0x16,0x07,0x15, //2008
0x05,0x14,0x04,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x17,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2009
0x05,0x14,0x04,0x13,0x06,0x15,0x05,0x14,0x05,0x15,0x06,0x15,
0x07,0x17,0x07,0x17,0x08,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2010
0x06,0x14,0x04,0x13,0x06,0x15,0x05,0x14,0x06,0x15,0x06,0x16,
0x07,0x17,0x08,0x17,0x08,0x17,0x08,0x18,0x08,0x17,0x07,0x16, //2011
0x06,0x15,0x04,0x13,0x05,0x14,0x04,0x14,0x05,0x14,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x16,0x08,0x17,0x07,0x16,0x07,0x15, //2012
0x05,0x14,0x04,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2013
0x05,0x14,0x04,0x13,0x06,0x15,0x05,0x14,0x05,0x15,0x06,0x15,
0x07,0x17,0x07,0x17,0x08,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2014
0x06,0x14,0x04,0x13,0x06,0x15,0x05,0x14,0x06,0x15,0x06,0x16,
0x07,0x17,0x08,0x17,0x08,0x17,0x08,0x18,0x08,0x16,0x07,0x16, //2015
0x06,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x16,0x08,0x17,0x07,0x16,0x07,0x15, //2016
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2017
0x05,0x14,0x04,0x13,0x05,0x15,0x05,0x14,0x05,0x15,0x06,0x15, //2018-432
0x07,0x17,0x07,0x17,0x08,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2018
0x05,0x14,0x04,0x13,0x06,0x15,0x05,0x14,0x06,0x15,0x06,0x15,
0x07,0x17,0x08,0x17,0x08,0x17,0x08,0x18,0x08,0x16,0x07,0x16, //2019
0x06,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x07,0x15, //2020
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x15, //2021
0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x14,0x05,0x15,0x06,0x15,
0x07,0x17,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2022
0x05,0x14,0x04,0x13,0x06,0x15,0x05,0x14,0x06,0x15,0x06,0x15,
0x07,0x17,0x08,0x17,0x08,0x17,0x08,0x18,0x08,0x16,0x07,0x16, //2023
0x06,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x06,0x15, //2024
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x15, //2025
0x05,0x14,0x04,0x12,0x05,0x14,0x05,0x14,0x05,0x15,0x05,0x15,
0x07,0x17,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2026
0x05,0x14,0x04,0x13,0x06,0x15,0x05,0x14,0x06,0x15,0x06,0x15,
0x07,0x17,0x08,0x17,0x08,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2027
0x06,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x06,0x15, //2028
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x15, //2029
0x05,0x14,0x04,0x12,0x05,0x14,0x05,0x14,0x05,0x15,0x05,0x15,
0x07,0x17,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2030
0x05,0x14,0x04,0x13,0x06,0x15,0x05,0x14,0x06,0x15,0x06,0x15,
0x07,0x17,0x08,0x17,0x08,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2031
0x06,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x06,0x15, //2032
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x15, //2033
0x05,0x14,0x04,0x12,0x05,0x14,0x05,0x14,0x05,0x15,0x05,0x15,
0x07,0x17,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2034
0x05,0x14,0x04,0x13,0x06,0x15,0x05,0x14,0x05,0x15,0x06,0x15,
0x07,0x17,0x07,0x17,0x08,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2035
0x06,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x06,0x15, //2036
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x15, //2037
0x05,0x14,0x04,0x12,0x05,0x14,0x05,0x14,0x05,0x15,0x05,0x15,
0x07,0x17,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2038
0x05,0x14,0x04,0x13,0x05,0x15,0x05,0x14,0x05,0x15,0x06,0x15,
0x07,0x17,0x07,0x17,0x08,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2039
0x06,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x06,0x15, //2040
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x14,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x16,0x08,0x17,0x07,0x16,0x07,0x15, //2041
0x05,0x14,0x04,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x17,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2042
0x05,0x14,0x04,0x13,0x06,0x15,0x05,0x14,0x05,0x15,0x06,0x15,
0x07,0x17,0x07,0x17,0x08,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2043
0x06,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x07,0x17,0x07,0x16,0x06,0x15, //2044
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x16,0x08,0x17,0x07,0x16,0x07,0x15, //2045
0x05,0x14,0x04,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2046
0x05,0x14,0x04,0x13,0x06,0x15,0x05,0x14,0x05,0x15,0x06,0x15,
0x07,0x17,0x07,0x17,0x08,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2047
0x06,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x14,
0x06,0x16,0x07,0x16,0x07,0x16,0x07,0x17,0x07,0x15,0x06,0x15, //2048
0x05,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x07,0x15, //2049
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2050
0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x14,0x05,0x15,0x06,0x15,
0x07,0x17,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2051
0x05,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x14,
0x06,0x16,0x07,0x16,0x07,0x16,0x07,0x17,0x07,0x15,0x06,0x15, //2052
0x05,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x07,0x15, //2053
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2054
0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x14,0x05,0x15,0x05,0x15,
0x07,0x17,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2055
0x05,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x14,
0x06,0x16,0x07,0x16,0x07,0x16,0x07,0x17,0x07,0x15,0x06,0x15, //2056
0x05,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x06,0x15, //2057
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x15, //2058
0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x14,0x05,0x15,0x05,0x15,
0x07,0x17,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2059
0x05,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x14,
0x06,0x16,0x07,0x16,0x07,0x16,0x07,0x16,0x06,0x15,0x06,0x15, //2060
0x05,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x06,0x15, //2061
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x15, //2062
0x05,0x14,0x04,0x12,0x05,0x14,0x05,0x14,0x05,0x15,0x05,0x15,
0x07,0x17,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2063
0x05,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x14,
0x06,0x16,0x07,0x16,0x07,0x16,0x07,0x16,0x06,0x15,0x06,0x15, //2064
0x05,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x06,0x15, //2065
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x15, //2066
0x05,0x14,0x04,0x12,0x05,0x14,0x05,0x14,0x05,0x15,0x05,0x15,
0x07,0x17,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2067
0x05,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x04,0x14,0x05,0x14,
0x06,0x16,0x06,0x16,0x07,0x16,0x07,0x16,0x06,0x15,0x06,0x15, //2068
0x05,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x06,0x15, //2069
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x14,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x16,0x08,0x17,0x07,0x16,0x07,0x15, //2070
0x05,0x14,0x04,0x12,0x05,0x14,0x05,0x14,0x05,0x15,0x05,0x15,
0x07,0x17,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2071
0x05,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x04,0x14,0x05,0x14,
0x06,0x16,0x06,0x16,0x07,0x16,0x07,0x16,0x06,0x15,0x06,0x15, //2072
0x05,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x07,0x17,0x07,0x16,0x06,0x15, //2073
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x14,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x16,0x08,0x17,0x07,0x16,0x07,0x15, //2074
0x05,0x14,0x04,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2075
0x05,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x04,0x14,0x05,0x14,
0x06,0x16,0x06,0x16,0x07,0x16,0x07,0x16,0x06,0x15,0x06,0x15, //2076
0x05,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x07,0x17,0x07,0x16,0x06,0x15, //2077
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x17,0x07,0x16,0x08,0x17,0x07,0x16,0x07,0x15, //2078
0x05,0x14,0x04,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2079
0x05,0x14,0x04,0x13,0x05,0x14,0x04,0x13,0x04,0x14,0x05,0x14,
0x06,0x16,0x06,0x16,0x07,0x16,0x07,0x16,0x06,0x15,0x06,0x15, //2080
0x05,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x14,
0x06,0x16,0x07,0x16,0x07,0x16,0x07,0x17,0x07,0x15,0x06,0x15, //2081
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x07,0x15, //2082
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2083
0x05,0x14,0x04,0x13,0x04,0x13,0x04,0x13,0x04,0x14,0x05,0x14,
0x06,0x16,0x06,0x16,0x06,0x16,0x07,0x16,0x06,0x15,0x06,0x15, //2084
0x04,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x14,
0x06,0x16,0x07,0x16,0x07,0x16,0x07,0x17,0x07,0x15,0x06,0x15, //2085
0x05,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x07,0x15, //2086
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x16, //2087
0x05,0x14,0x04,0x13,0x04,0x13,0x04,0x13,0x04,0x14,0x04,0x14,
0x06,0x16,0x06,0x16,0x06,0x16,0x07,0x16,0x06,0x15,0x06,0x15, //2088
0x04,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x14,
0x06,0x16,0x07,0x16,0x07,0x16,0x07,0x17,0x07,0x15,0x06,0x15, //2089
0x05,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x06,0x15, //2090
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x15, //2091
0x05,0x14,0x04,0x13,0x04,0x13,0x04,0x13,0x04,0x14,0x04,0x14,
0x06,0x16,0x06,0x16,0x06,0x16,0x07,0x16,0x06,0x15,0x06,0x15, //2092
0x04,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x14,
0x06,0x16,0x07,0x16,0x07,0x16,0x07,0x16,0x06,0x15,0x06,0x15, //2093
0x05,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x06,0x15, //2094
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x15, //2095
0x05,0x14,0x04,0x12,0x04,0x13,0x04,0x13,0x04,0x14,0x04,0x14,
0x06,0x16,0x06,0x16,0x06,0x16,0x07,0x16,0x06,0x15,0x06,0x15, //2096
0x04,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x14,
0x06,0x16,0x06,0x16,0x07,0x16,0x07,0x16,0x06,0x15,0x06,0x15, //2097
0x05,0x13,0x03,0x12,0x05,0x14,0x04,0x13,0x05,0x14,0x05,0x15,
0x06,0x16,0x07,0x16,0x07,0x16,0x08,0x17,0x07,0x16,0x06,0x15, //2098
0x05,0x14,0x03,0x12,0x05,0x14,0x04,0x14,0x05,0x15,0x05,0x15,
0x07,0x16,0x07,0x17,0x07,0x17,0x08,0x17,0x07,0x16,0x07,0x15  //2099
};

/********** 延时函数 ********/
/***********************************************************
函数名: delay_us()、delay_ms()
功  能: 微秒级、毫秒级延时程序
参  数: us --- 欲延时微秒数
        ms --- 欲延时毫秒数
/**********************************************************/
void delay_us(unsigned int us)
{
//24M 1个int us延时0.68uS
//16M 1.02us
        while(us--);
}
void delay_ms(unsigned int ms)//16MHZ 延时1ms
{
        unsigned int i;
        while(ms--)
        {
                for(i=0;i<1421;i++){}     //1421
        }
}

/******* 系统时钟切换操作 *******/
/***********************************************************
函数名: Clk_Init()
功  能: 时钟初始化
参  数: 无
返回值: 无
/**********************************************************/
void Clk_Init(void)
{
        CLK_CKDIVR = 0x00;
//配置系统内部时钟分频系数为1(16M),CPU时钟分频系数为1(16M)
}

/********* 端口初始化操作 **********/
/***********************************************************
函数名: Port_Init()
功  能: 端口初始化配置
参  数: 无
返回值: 无
/**********************************************************/
void Port_Init(void)
{
//12864液晶控制接口
        PC_DDR |= 0x04;             //配置PC2为输出方式(液晶显示器背光控制端口)
        PC_CR1 |= 0x04;             //配置端口推挽输出
        PC_CR2  = 0x00;             //普通2M的输出摆率
        PC_ODR |= 0x04;             //YJ_ON=1,选择开启液晶背光
        PD_DDR |= 0x1C;             //配置PD2-4为输出方式(液晶显示器RS,RW,E端口)
        PD_CR1 |= 0x1C;             //配置端口推挽输出
        PD_CR2  = 0x00;             //普通2M的输出摆率
        PB_DDR |= 0xFF;             //配置PB0-7输出(液晶数据DB0-7端口)
        PB_CR1 |= 0xFF;             //推挽输出
        PB_CR2 = 0x00;              //普通2M摆率
//按键接口
  PC_DDR &= (~0xF0);          //S1-S4按键接口输入
        PC_CR1 |= 0xF0;             //上拉输入
}

/********** EEPROM操作 **********/
/***********************************************************
函数名:EEPROM_Unclock()
功  能:EEPROM解锁
参  数:无
返回值:无
/**********************************************************/
void EEPROM_Unclock(void)
{
        FLASH_CR1 |= 0x00;
        FLASH_DUKR = 0xAE;
        FLASH_DUKR = 0x56;          // 解锁写保护
        while(!(FLASH_IAPSR&0x08)); // 等待解锁
}
/***********************************************************
函数名:EEPROM_Write_Char
功  能:向EEPROM写一字节数据操作
参  数:addr --- 地址;
                         data --- 数据;
返回值:无
/**********************************************************/
void EEPROM_Write_Char(uchar addr,uchar data)
{
        *((uchar*)(addr + EEP_BASE)) = data;
}
/***********************************************************
函数名:EEPROM_Write
功  能:EEPROM写操作(一字节完整操作)
参  数:addr --- 地址;
                         data --- 数据;
返回值:无
/**********************************************************/
void EEPROM_Write(uchar addr,uchar data)
{
        EEPROM_Unclock();           //解锁EEPROM
        EEPROM_Write_Char(addr,data);//EEPROM写入一字节
        EEPROM_Wait_Read_Over();    //等待写完成
  EEPROM_Wrover_Clear();      //清除标志
        EEPROM_Lock();              //锁住EEPROM
}
/***********************************************************
函数名:EEPROM_Read()
功  能:EEPROM读操作
参  数:addr --- 欲读取的数据地址
返回值:无
/**********************************************************/
uchar EEPROM_Read(uchar addr)
{
        return  *((uchar*)(EEP_BASE + addr));//读取一字节数据
}
个人签名

~~高性价比APT32单片机/MCU~~

 
 

回复

48

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
/********* 定时器操作 **********/
/***********************************************************
函数名:T2_Init()
功  能:定时器2初始化(定时0.5s,用时间等参数调节闪烁)
参  数:无
返回值:无
/**********************************************************/
void T2_Init(void)
{
        TIM2_PSCR = 0x08;           //分频系数256,定时器主频62500Hz
        TIM2_ARRH = 0x7A;
        TIM2_ARRL = 0x12;           //计数到31250,定时0.5s
        TIM2_IER = 0x01;            //允许更新中断
        TIM2_CR1 = 0x01;            //启动定时器2
}
/***********************************************************
函数名:T1_Init()
功  能:定时器1初始化(产生PWM波形,用于液晶背光亮度调节)
参  数:无
返回值:无
/**********************************************************/
void T1_Init(void)
{
        TIM1_PSCRH = 0x00;
        TIM1_PSCRL = 0x2A;          //分频系数42+1,T1时钟16/43MHz
        TIM1_CCMR2 |= 0x70;         //配置OC2M(T1_CH2),PWM模式1
        TIM1_CCER1 |= 0x30;         //CC2E开启,高电平有效
        TIM1_ARRH = 0x01;
        TIM1_ARRL = 0x74;           /*配置OC2REF信号频率16/43/372MHz=1000.25Hz
                                      注: 372为10位ADC采样1.2V值,当ON9658采样照度300LUX时,电压
                                                                                                                                值为1.2V,即: 环境光照度超过300LUX,液晶背光亮度达到100%*/
        TIM1_CCR2H = 0x00;
        TIM1_CCR2L = 0xBA;          //配置OC2REF占空比初值50%(T1_CCR2/T1_ARR)
        TIM1_BKR = 0x80;            //主输出使能
        TIM1_CR1 = 0x01;            //开定时器1
}

/********* ADC模数转换操作 **********/
/***********************************************************
函数名:ADC_Init()
功  能:AD转换初始化
参  数:无
返回值:无
/**********************************************************/
void ADC_Init(void)
{
        PE_DDR &= (~0x08);          //PE7(AIN8)端口为输入方式
        PE_CR1 &= (~0x08);          //浮空输入,中断禁止
        ADC_CR1 |= 0x20;            //ADC时钟为16/4=4MHz,单次转换模式
        ADC_CSR |= 0x08;            //选择通道8(AIN8)
        ADC_CR2 |= 0x08;            //ADC转换结果右对齐
  _asm("nop");
        ADC_CR1 |= 0x01;            //使能ADC1并开始转换
        delay_us(10);               //延时等待转换完毕
}

/***********************************************************
函数名: Brightness_Set()
功  能: 液晶背光亮度调节操作
参  数: 无
返回值: 无
***********************************************************/
void Brightness_Set(void)
{
        uchar a,b;
        if(brightness_set==0)       //背光亮度选择"关闭"
        {
                TIM1_CCR2H = 0x00;
          TIM1_CCR2L = 0x00;        //配置OC2REF占空比为0
        }
        else if(brightness_set==1)  //背光亮度选择"20%"
        {
                TIM1_CCR2H = 0x00;
          TIM1_CCR2L = 0x4A;        //配置OC2REF占空比为20%
        }
        else if(brightness_set==2)  //背光亮度选择"40%"
        {
                TIM1_CCR2H = 0x00;
          TIM1_CCR2L = 0x95;        //配置OC2REF占空比为40%
        }
        else if(brightness_set==3)  //背光亮度选择"60%"
        {
                TIM1_CCR2H = 0x00;
          TIM1_CCR2L = 0xDF;        //配置OC2REF占空比为60%
        }
        else if(brightness_set==4)  //背光亮度选择"80%"
        {
                TIM1_CCR2H = 0x01;
          TIM1_CCR2L = 0x2A;        //配置OC2REF占空比为80%
        }
        else if(brightness_set==5)  //背光亮度选择"最亮"
        {
                TIM1_CCR2H = 0x01;
          TIM1_CCR2L = 0x75;        //配置OC2REF占空比为100%
        }
        else if(brightness_set==6)  //背光亮度选择"自动亮度"
        {
                ADC_CR1 |= 0x01;          //启动一次AD转换
          while(!(ADC_CSR&0x80));   //等待转换完成
          ADC_CSR &= 0x7F;          //清除转换完毕中断标志
                b = ADC_DRL;              //先读取ADC转换低8位值
    a = ADC_DRH;              //再读取ADC转换高8位值
                a &= 0x03;                //取最高2位
                ADC_Data[ADC_Number] = a*256+b;
                ADC_Number++;             //采样次数标志+1
                if(ADC_Number>2)          //保存3次采样结果
                {
                        ADC_Number = 0;         //采样次数标志清零
                        ADC_Data[0]=ADC_Data[0]+ADC_Data[1]+ADC_Data[2];
                        ADC_Data[0]=ADC_Data[0]/3;//算术平均值滤波
                        TIM1_CCR2H = ADC_Data[0]/256;           
                        TIM1_CCR2L = ADC_Data[0]%256;//配置OC2REF占空比
                }
        }
}

/******* 12864液晶(ST7920主控IC)显示器驱动及相关操作 *******/
//底层驱动函数
//写入一字节指令/数据
/***********************************************************
函数名: lcd_w_char()
功  能: 向12864液晶写入一字节指令/数据
参  数: cd    --- 写入指令/数据选择标志(0=指令,1=数据)
                          cdata --- 写入指令/数据内容
返回值: 无
/**********************************************************/
void lcd_w_char(uchar cd, uchar cdata)
{
        if(cd == 0)                 //选择写入"指令"
  {
                PD_ODR &= (~0x04);        //RS=0,选择写"指令"
        }
        if(cd == 1)                 //选择写入"数据"
        {
                PD_ODR |= 0x04;           //RS=1,选择写"数据"
        }
        PD_ODR &= (~0x08);          //RW=0,选择"写"操作
        PB_ODR = cdata;             //加载指令/数据内容
        PD_ODR |= 0x10;             //E=1,开始写入指令/数据
        delay_us(1);                //延时,等待液晶端口读入指令/数据内容
        PD_ODR &= (~0x10);          //E=0,写入完成
        delay_us(80);               //液晶处理指令时间一般为72us
}
//写入一串字符数据
/***********************************************************
函数名: lcd_w_word()
功  能: 向12864液晶写入一串字符数据(最长64字符: 8个汉字或16个数字/英文字符)
                          (注: ST7920主控IC的12864液晶内部已集成汉字库,程序可直接写入汉字字符)
参  数: str --- 字符串内容
返回值: 无
***********************************************************/
void lcd_w_word(uchar *str)
{
        while(*str != '\0')         //字符串未结束
        {
                lcd_w_char(1,*str++);     //写入每个字符串数据内容
        }
        *str = 0;
}
//初始化函数
/***********************************************************
函数名: Lcd_Init()
功  能: 12864液晶初始化
参  数: 无
返回值: 无
/**********************************************************/
void Lcd_Init(void)
{
        lcd_w_char(0,0x30);         //写入指令,选择8位界面,基本指令集,绘图显示关
        lcd_w_char(0,0x0c);         //显示开,光标关闭
        lcd_w_char(0,0x01);         //清屏
        delay_ms(5);                //液晶处理指令时间4.6ms
}
//12864液晶图形显示操作
/**********************************************************
函数名: Pic_Init()
功  能: 12864液晶图形显示初始化
参  数: 无
返回值: 无
/**********************************************************/
void Pic_Init(void)
{
  lcd_w_char(0,0x01);         //清屏
        delay_ms(5);                //液晶处理指令时间4.6ms
        lcd_w_char(0,0x34);         //开扩充指令集,开绘图操作
        lcd_w_char(0,0x36);         //绘图显示开
}
/***********************************************************
函数名: Pic_Show()
功  能: 12864液晶图形显示
参  数: x、y --- 显示图形X、Y轴坐标
        pic  --- 显示的内容
返回值: 无
/**********************************************************/
void  Pic_Show(uchar x,uchar y,const uchar *pic)
{
        uchar i,j,temp_x,temp_y;    //定义一下,供后续程序使用
        temp_x = x;                 //获取X、Y轴坐标
        temp_y = y;
        temp_x |= 0x80;             //运算成液晶显示器内部时间坐标值
        temp_y |= 0x80;
        for(i=0;i<32;i++ )          //显示上半屏32行
        {
                lcd_w_char(0,temp_y++);   //设置绘图区的Y地址坐标
          lcd_w_char(0,temp_x);     //设置绘图区的X地址坐标
          for(j=0;j<16;j++)         //16列(每行8可显示8个汉字,16个字符)
          {
            lcd_w_char(1,*pic++);   //写入图形内容
          }
        }
        temp_x = 0x88;              //液晶显示器内部地址转换成下半屏
        temp_y = 0x80;
        for(i=0;i<32;i++ )          //显示下半屏32行
        {
          lcd_w_char(0,temp_y++);   //设置绘图区的Y地址坐标
          lcd_w_char(0,temp_x);     //设置绘图区的X地址坐标
          for(j=0;j<16;j++)                      //16列(每行8可显示8个汉字,16个字符)
          {
                  lcd_w_char(1,*pic++);   //写入图形内容
          }
        }
}

/********* STM8S硬件I2C相关操作 **********/
//初始化函数
/***********************************************************
函数名: I2C_Init()
功  能: STM8S207 MCU硬件I2C初始化
        (注: 主模式,两线连接,7位地址模式,10Kbps通信速率)
参  数: 无
返回值: 无
***********************************************************/
void I2C_Init(void)
{
  I2C_CR1 &= 0xFE;            //PE=0,禁用硬件I2C模块(所有位置0)
        CLK_PCKENR1 |= 0x01;        //使能I2C时钟
        I2C_CR2 |= 0x80;            //I2C_CR2控制寄存器SWRST=1,软件复位硬件I2C模块
        I2C_CR2 &= 0x7F;            //I2C_CR2控制寄存器SWRST=0,软件复位硬件I2C模块结束
  I2C_FREQR = 0x02;           //配置I2C外设时钟2MHz
        I2C_CCRH = 0x00;            //配置I2C为标准模式及速率
        I2C_CCRL = 0x64;            //I2C通信速率半周期=((1/2)*100us=50us,速率=1/100us=10KHz
        I2C_TRISER = 0x03;          //配置I2C上升时间寄存器,1000ns(SCL最大值)/500ns(2MHz周期)+1
        I2C_CR1 |= 0x01;            //启动I2C硬件模块
}

/********* DS3231实时时钟IC驱动及相关数据处理操作 **********/
//DS3231读取年、月、日、时、分、秒、星期等数据
/***********************************************************
函数名: DS3231_Read()
功  能: STM8S207 MCU通过硬件I2C通信读取DS3231内年月日时分秒等数据
参  数: data_buff --- 从DS3231读取的多字节数据指针
                          data_len  --- 从DS3231读取的多字节数据长度(7个)
返回值: 无
***********************************************************/
void DS3231_Read(uchar *data_buff,uchar data_len)
{         
        uchar temp;                 //定义一下,读取MCU状态寄存器用
        uchar i;                    //定义一下,供循环使用
        uint time;                  //定义一下,供等待延时用
        //以下程序为I2C通信防锁死操作,非常重要!
        if((PE_IDR&0x04) == 0x00)   //检测总线是否真的忙碌中(忙碌则SCL=1,SDA=0)
        {
                I2C_CR1 &= 0xFE;          //PE=0,禁用硬件I2C模块,准备直接操作MCU端口
                PE_DDR |= 0x02;           //设置SCL端口为输出
                PE_CR1 |= 0x02;           //上拉输出
                for(i=0;i<9;i++)          //SCL端口发出9个时钟脉冲,让从设备DS3231释放总线(恢复SDA=1)
                {
                        PE_ODR &= 0xFD;         //SCL=0;
                        delay_us(50);           //延时(I2C通信频率10KHz)
                  PE_ODR |= 0x02;         //SCL=1
                  delay_us(50);           //延时(I2C通信频率10KHz)
                }
                time = 500;               //变量赋值,准备延迟等待500次
                while(!(PE_IDR&0x04))     //等待数据线SDA=1
                {
                  if(!--time)             //变量自减
                  return;                 //延迟等待500次后,未达到预期效果,退出子函数以防程序死机状态
          }
                PE_DDR &= 0xFD;           //SCL端口恢复输入方式
                PE_CR1 &= 0xFD;           //浮空输入
                PE_ODR &= 0xFD;           //清零输出寄存器
                I2C_CR1 |= 0x01;          //重新启动硬件I2C模块,接管SCL、SDA端口
                return;                   //退出函数,放弃本次数据读取操作
        }
        //以上程序为I2C通信防锁死操作,非常重要!
        //以下程序为STM8S硬件I2C通信防BUSY锁死操作,非常重要!
        if((I2C_SR3&0x02) == 0x02)  //检测总线是否正确释放空闲中(总线正确释放则I2C_SR3状态寄存器BUSY=0,否则BUSY=1)
        {
                I2C_CR2 |= 0x80;          //I2C_CR2控制寄存器SWRST=1,软件复位硬件I2C模块
          I2C_CR2 &= 0x7F;          //I2C_CR2控制寄存器SWRST=0,软件复位硬件I2C模块结束
                I2C_FREQR = 0x02;         //配置I2C外设时钟2MHz
                I2C_CCRH = 0x00;          //配置I2C为标准模式及速率
                I2C_CCRL = 0x64;          //I2C通信速率半周期=((1/2)*100us=50us,速率=1/100us=10KHz
          I2C_TRISER = 0x03;        //配置I2C上升时间寄存器,1000ns(SCL最大值)/500ns(2MHz周期)+1
                I2C_CR1 |= 0x01;          //启动I2C硬件模块
                return;                   //退出函数,放弃本次数据读取操作
        }
        //以上程序为STM8S硬件I2C通信防BUSY锁死操作,非常重要!
        time = 500;                 //变量赋值,准备延迟等待500次
        while(I2C_SR3&0x02)         //检测总线是否忙碌中(I2C_SR3状态寄存器BUSY位=1表示总线上有通信/忙碌)
        {
                if(!--time)               //变量自减
                return;                   //延迟等待500次后,未达到预期效果,退出子函数以防程序死机状态
        }
        I2C_CR2 |= 0x01;            //发起始条件(置位I2C_CR2控制寄存器START位)
        time = 500;                 //变量赋值,准备延迟等待500次
        while(!(I2C_SR1&0x01))      //I2C_SR1状态寄存器SB位=1表示发送成功
        {
                if(!--time)               //变量自减
                return;                   //延迟等待500次后,未达到预期效果,退出子函数以防程序死机状态
        }
        delay_us(5);                //短暂延时
        temp = I2C_SR1;             //读取状态寄存器I2C_SR1值
        I2C_DR = 0xD0;              //发送DS3231从设备地址,同时清除I2C_SR1中BFT位(SLAVE ADDRESS,末位R/W=0表示写操作)
        time = 500;                 //变量赋值,准备延迟等待500次
        while(!(I2C_SR1&0x02))      //I2C_SR1状态寄存器ADDR位=1时表示地址发送结束(主模式)
        {
                if(!--time)               //变量自减
                return;                   //延迟等待500次后,未达到预期效果,退出子函数以防程序死机状态
        }
        delay_us(5);                //短暂延时
        temp = I2C_SR1;             //读取状态寄存器I2C_SR1数值
        temp = I2C_SR3;             //清除状态寄存器I2C_SR1中ADDR标志位(地址已发送结束)
        I2C_DR = 0x00;              //发送DS3231寄存器地址(WORD ADDRESS,从00H到12H)
        time = 500;                 //变量赋值,准备延迟等待500次
        while(!(I2C_SR1&0x84))      //等待数据发送完毕(I2C_SR1状态寄存器TxE、BTF位为1时,表示发送时数据寄存器为空且数据字节发送完毕)
        {
                if(!--time)               //变量自减
                return;                   //延迟等待500次后,未达到预期效果,退出子函数以防程序死机状态
        }
        I2C_CR2 |= 0x01;            //重复发起始条件(置位I2C_CR2控制寄存器START位)
        time = 500;                 //变量赋值,准备延迟等待500次
        while(!(I2C_SR1&0x01))      //I2C_SR1状态寄存器SB位=1表示发送成功
        {
                if(!--time)               //变量自减
                return;                   //延迟等待500次后,未达到预期效果,退出子函数以防程序死机状态
        }
        delay_us(5);                //短暂延时
        temp = I2C_SR1;             //读取状态寄存器I2C_SR1值
        I2C_DR = 0xD1;              //发送DS3231从设备地址,同时清除I2C_SR1中BFT位(SLAVE ADDRESS,末位R/W=1表示读操作)
        time = 500;                 //变量赋值,准备延迟等待500次
        while(!(I2C_SR1&0x02))      //I2C_SR1状态寄存器ADDR位=1时表示地址发送结束(主模式)
        {
                if(!--time)               //变量自减
                return;                   //延迟等待500次后,未达到预期效果,退出子函数以防程序死机状态
        }
        delay_us(5);                //短暂延时
        temp = I2C_SR1;             //读取状态寄存器I2C_SR1数值
        temp = I2C_SR3;             //清除状态寄存器I2C_SR1中ADDR标志位(地址已发送结束)
        I2C_CR2        |= 0x04;            //使能ACK应答(置位I2C_CR2控制寄存器ACK位,收到一个字节数据或地址后返回应答)
        while(data_len)             //循环读取数据
        {
                if(data_len == 1)         //如果是接收最后一位数据(特殊处理)
                {
                        I2C_CR2 &= 0xFB;        //关闭ACK应答(清零I2C_CR2控制寄存器ACK位,收到一个字节数据或地址后不返回应答)
                        I2C_CR2 |= 0x02;        //发停止条件(置位I2C_CR2控制寄存器STOP位///必须先清除I2C_SR1状态寄存器BTF位)
                }
                if(I2C_SR1 & 0x40)        //数据寄存器为满(I2C_SR1状态寄存器RxNE位为1时,表示接收寄存器数据非空)
                {
                        *data_buff = I2C_DR;    //读取数据寄存器内数值,同时清除BTF位
                        data_buff++;            //准备接收下一字节数据
                        data_len--;
                }
        }
        temp = I2C_SR1;             //读取状态寄存器I2C_SR1值
        temp = I2C_DR;              //清除I2C_SR1中BFT位
}
//设置DS3231年、月、日、时、分、秒、星期等数据
/***********************************************************
函数名: DS3231_Write()
功  能: STM8S207 MCU通过硬件I2C通信更改DS3231内年月日时分秒等数据
参  数: data_buff --- 从DS3231读取的多字节数据指针
                          data_len  --- 从DS3231读取的多字节数据长度(7个)
返回值: 无
***********************************************************/
void DS3231_Write(uchar *data_buff,uchar data_len)
{         
        uchar temp;                 //定义一下,读取MCU状态寄存器用
        uchar i;                    //定义一下,供循环使用
        uint time;                  //定义一下,供等待延时用
        //以下程序为I2C通信防锁死操作,非常重要!
        if((PE_IDR&0x04) == 0x00)   //检测总线是否真的忙碌中(忙碌则SCL=1,SDA=0)
        {
                I2C_CR1 &= 0xFE;          //PE=0,禁用硬件I2C模块,准备直接操作MCU端口
                PE_DDR |= 0x02;           //设置SCL端口为输出
                PE_CR1 |= 0x02;           //上拉输出
                for(i=0;i<9;i++)          //SCL端口发出9个时钟脉冲,让从设备DS3231释放总线(恢复SDA=1)
                {
                        PE_ODR &= 0xFD;         //SCL=0;
                        delay_us(50);           //延时(I2C通信频率10KHz)
                  PE_ODR |= 0x02;         //SCL=1
                  delay_us(50);           //延时(I2C通信频率10KHz)
                }
                time = 500;               //变量赋值,准备延迟等待500次
                while(!(PE_IDR&0x04))     //等待数据线SDA=1
                {
                  if(!--time)             //变量自减
                  return;                 //延迟等待500次后,未达到预期效果,退出子函数以防程序死机状态
          }
                PE_DDR &= 0xFD;           //SCL端口恢复输入方式
                PE_CR1 &= 0xFD;           //浮空输入
                PE_ODR &= 0xFD;           //清零输出寄存器
                I2C_CR1 |= 0x01;          //重新启动硬件I2C模块,接管SCL、SDA端口
                return;                   //退出函数,放弃本次数据写操作
        }
        //以上程序为I2C通信防锁死操作,非常重要!
        //以下程序为STM8S硬件I2C通信防BUSY锁死操作,非常重要!
        if((I2C_SR3&0x02) == 0x02)  //检测总线是否正确释放空闲中(总线正确释放则I2C_SR3状态寄存器BUSY=0,否则BUSY=1)
        {
                I2C_CR2 |= 0x80;          //I2C_CR2控制寄存器SWRST=1,软件复位硬件I2C模块
          I2C_CR2 &= 0x7F;          //I2C_CR2控制寄存器SWRST=0,软件复位硬件I2C模块结束
                I2C_FREQR = 0x02;         //配置I2C外设时钟2MHz
                I2C_CCRH = 0x00;          //配置I2C为标准模式及速率
                I2C_CCRL = 0x64;          //I2C通信速率半周期=((1/2)*100us=50us,速率=1/100us=10KHz
          I2C_TRISER = 0x03;        //配置I2C上升时间寄存器,1000ns(SCL最大值)/500ns(2MHz周期)+1
                I2C_CR1 |= 0x01;          //启动I2C硬件模块
                return;                   //退出函数,放弃本次数据写操作
        }
        //以上程序为STM8S硬件I2C通信防BUSY锁死操作,非常重要!
        I2C_CR2 &= 0xFB;            //关闭ACK应答(清零I2C_CR2控制寄存器ACK位,收到一个字节数据或地址后不返回应答)
        time = 500;                 //变量赋值,准备延迟等待500次
        while(I2C_SR3&0x02)         //检测总线是否忙碌中(I2C_SR3状态寄存器BUSY位=1表示总线上有通信/忙碌)
        {
                if(!--time)               //变量自减
                return;                   //延迟等待500次后,未达到预期效果,退出子函数以防程序死机状态
        }
        I2C_CR2 |= 0x01;            //发起始条件(置位I2C_CR2控制寄存器START位)
        time = 500;                 //变量赋值,准备延迟等待500次
        while(!(I2C_SR1&0x01))      //I2C_SR1状态寄存器SB位=1表示发送成功
        {
                if(!--time)               //变量自减
                return;                   //延迟等待500次后,未达到预期效果,退出子函数以防程序死机状态
        }
        delay_us(5);                //短暂延时
        temp = I2C_SR1;             //读取状态寄存器I2C_SR1值
        I2C_DR = 0xD0;              //发送DS3231从设备地址,同时清除I2C_SR1中BFT位(SLAVE ADDRESS,末位R/W=0表示写操作)
        time = 500;                 //变量赋值,准备延迟等待500次
        while(!(I2C_SR1&0x02))      //I2C_SR1状态寄存器ADDR位=1时表示地址发送结束(主模式)
        {
                if(!--time)               //变量自减
                return;                   //延迟等待500次后,未达到预期效果,退出子函数以防程序死机状态
        }
        delay_us(5);                //短暂延时
        temp = I2C_SR1;             //读取状态寄存器I2C_SR1数值
        temp = I2C_SR3;             //清除状态寄存器I2C_SR1中ADDR标志位(地址已发送结束)
        I2C_DR = 0x00;              //发送DS3231寄存器地址(WORD ADDRESS,从00H到12H)
        time = 500;                 //变量赋值,准备延迟等待500次
        while(!(I2C_SR1&0x84))      //等待数据发送完毕(I2C_SR1状态寄存器TxE、BTF位为1时,表示发送时数据寄存器为空且数据字节发送完毕)
        {
                if(!--time)               //变量自减
                return;                   //延迟等待500次后,未达到预期效果,退出子函数以防程序死机状态
        }
        while(data_len)             //循环写入多字节数据
        {
                I2C_DR = *data_buff;      //发送一字节数据
          while(!(I2C_SR1&0x84));   //等待数据发送完毕(I2C_SR1状态寄存器TxE、BTF位为1时,表示发送时数据寄存器为空且数据字节发送完毕)
                data_buff++;              //准备写入下一字节数据
                data_len--;
        }
        I2C_CR2 |= 0x02;            //发停止条件(置位I2C_CR2控制寄存器STOP位///必须先清除I2C_SR1状态寄存器BTF位)
}
/***********************************************************
函数名: Time_Get()
功  能: STM8S207 MCU通过硬件I2C通信读取DS3231内年月日时分秒等数据,
        并转换相应的BCD码,保存成独立的显示用十进制数据
参  数: 无
返回值: 无
***********************************************************/
void Time_Get(void)
{
        uchar a,b;
        DS3231_Read(DS3231_R_Data,7);//读取DS3231内部时间数据
        a = (DS3231_R_Data[0]&0xF0)>>4;//秒转换十位
        b = DS3231_R_Data[0]&0x0F;  //秒转换个位
        sec_r = a*10+b;             //秒转换完毕
        a = (DS3231_R_Data[1]&0xF0)>>4;//分转换十位
        b = DS3231_R_Data[1]&0x0F;  //分转换个位
        min_r = a*10+b;             //分转换完毕
        a = (DS3231_R_Data[2]&0xF0)>>4;//时转换十位
        b = DS3231_R_Data[2]&0x0F;  //时转换个位
        hour_r = a*10+b;            //时转换完毕
        a = (DS3231_R_Data[3]&0xF0)>>4;//周转换十位
        b = DS3231_R_Data[3]&0x0F;  //周转换个位
        week_r = a*10+b;            //周转换完毕
        a = (DS3231_R_Data[4]&0xF0)>>4;//日转换十位
        b = DS3231_R_Data[4]&0x0F;  //日转换个位
        day_r = a*10+b;             //日转换完毕
        a = (DS3231_R_Data[5]&0xF0)>>4;//月转换十位
        b = DS3231_R_Data[5]&0x0F;  //月转换个位
        month_r = a*10+b;           //月转换完毕
        a = (DS3231_R_Data[6]&0xF0)>>4;//年转换十位
        b = DS3231_R_Data[6]&0x0F;  //年转换个位
        year_r = a*10+b;            //年转换完毕
}
/***********************************************************
函数名: Time_Write()
功  能: STM8S207 MCU通过硬件I2C通信更改DS3231内年月日时分秒等数据
参  数: 无
返回值: 无
***********************************************************/
void Time_Write(void)
{
        //转换月日时分秒等数据(十进制转BCD码)
        DS3231_W_Data[0] = (((sec_w/10)*16)+sec_w%10);//转换秒钟
        DS3231_W_Data[1] = (((min_w/10)*16)+min_w%10);//转换分钟
        DS3231_W_Data[2] = (((hour_w/10)*16)+hour_w%10);//转换时钟
        DS3231_W_Data[3] = (((week_w/10)*16)+week_w%10);//转换星期
        DS3231_W_Data[4] = (((day_w/10)*16)+day_w%10);//转换日
        DS3231_W_Data[5] = (((month_w/10)*16)+month_w%10);//转换月
        DS3231_W_Data[6] = (((year_w/10)*16)+year_w%10);//转换年
        DS3231_Write(DS3231_W_Data,7);
}

/********* 公历年月日数据转换为农历年月日数据操作 **********
此算法为直接移植网友【赖皮】于2007年2月发布的【最强万年历】程序,
目前我也不太明白这个算法是怎么做出来的,所以注释部分比较少!
/***********************************************************
函数名: Moonday_Get()
功  能: 读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0
参  数: month_p    --- 月份指向
                          table_addr --- 年份数据表地址
返回值: 1 --- 大月
        0 --- 小月
***********************************************************/
uchar Moonday_Get(uchar month_p,ushort table_addr)
{
        switch (month_p)
        {
                case 1:                   //1月
                {
                        if((year_code[table_addr]&0x08)==0)
                  return(0);
                  else
                  return(1);
                }
                case 2:                   //2月
                {
                        if((year_code[table_addr]&0x04)==0)
                        return(0);
                        else
                        return(1);
                }
                case 3:                   //3月
                {
                        if((year_code[table_addr]&0x02)==0)
                        return(0);
                        else
                        return(1);
                }
                case 4:                   //4月
                {
                        if((year_code[table_addr]&0x01)==0)
                        return(0);
                        else
                        return(1);
                }
                case 5:                   //5月
                {
                        if((year_code[table_addr+1]&0x80)==0)
                        return(0);
                        else
                        return(1);
                }
                case 6:                   //6月
                {
                        if((year_code[table_addr+1]&0x40)==0)
                        return(0);
                        else
                        return(1);
                }
                case 7:                   //7月
                {
                        if((year_code[table_addr+1]&0x20)==0)
                        return(0);
                        else
                        return(1);
                }
                case 8:                   //8月
                {
                        if((year_code[table_addr+1]&0x10)==0)
                        return(0);
                        else
                        return(1);
                }
                case 9:                   //9月
                {
                        if((year_code[table_addr+1]&0x08)==0)
                        return(0);
                        else
                        return(1);
                }
                case 10:                  //10月
                {
                        if((year_code[table_addr+1]&0x04)==0)
                        return(0);
                        else
                        return(1);
                }
                case 11:                  //11月
                {
                        if((year_code[table_addr+1]&0x02)==0)
                        return(0);
                        else
                        return(1);
                }
                case 12:                  //12月
                {
                        if((year_code[table_addr+1]&0x01)==0)
                        return(0);
                        else
                        return(1);
                }
                case 13:                  //13月
                {
                        if((year_code[table_addr+2]&0x80)==0)
                        return(0);
                        else
                        return(1);
                }
        }
}
/***********************************************************
函数名: Nongli_Get()
功  能: 将程序读取到的公历年月日数据转换为农历年月日数据
参  数: 无
返回值: 无
***********************************************************/
void Nongli_Get(void)
{                        
  uchar temp1,temp2,temp3,month_p;//定义一下,便于后面运算使用
  uchar flag2,flag_y;         //定义一下,便于后面运算使用
        ushort temp4,table_addr;    //定义一下,便于后面运算使用
        year_n = year_r;            //农历年数据初值赋公历值
        month_n = month_r;          //农历月数据初值赋公历值
        day_n = day_r;              //农历日数据初值赋公历值
  table_addr=(year_n+100-1)*3;//定位年份数据表地址(20XX年,例如2018年位置为351: 数组第352个数值开始)
        temp1=year_code[table_addr+2]&0x60;//取当年春节所在的公历月份
        temp1>>=5;
  temp2=year_code[table_addr+2]&0x1f;//取当年春节所在的公历日
        if(temp1==1)                //计算当年春节离当年元旦的天数(春节只会在公历1月或2月)
        {  
                temp3=temp2-1;
        }  
        else
        {
    temp3=temp2+31-1;
        }
        /*
        计算公历日离当年元旦的天数:
        为了减少运算,用了两个表,day_code1[9],day_code2[3];
        如果公历月在九月或前,天数会少于0xff,用表day_code1[9],在九月后,天数大于0xff,用表day_code2[3];
        如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1;
        如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1;
        */
        if(month_n<10)
        {
    temp4=day_code1[month_n-1]+day_n-1;
        }
        else
        {
    temp4=day_code2[month_n-10]+day_n-1;
        }
        if((month_n>0x02)&&((year_n%0x04)==0))//如果公历月大于2月并且该年的2月为闰月,天数加1
        {  
                temp4+=1;
        }
        if(temp4>=temp3)            //公历日在春节后或春节当日使用下面代码进行运算
        {
                temp4-=temp3;
                month_n=1;
                month_p=1;                //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月
                flag_y=0;
          flag2=Moonday_Get(month_p,table_addr);//检查该农历月为大小还是小月,大月返回1,小月返回0
                if(flag2==0)
                {
                  temp1=29;               //小月29天
                        month_n_moonday = 0;    //更改全局变量标志
                }
                else
                {
                  temp1=30;               //大月30天
                        month_n_moonday = 1;    //更改全局变量标志
                }
                temp2=year_code[table_addr]/16;//从数据表中取该年的闰月月份,如为0则该年无闰月
                while(temp4>=temp1)
                {
      temp4-=temp1;
      month_p+=1;
      if(month_n==temp2)
                        {
        flag_y=~flag_y;
        if(flag_y==0)
                                {
                                  month_n+=1;
                                }
                        }
                        else
                        {
                                month_n+=1;
                        }
                        flag2=Moonday_Get(month_p,table_addr);
                        if(flag2==0)
                        {
                          temp1=29;             //小月29天
                                month_n_moonday = 0;  //更改全局变量标志
                        }
      else
                        {
                          temp1=30;             //大月30天
                                month_n_moonday = 1;  //更改全局变量标志
                        }
                }
    day_n=temp4+1;
        }
        else                        //公历日在春节前使用下面代码进行运算
        {  
                temp3-=temp4;
                year_n-=1;
    table_addr-=3;
                month_n=12;
          temp2=year_code[table_addr]/16;
                if(temp2==0)
                {
                  month_p=12;
                }
                else
                {
                  month_p=13;             //month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12
                }
                flag_y=0;
                flag2=Moonday_Get(month_p,table_addr);
                if(flag2==0)
    {
                  temp1=29;               //小月29天
                        month_n_moonday = 0;    //更改全局变量标志
                }
                else
                {
                  temp1=30;               //大月30天
                        month_n_moonday = 1;    //更改全局变量标志
                }
                while(temp3>temp1)
                {
                        temp3-=temp1;
                        month_p-=1;
                  if(flag_y==0)
                        {
                          month_n-=1;
                        }
                  if(month_n==temp2)
                        {
                          flag_y=~flag_y;
                        }
                  flag2=Moonday_Get(month_p,table_addr);
                  if(flag2==0)
                        {
                          temp1=29;             //小月29天
                          month_n_moonday = 0;  //更改全局变量标志
                        }
                  else
                        {
                          temp1=30;             //大月30天
                          month_n_moonday = 1;  //更改全局变量标志
                        }
                }
          day_n=temp1-temp3+1;
        }
}
个人签名

~~高性价比APT32单片机/MCU~~

 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(中级)

4
 
/********* 12864液晶各屏显示操作 **********/
/***********************************************************
函数名: Display_Main()
功  能: 12864液晶显示屏主屏显示(显示时间、温湿度等)
参  数: 无
返回值: 无
***********************************************************/
void Display_Main(void)
{
        uchar i;                    //定义变量,用于十二生肖判断
        //第一行显示: "开心  ☆2018☆  每天"或"开心  狗年  每天"
        lcd_w_char(0,0x80);         //第一行显示起始地址
        lcd_w_word("开心");         //"开心"
        if((sec>30)&&(hour%5==0)&&(mode==0))//每5个小时&&每分钟后30秒显示生肖(调时模式下不显示生肖)
        {
                i = (year-18)%12;         //当前年份与2018年生肖对比
                switch(i)
                {
                        case 0: lcd_w_word("  狗");break;//狗
                  case 1: lcd_w_word("  猪");break;//猪
                  case 2: lcd_w_word("  鼠");break;//鼠
                  case 3: lcd_w_word("  牛");break;//牛
                  case 4: lcd_w_word("  虎");break;//虎
                  case 5: lcd_w_word("  兔");break;//兔
                  case 6: lcd_w_word("  龙");break;//龙
                        case 7: lcd_w_word("  蛇");break;//蛇
                        case 8: lcd_w_word("  马");break;//马
                        case 9: lcd_w_word("  羊");break;//羊
                        case 10: lcd_w_word("  猴");break;//猴
                        case 11: lcd_w_word("  鸡");break;//鸡
                  default: break;
                }
                lcd_w_word("年  ");       //"年  "
        }
        else
        {
                lcd_w_char(1,0x20);       //空格
          lcd_w_char(1,0x03);       //星形
                lcd_w_word("20");         //"20"XX年
          lcd_w_char(1,year/10+0x30);//显示年份数据十位
          lcd_w_char(1,year%10+0x30);//显示年份数据个位
                lcd_w_char(1,0x03);       //星形
          lcd_w_char(1,0x20);       //空格
        }
        lcd_w_word("每天");
        //第二行显示: "XX月XX日  星期X"
        lcd_w_char(0,0x90);         //第二行显示起始地址
        if((sec>30)&&(mode==0))     //每分钟后30秒显示农历(调时模式下不显示农历)
        {
                switch(month_n)           //显示农历月份
                {
                        case 1: lcd_w_word("正");break;//一月
                  case 2: lcd_w_word("二");break;//二月
                  case 3: lcd_w_word("三");break;//三月
                  case 4: lcd_w_word("四");break;//四月
                  case 5: lcd_w_word("五");break;//五月
                  case 6: lcd_w_word("六");break;//六月
                  case 7: lcd_w_word("七");break;//七月
                        case 8: lcd_w_word("八");break;//八月
                        case 9: lcd_w_word("九");break;//九月
                        case 10: lcd_w_word("十");break;//十月
                        case 11: lcd_w_word("冬");break;//十一月
                        case 12: lcd_w_word("腊");break;//十二月
                  default: break;
                }
                lcd_w_word("月");         //"月"
                switch(day_n)             //显示农历日
                {
                        case 1: lcd_w_word("初一");break;//1
                  case 2: lcd_w_word("初二");break;//2
                  case 3: lcd_w_word("初三");break;//3
                  case 4: lcd_w_word("初四");break;//4
                  case 5: lcd_w_word("初五");break;//5
                  case 6: lcd_w_word("初六");break;//6
                  case 7: lcd_w_word("初七");break;//7
                        case 8: lcd_w_word("初八");break;//8
                        case 9: lcd_w_word("初九");break;//9
                        case 10: lcd_w_word("初十");break;//10
                        case 11: lcd_w_word("十一");break;//11
                        case 12: lcd_w_word("十二");break;//12
                        case 13: lcd_w_word("十三");break;//13
                        case 14: lcd_w_word("十四");break;//14
                        case 15: lcd_w_word("十五");break;//15
                        case 16: lcd_w_word("十六");break;//16
                        case 17: lcd_w_word("十七");break;//17
                        case 18: lcd_w_word("十八");break;//18
                        case 19: lcd_w_word("十九");break;//19
                        case 20: lcd_w_word("二十");break;//20
                        case 21: lcd_w_word("廿一");break;//21
                        case 22: lcd_w_word("廿二");break;//22
                        case 23: lcd_w_word("廿三");break;//23
                        case 24: lcd_w_word("廿四");break;//24
                        case 25: lcd_w_word("廿五");break;//25
                        case 26: lcd_w_word("廿六");break;//26
                        case 27: lcd_w_word("廿七");break;//27
                        case 28: lcd_w_word("廿八");break;//28
                        case 29: lcd_w_word("廿九");break;//29
                        case 30: lcd_w_word("三十");break;//30
                  default: break;
                }
        }
        else                        //每分钟前30秒显示公历(调时模式下必显示公历)
        {
                lcd_w_char(1,month/10+0x30);//显示月份十位
          lcd_w_char(1,month%10+0x30);//显示月份个位
          lcd_w_word("月");         //"月"
          lcd_w_char(1,day/10+0x30);//显示日十位
          lcd_w_char(1,day%10+0x30);//显示日个位
                lcd_w_word("日");         //"日"
        }
        lcd_w_char(1,0x20);         //空格
        lcd_w_char(1,0x20);         //空格
        lcd_w_word("星期");         //"星期"
        switch(week)                //星期数字转汉字
        {
                case 1: lcd_w_word("一");break;//周一
                case 2: lcd_w_word("二");break;//周二
                case 3: lcd_w_word("三");break;//周三
                case 4: lcd_w_word("四");break;//周四
                case 5: lcd_w_word("五");break;//周五
                case 6: lcd_w_word("六");break;//周六
                case 7: lcd_w_word("日");break;//周日
                default: break;
        }
        //第三行显示: "XX:XX:XX  XX.X℃"
        lcd_w_char(0,0x88);         //第三行显示起始地址
        lcd_w_char(1,hour/10+0x30); //显示时十位
        lcd_w_char(1,hour%10+0x30); //显示时个位
        lcd_w_char(1,0x3a);         //显示":"
        lcd_w_char(1,min/10+0x30);  //显示分十位
        lcd_w_char(1,min%10+0x30);  //显示分个位
        lcd_w_char(1,0x3a);         //显示":"
        lcd_w_char(1,sec/10+0x30);  //显示秒十位
        lcd_w_char(1,sec%10+0x30);  //显示秒个位
        lcd_w_char(1,0x20);         //空格
        if(sec<=30)                 //每分钟前30秒显示温度
        {
                if(temperature<=-100)     //"-45.0 —— -10.0"度
                {
                        lcd_w_char(1,0x2D);     //"-"号
                        temperature = -temperature;//负数取正
                        lcd_w_char(1,(temperature/100)+0x30);//显示温度十位
                        lcd_w_char(1,(temperature/10)%10+0x30);//显示温度个位
            lcd_w_char(1,0x2e);            //"."
                  lcd_w_char(1,temperature%10+0x30);
                }
                else if((temperature<0)&&(temperature>-100))//"-9.9 —— -0.1"度
                {
                        lcd_w_char(1,0x20);     //空格
                        lcd_w_char(1,0x2D);     //"-"号
                        temperature = -temperature;//负数取正
                        lcd_w_char(1,(temperature/10)%10+0x30);//显示温度个位
            lcd_w_char(1,0x2e);            //"."
                  lcd_w_char(1,temperature%10+0x30);
                }
                else if(temperature==0)   //"0"度
                {
                        lcd_w_char(1,0x20);     //空格
                        lcd_w_char(1,0x20);     //空格
                        lcd_w_char(1,0x20);     //空格
                        lcd_w_char(1,0x20);     //空格
                        lcd_w_char(1,0x30);     //"0"
                }
                else if((temperature<100)&&(temperature>0))//"0.1 —— 9.9"度
                {
                        lcd_w_char(1,0x20);     //空格
                        lcd_w_char(1,0x20);     //空格
                        lcd_w_char(1,(temperature/10)%10+0x30);//显示温度个位
            lcd_w_char(1,0x2e);            //"."
                  lcd_w_char(1,temperature%10+0x30);
                }
                else if(temperature>=100) //"10.0 —— 45.0"度
                {
                        lcd_w_char(1,0x20);     //空格
                        lcd_w_char(1,(temperature/100)+0x30);//显示温度十位
                        lcd_w_char(1,(temperature/10)%10+0x30);//显示温度个位
            lcd_w_char(1,0x2e);            //"."
                  lcd_w_char(1,temperature%10+0x30);
                }
                lcd_w_word("℃");                //摄氏度℃
        }
        else                        //后30秒显示湿度
        {
                if(humidity<100)          //"0-9.9"%
                {
                        lcd_w_char(1,0x20);     //空格
                        lcd_w_char(1,0x20);     //空格
                }
                else                      //"10.0-99.9"%
                {
                        lcd_w_char(1,0x20);     //空格
                        lcd_w_char(1,(humidity/100)+0x30);//显示湿度十位
                }
          lcd_w_char(1,(humidity/10)%10+0x30);//显示湿度个位
          lcd_w_char(1,0x2e);              //"."
                lcd_w_char(1,humidity%10+0x30);
                lcd_w_word("%");                //湿度%
        }
        //第四行显示: "问候语"
        lcd_w_char(0,0x98);         //第四行显示起始地址
        //1.定制化节日提示(偶数小时显示)
        //2.公共节假日&&24节气提示(偶数小时显示)
        //3.每天常规内容提示
  /******** 定制化节日 ********/
        if((month_n==2)&&(day_n==16)&&(hour%2==0))//生日提醒-小小
        {
          lcd_w_word("G8小小生日快乐!");
        }
        else if((month_n==2)&&(day_n==14)&&(hour%2==0))//生日提醒-阿勇
        {
          lcd_w_word("  阿勇生日快乐  ");
        }
        /******** 公共节假日&&24节气 ********/
        //1月
        else if((month==1)&&(day==1)&&(hour%2==0))//元旦
        {
                lcd_w_word("    元旦快乐    ");
        }
        else if((month_n==12)&&(day_n==8)&&(hour%2==0))//腊八节
        {
                lcd_w_word("腊八节,喝粥啦!");
        }
        else if((month==1)&&(solar_term==1)&&(hour%2==0))//24节气——小寒
        {
                lcd_w_word("    今日小寒    ");
        }
        else if((month==1)&&(solar_term==2)&&(hour%2==0))//24节气——大寒
        {
                lcd_w_word("    今日大寒    ");
        }
        //2月
        else if((month_n==12)&&(day_n==23)&&(hour%2==0))//小年
        {
                lcd_w_word("    过小年啦    ");
        }
        else if((month_n==12)&&(day_n==29)&&(month_n_moonday==0)&&(hour%2==0))//年二十九
        {
                lcd_w_word("    过年啦!    ");
        }
        else if((month_n==12)&&(day_n==30)&&(hour%2==0))//除夕
        {
                lcd_w_word("大年三十,过年啦");
        }
        else if((month_n==1)&&(day_n==1)&&(hour%2==0))//春节(正月初一)
        {
                lcd_w_word("    新年好!    ");
        }
        else if((month_n==1)&&(day_n==15)&&(hour%2==0))//元宵节
        {
                lcd_w_word("  元宵节快乐!  ");
        }
        else if((month==2)&&(day==14)&&(hour%2==0))//西方情人节
        {
                lcd_w_word("  西方情人节!  ");
        }
        else if((month==2)&&(solar_term==3)&&(hour%2==0))//24节气——立春
        {
                lcd_w_word("    今日立春    ");
        }
        else if((month==2)&&(solar_term==4)&&(hour%2==0))//24节气——雨水
        {
                lcd_w_word("    今日雨水    ");
        }
        //3月
        else if((month_n==2)&&(day_n==2)&&(hour%2==0))//龙抬头
        {
                lcd_w_word("  二月二龙抬头  ");
        }
        else if((month==3)&&(day==8)&&(hour%2==0))//妇女节
        {
                lcd_w_word("  女性半边天!  ");
        }
        else if((month==3)&&(day==12)&&(hour%2==0))//植树节
        {
                lcd_w_word("  今日植树节!  ");
        }
        else if((month==3)&&(day==15)&&(hour%2==0))//消费者权益日
        {
                lcd_w_word("  消费者权益日  ");
        }
        else if((month==3)&&(solar_term==5)&&(hour%2==0))//24节气——惊蛰
        {
                lcd_w_word("    今日惊蛰    ");
        }
        else if((month==3)&&(solar_term==6)&&(hour%2==0))//24节气——春分
        {
                lcd_w_word("    今日春分    ");
        }
        //4月
        else if((month==4)&&(day==1)&&(hour%2==0))//西方愚人节
        {
                lcd_w_word("  西方愚人节!  ");
        }
        else if((month==4)&&(day==5)&&(hour%2==0))//清明节
        {
                lcd_w_word("  今日清明节!  ");
        }
        else if((month==4)&&(day==22)&&(hour%2==0))//地球日
        {
                lcd_w_word("  世界地球日!  ");
        }
        else if((month==4)&&(solar_term==8)&&(hour%2==0))//24节气——谷雨
        {
                lcd_w_word("    今日谷雨    ");
        }
        //5月
        else if((month==5)&&(day==1)&&(hour%2==0))//五一劳动节
        {
                lcd_w_word("  劳动节休息啦  ");
        }
        else if((month==5)&&(day==4)&&(hour%2==0))//五四青年节
        {
                lcd_w_word("  五四青年节!  ");
        }
        else if((month==5)&&(day==mother_day)&&(hour%2==0))//母亲节
        {
                lcd_w_word("  西方母亲节!  ");
        }
        else if((month==5)&&(day==12)&&(hour%2==0))//护士节
        {
                lcd_w_word("白衣天使辛苦了!");
        }
        else if((month==5)&&(solar_term==9)&&(hour%2==0))//24节气——立夏
        {
                lcd_w_word("    今日立夏    ");
        }
        else if((month==5)&&(solar_term==10)&&(hour%2==0))//24节气——小满
        {
                lcd_w_word("    今日小满    ");
        }
        //6月
        else if((month==6)&&(day==1)&&(hour%2==0))//国际儿童节
        {
                lcd_w_word("小朋友们节日快乐");
        }
        else if((month==6)&&(day==5)&&(hour%2==0))//环境日
        {
                lcd_w_word("  世界环境日!  ");
        }
        else if((month_n==5)&&(day_n==5)&&(hour%2==0))//端午节
        {
                lcd_w_word("  端午节吃粽子  ");
        }
        else if((month==6)&&(day==father_day)&&(hour%2==0))//父亲节
        {
                lcd_w_word("  西方父亲节!  ");
        }
        else if((month==6)&&(solar_term==11)&&(hour%2==0))//24节气——芒种
        {
                lcd_w_word("    今日芒种    ");
        }
        else if((month==6)&&(solar_term==12)&&(hour%2==0))//24节气——夏至
        {
                lcd_w_word("    今日夏至    ");
        }
        //7月
        else if((month==7)&&(day==1)&&(hour%2==0))//建党节
        {
                lcd_w_word("  七一建党节!  ");
        }
        else if((month==7)&&(solar_term==13)&&(hour%2==0))//24节气——小暑
        {
                lcd_w_word("    今日小暑    ");
        }
        else if((month==7)&&(solar_term==14)&&(hour%2==0))//24节气——大暑
        {
                lcd_w_word("    今日大暑    ");
        }
        //8月
        else if((month==8)&&(day==1)&&(hour%2==0))//建军节
        {
                lcd_w_word("  八一建军节!  ");
        }
        else if((month_n==7)&&(day_n==7)&&(hour%2==0))//七夕情人节
        {
                lcd_w_word("  七夕情人节!  ");
        }
        else if((month==8)&&(solar_term==15)&&(hour%2==0))//24节气——立秋
        {
                lcd_w_word("    今日立秋    ");
        }
        else if((month==8)&&(solar_term==16)&&(hour%2==0))//24节气——处暑
        {
                lcd_w_word("    今日处暑    ");
        }
        //9月
        else if((month==9)&&(day==3)&&(hour%2==0))//抗战胜利日
        {
                lcd_w_word("  抗战胜利日!  ");
        }
        else if((month==9)&&(day==10)&&(hour%2==0))//教师节
        {
                lcd_w_word("  今日教师节!  ");
        }
        else if((month_n==8)&&(day_n==15)&&(hour%2==0))//中秋节
        {
                lcd_w_word("  欢度中秋佳节  ");
        }
        else if((month==9)&&(solar_term==17)&&(hour%2==0))//24节气——白露
        {
                lcd_w_word("    今日白露    ");
        }
        else if((month==9)&&(solar_term==18)&&(hour%2==0))//24节气——秋分
        {
                lcd_w_word("    今日秋分    ");
        }
        //10月
        else if((month==10)&&(day<=7)&&(hour%2==0))//国庆节
        {
                lcd_w_word("  国庆放假啦!  ");
        }
        else if((month_n==9)&&(day_n==9)&&(hour%2==0))//重阳节
        {
                lcd_w_word("  九九重阳节!  ");
        }
        else if((month==10)&&(solar_term==19)&&(hour%2==0))//24节气——寒露
        {
                lcd_w_word("    今日寒露    ");
        }
        else if((month==10)&&(solar_term==20)&&(hour%2==0))//24节气——霜降
        {
                lcd_w_word("    今日霜降    ");
        }
        //11月
        else if((month==11)&&(day==1)&&(hour%2==0))//万圣节
        {
                lcd_w_word("  西方万圣节!  ");
        }
        else if((month==11)&&(day==11)&&(hour%2==0))//光棍节
        {
                lcd_w_word("  光棍购物节!  ");
        }
        else if((month==11)&&(solar_term==21)&&(hour%2==0))//24节气——立冬
        {
                lcd_w_word("    今日立冬    ");
        }
        else if((month==11)&&(solar_term==22)&&(hour%2==0))//24节气——小雪
        {
                lcd_w_word("    今日小雪    ");
        }
        else if((month==11)&&(day==22)&&(hour%2==0))//感恩节
        {
                lcd_w_word("  西方感恩节!  ");
        }
        //12月
        else if((month==12)&&(day==1)&&(hour%2==0))//世界艾滋病日
        {
                lcd_w_word("  世界艾滋病日  ");
        }
        else if((month==12)&&(day==13)&&(hour%2==0))//国家公祭日
        {
                lcd_w_word("  国家公祭日!  ");
        }
        else if((month==12)&&(day==26)&&(hour%2==0))//毛泽东诞辰纪念日
        {
                lcd_w_word("毛泽东诞辰纪念日");
        }
        else if((month==12)&&(solar_term==23)&&(hour%2==0))//24节气——大雪
        {
                lcd_w_word("    今日大雪    ");
        }
        else if((month==12)&&(solar_term==24)&&(hour%2==0))//24节气——冬至
        {
                lcd_w_word("    今日冬至    ");
        }
        else if((month==12)&&(day==24)&&(hour%2==0))//平安夜
        {
                lcd_w_word("  西方平安夜!  ");
        }
        else if((month==12)&&(day==25)&&(hour%2==0))//圣诞节
        {
                lcd_w_word("  西方圣诞节!  ");
        }
        /******** 每天常规内容 ********/
        else if((hour>=6)&&(hour<=8))
        {
                lcd_w_word("★★早上好!★★");
        }
        else if((hour>=9)&&(hour<=11))
        {
                lcd_w_word("上午好▲▲多喝水");
        }
        else if((hour>=12)&&(hour<=13))
        {
                lcd_w_word("中午好◆◆休息亲");
        }
        else if((hour>=14)&&(hour<=17))
        {
                lcd_w_word("下午好▲▲多喝水");
        }
        else if((hour>=18)&&(hour<=20))
        {
                lcd_w_word("晚上好★★多运动");
        }
        else if((hour>=21)&&(hour<=23))
        {
                lcd_w_word("★★早点休息★★");
        }
        else if((hour>=00)&&(hour<=3))
        {
          lcd_w_word("▲▲夜已深了▲▲");
        }
        else if((hour>=4)&&(hour<=5))
        {
          lcd_w_word("  ◆◆凌晨◆◆  ");
        }
}
个人签名

~~高性价比APT32单片机/MCU~~

 
 
 

回复

180

帖子

0

TA的资源

一粒金砂(中级)

5
 
谢谢!学习了

点评

呵呵 欢迎交流!  详情 回复 发表于 2018-7-31 15:36
 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(中级)

6
 

呵呵 欢迎交流!
个人签名

~~高性价比APT32单片机/MCU~~

 
 
 

回复

326

帖子

1

TA的资源

一粒金砂(中级)

7
 
加个报时音上去

点评

可以有 V3.0版本怎么增加音乐闹铃、遥控控制等功能  详情 回复 发表于 2018-7-31 18:13
个人签名QQ:2213825928 语音芯片、模块。串口MP3芯片、模块 http://mk020.taobao.com
 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(中级)

8
 

可以有 V3.0版本怎么增加音乐闹铃、遥控控制等功能

点评

有现成的语音芯片,但我没有实际使用过。  详情 回复 发表于 2018-7-31 20:33
个人签名

~~高性价比APT32单片机/MCU~~

 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

9
 
henangongda-123 发表于 2018-7-31 18:13
可以有 V3.0版本怎么增加音乐闹铃、遥控控制等功能

有现成的语音芯片,但我没有实际使用过。

点评

嗯 我之前也有接触过 好几年前了 忘得差不多了 现在的插卡音箱都是这类方案,就是一个芯片,外面接几个电阻电容和按键、喇叭就可以用了  详情 回复 发表于 2018-8-1 08:03
 
 
 

回复

1903

帖子

0

TA的资源

版主

10
 
牛X啊,点个赞了

点评

谢谢!好几年没玩单片机了,还是学生时代自学的东西  详情 回复 发表于 2018-8-1 08:04
 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(中级)

11
 
hujj 发表于 2018-7-31 20:33
有现成的语音芯片,但我没有实际使用过。

嗯 我之前也有接触过 好几年前了 忘得差不多了  现在的插卡音箱都是这类方案,就是一个芯片,外面接几个电阻电容和按键、喇叭就可以用了
个人签名

~~高性价比APT32单片机/MCU~~

 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(中级)

12
 

谢谢!好几年没玩单片机了,还是学生时代自学的东西
个人签名

~~高性价比APT32单片机/MCU~~

 
 
 

回复

1903

帖子

0

TA的资源

版主

13
 
不错,大牛

点评

不牛 不牛 小萌新一枚  详情 回复 发表于 2018-8-1 13:34
 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(中级)

14
 

不牛 不牛 小萌新一枚
个人签名

~~高性价比APT32单片机/MCU~~

 
 
 

回复

1903

帖子

0

TA的资源

版主

15
 
谦虚啊,兄弟

点评

呵呵  详情 回复 发表于 2018-8-1 17:34
 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(中级)

16
 
个人签名

~~高性价比APT32单片机/MCU~~

 
 
 

回复

1903

帖子

0

TA的资源

版主

17
 
加油

点评

谢谢!  详情 回复 发表于 2018-8-2 12:34
 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(中级)

18
 

点评

顶下你的作品,楼主,看我面熟吗,哈哈  详情 回复 发表于 2018-8-2 15:18
个人签名

~~高性价比APT32单片机/MCU~~

 
 
 

回复

1903

帖子

0

TA的资源

版主

19
 
客气了
 
 
 

回复

527

帖子

0

TA的资源

五彩晶圆(中级)

20
 

顶下你的作品,楼主,看我面熟吗,哈哈

点评

有点 21ic  详情 回复 发表于 2018-8-2 16:00
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表