发新帖本帖赏金 11.00元(功能说明)我要提问
12下一页
返回列表
打印
[开源硬件]

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

[复制链接]
7342|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 (349.49 KB )

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

PCB设计文件.rar

720.35 KB

程序源代码.rar

177.79 KB

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

1014.3 KB

打赏榜单

21ic小喇叭 打赏了 10.00 元 2018-08-28

山东电子小菜鸟 打赏了 1.00 元 2018-08-01
理由:很棒

评论
henangongda123 2018-8-1 17:00 回复TA
@山东电子小菜鸟 :可以转载 请注明出处,哈哈 
henangongda123 2018-8-1 17:00 回复TA
@山东电子小菜鸟 :可以转载 请注明出处,哈哈 
山东电子小菜鸟 2018-8-1 16:49 回复TA
非常棒 可以转载吗 

相关帖子

沙发
小小电子爱好者| | 2018-7-30 20:28 | 只看该作者
哇塞!! 升级了   沙发围观

使用特权

评论回复
板凳
henangongda123|  楼主 | 2018-7-30 20:31 | 只看该作者
小小电子爱好者 发表于 2018-7-30 20:28
哇塞!! 升级了   沙发围观

以后有时间再升级到V3.0版,带无线RF遥控、音乐闹铃啥的,哈哈

使用特权

评论回复
地板
henangongda123|  楼主 | 2018-7-30 20:32 | 只看该作者
部分源代码展示:
/**********************************************************************
文件名: 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
};

使用特权

评论回复
5
henangongda123|  楼主 | 2018-7-30 20:34 | 只看该作者
/******* 系统时钟切换操作 *******/
/***********************************************************
函数名: 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));//读取一字节数据
}

/********* 定时器操作 **********/
/***********************************************************
函数名: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占空比
                }
        }
}

使用特权

评论回复
6
henangongda123|  楼主 | 2018-7-30 20:34 | 只看该作者
/********* 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);
}

使用特权

评论回复
7
henangongda123|  楼主 | 2018-7-30 20:35 | 只看该作者
/********* 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小小生日快乐!");
        }
        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("  ◆◆凌晨◆◆  ");
        }
}

使用特权

评论回复
8
zly1986ZLY| | 2018-8-2 11:26 | 只看该作者
厉害了,点赞!

使用特权

评论回复
9
henangongda123|  楼主 | 2018-8-2 12:29 | 只看该作者

使用特权

评论回复
10
电技| | 2018-8-4 18:40 | 只看该作者
不错

使用特权

评论回复
11
henangongda123|  楼主 | 2018-8-6 09:15 | 只看该作者

使用特权

评论回复
12
zjy.zz| | 2018-8-25 17:57 | 只看该作者
太强了,楼主方便留个qq吗,我们这些电子diy也可以加入向你学习一下

使用特权

评论回复
13
henangongda123|  楼主 | 2018-8-27 08:16 | 只看该作者
zjy.zz 发表于 2018-8-25 17:57
太强了,楼主方便留个qq吗,我们这些电子diy也可以加入向你学习一下

站内信吧

使用特权

评论回复
14
21ic小喇叭| | 2018-8-27 09:19 | 只看该作者
楼主就是DIY能人啊~

使用特权

评论回复
15
21ic小喇叭| | 2018-8-27 09:21 | 只看该作者
楼主就是DIY能人啊~

使用特权

评论回复
16
henangongda123|  楼主 | 2018-8-27 09:22 | 只看该作者
21ic小喇叭 发表于 2018-8-27 09:21
楼主就是DIY能人啊~

把你的名字、生日告诉我,我做一个送给你?
板子最近有所改动,改了封装,程序也做了完善。

使用特权

评论回复
17
Blueriderr| | 2018-8-27 11:27 | 只看该作者
谢谢分享

使用特权

评论回复
18
henangongda123|  楼主 | 2018-8-27 11:33 | 只看该作者

嗯,不客气!

使用特权

评论回复
19
hyh403| | 2018-8-27 15:00 | 只看该作者
     不错,实用性强。

使用特权

评论回复
20
henangongda123|  楼主 | 2018-8-27 15:54 | 只看该作者
hyh403 发表于 2018-8-27 15:00
不错,实用性强。

嗯 已经做了好几个赠送给亲朋好友,放在屋里,看时间、温湿度挺方便,晚上一开空调,湿度明显从70%多降到30%左右,而且湿度变化很快。

使用特权

评论回复
发新帖 本帖赏金 11.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

2116

帖子

19

粉丝