全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯

作者 : admin 本文共19535个字,预计阅读时间需要49分钟 发布时间: 2024-06-8 共3人阅读

 资料下载地址:全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯

这是旧版 退役拆解了

全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯插图

新版 

全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯插图(1)

与电路图所示 共设置4个按键 短按开关台灯 加减键调光 长按进入菜单

1.台灯 加入PCA PWM 调光
STC12C5A60S2的PCA PWM非常好用 设置简单无极调节 0-255可调 

全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯插图(2)

全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯插图(3)

全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯插图(4) 全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯插图(5)

全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯插图(6) 全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯插图(7)

设置
时钟字体 宋体 数码 创意 3种选择 默认 数码
按键灯 全亮模式 单点模式 2种选择 默认 全亮模式
背光 10秒 20秒 30秒 1分钟 2分钟 3分钟 可调 时间到自动关闭背光灯 默认30秒
按键声  默开
整点报时 起点6 7 8 9 10可调  止点18 19 20 21 22 23可调  默认 开 8时-21时  意思是8时到21时范围内报时 否则免打扰以上数据设置后保全到EEPROM 数据不会丢失 

全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯插图(8)

全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯插图(9) 下载前须知
固件版本在v7.1及以上可用

全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯插图(10)

部分程序

#include    //此文件中定义了单片机的一些特殊功能寄存器
#define uchar unsigned char //宏定义无符号字符形数据类型进行声明定义 定义名称uchar 所占位数8位 范围0~255
#define uint unsigned int   //宏定义无符号整形数据类型进行声明定义 定义名称uint 所占位数16位 范围0~65535
#include "Delay.h"         //全局通用延时头文件
#include "LCD_ks0108ZK.h"  //屏字库 适合ks0108控制器的12864屏/19264屏
#include "LCD_ks0108.h"    //屏驱动 适合ks0108控制器的12864屏/19264屏
#include "ds3231.h"        //ds3231时钟芯片驱动
#include "rqzh.h"          //日期转换
#include "dht11.h"         //DHT11湿度温度驱动
#include "STC12C5A60S2_EEPROM.h" //STC12C5A60S2内部存储驱动
/*按键与按键灯*/
sbit anjian1LED=P2^7;  //按键灯1
sbit anjian1=P2^6;     //台灯/设置按键
sbit anjian2LED=P2^5;  //按键灯2
sbit anjian2=P2^4;     //加按键
sbit anjian3LED=P2^3;  //按键灯3
sbit anjian3=P2^2;     //减按键
sbit anjian4LED=P2^1;  //按键灯4
sbit anjian4=P2^0;     //提出/关闭响铃按键
sbit fmq=P3^2;         //有源蜂鸣器
sbit beiguangLED=P3^3; //屏幕背光
bit taidengLED; //台灯开关变量 =1开灯 =0关灯
bit anjian1sf,anjian2_3sf,anjian4sf; //用于按键释放标记
bit qingpingsf;   //用于清屏释放标记
bit fb_shizwz,fb_nzwz,fb_szwz; //功能菜单页面下的"时钟""闹钟""设置"文字反白标记 =1反白 =0取消反白
bit fbs_nian,fbs_yue,fbs_ri,fbs_shi,fbs_fen,fbs_miao; //设置时钟时 年月日时分秒反白 =1反白 =0取消反白
bit nz1_kg,nz2_kg,nz1_xl,nz2_xl;  //闹钟1 闹钟2 开关变量 =1闹钟开 =0闹钟关  闹钟1 闹钟2 响铃变量 =1响铃 =0不响铃
bit fb_nz1_shi,fb_nz1_fen,fb_nz1_kg,fb_nz2_shi,fb_nz2_fen,fb_nz2_kg;      //设置闹钟时分开关反白 =1反白 =0取消反白
bit xianshiyemian; //显示页面变量 =0时钟页面 =1功能一级菜单页面
bit zdbs_kg,fb_zdbs_kg,zdbs;  //整点报时开关 =1开 =0关,反白整点报时开关   =1反白 =0取消反白
bit fb_zdbs_qd,fb_zdbs_zd; //整点报时 起点止点反白  =1反白 =0取消反白
bit fb_bgsc;  //背光时长反白 =1反白 =0取消反白
bit jdms,fb_jdms; //键灯模式变量 键灯模式反白  =1反白 =0取消反白
bit fb_shizhongzt; //时钟字体变量反白=1反白 =0取消反白
bit anjiansy_kg,fb_anjiansy; //按键声音开关 =1开 =0关  按键声音反白标志   =1反白 =0取消反白 按键声音释放
uchar LED_mun;    //台灯调光变量
uchar shizhongzt; //时钟字体变量
uchar shezhixx;  //设置选项变量
uchar zdbs_qd,zdbs_zd;   //整点报时允许范围 起点止点变量
uchar shezhiym;    //二级菜单页面 =0钟时设置页面 =1闹钟设置页面 =2设置页面
uchar anjianjsbl;  //按键计数变量 实现长按短按功能
uchar gncdym;      //功能菜单页面选项变量
uchar shizhongsz;  //时钟设置选项变量
uchar nz1_shi,nz1_fen,nz2_shi,nz2_fen,nz1_fen_Stop,nz2_fen_Stop; //闹钟1 闹钟2 变量
uchar naozhongsz;  //闹钟设置选项变量  
uchar pingbgjs,miaojs,miaomun,bgsc; //用于屏背光自动控制定时计数标志
uchar naozhonglx,anjians; //闹钟铃响计数变量   按键计数变量
/*按键功能函数*/
void anjiangn()
{
/*按键1台灯与功能按键 */
if(anjian1==0) //判断按键是否按下
{
if(jdms==1)anjian1LED=0; //按键灯1单点模式
if(xianshiyemian==0) //以下操作在时钟页面有效
{
if(anjianjsbl=20) //长按约大于3秒
{
if(qingpingsf==0)ClearDisplay(); //LCD清屏
xianshiyemian=1;  //进入功能菜单页面
qingpingsf=1;    //释放LCD清屏 防止一直清屏         
}
}
else  //xianshiyemian=1已进入功能菜单页面  以下操作在功能菜单页面有效
{        
if(anjian1sf==0) //给与限制条件 每次操作只允许运行一次
{
if(shezhiym==0) //功能菜单页面
{
switch(gncdym) //功能菜单页面选项变量
{
case 1:if(qingpingsf==0)ClearDisplay();shezhiym=1;qingpingsf=1;break;  //进入二级菜单时钟设置页面
case 2:if(qingpingsf==0)ClearDisplay();shezhiym=2;qingpingsf=1;break;  //进入二级菜单闹钟设置页面
case 3:if(qingpingsf==0)ClearDisplay();shezhiym=3;qingpingsf=1;break;  //进入二级菜单设置页面
}
}
else if(shezhiym==1) //进入二级菜单时钟设置页面
{
shizhongsz++; //时钟 秒分时日月年 设置选项变量
if(shizhongsz==7)shizhongsz=1;        
}
else if(shezhiym==2) //进入二级菜单闹钟设置页面
{
naozhongsz++; //闹钟1分时开关 闹钟2分时开关 设置选项变量
if(naozhongsz==7)naozhongsz=1;
}
else //进入二级菜单设置页面
{
shezhixx++;  //设置选项变量
if(shezhixx==8)shezhixx=1;
}
anjian1sf=1; //完成操作按键1释放 等待下一次执行
}                                 
}        
}
else  //短按开关台灯
{
if(xianshiyemian==0) //以下操作在时钟页面有效
{
if(anjianjsbl>0&&anjianjsbl<15)taidengLED=~taidengLED; //当时间小于约3秒 台灯开关
anjianjsbl=0;  //完成操作按键计数复位清零
}  
if(jdms==1)anjian1LED=1;   //松手关闭按键1灯
qingpingsf=0;  //完成操作清屏释放标记复位清零
anjian1sf=0;   //完成操作按键1释放标记复位清零
}
/*按键2加与按键3减按键*/
if(anjian2==0||anjian3==0) //判断按键是否按下
{
if(jdms==1)
{
if(anjian2==0)anjian2LED=0; //按键灯2单点模式
if(anjian3==0)anjian3LED=0; //按键灯3单点模式
}
if(xianshiyemian==0)
{
if(anjian2==0)
{
if(LED_mun10)LED_mun=LED_mun-5;  //台灯调光减
Delay_ms(10); //延时一段时间 如果还没松开 继续加减
}
}
else //以下操作在功能菜单页面有效
{
if(shezhiym==0) //功能菜单页面
{
if(anjian2_3sf==0) //给与限制条件 每次操作只允许运行一次
{
if(anjian2==0)if(gncdym1)gncdym=gncdym-1;else(gncdym=3); //功能菜单页面 功能菜单页面选项变量 --
anjian2_3sf=1; //完成操作按键释放
}
}
else if(shezhiym==1) //时钟设置页面
{
switch(shizhongsz)
{
case 1:if(anjian2==0)if(miao0)miao=miao-1;else(miao=59); //调整秒-1
Ds3231Init();  //停止时钟 调整时钟数据写入ds3231
Delay_ms(200); //延时一段时间 如果还没松开 继续加减
break;  
case 2:if(anjian2==0)if(fen0)fen=fen-1;else(fen=59); //调整分-1
Ds3231Init();  //停止时钟 调整时钟数据写入ds3231
Delay_ms(200); //延时一段时间 如果还没松开 继续加减
break;
case 3:if(anjian2==0)if(shi0)shi=shi-1;else(shi=23); //调整时-1
Ds3231Init();  //停止时钟 调整时钟数据写入ds3231
Delay_ms(200); //延时一段时间 如果还没松开 继续加减
break;
case 4:if(yue==2)
{
if(nian_r==0) //闰年
{
/*...如果是闰年2月只有29天.....*/
if(anjian2==0)if(ri1)ri=ri-1;else(ri=29);        //调整日-1
}
else //平年
{
/*....如果是平年2月只有28天.....*/
if(anjian2==0)if(ri1)ri=ri-1;else(ri=28);        //调整日-1
}
}
else
{
if(yue_dx==0) //大月
{
/*1,3,5,7,8,10,12月有31天 为大月*/
if(anjian2==0)if(ri1)ri=ri-1;else(ri=31); //调整日-1
}
else //小月
{     /*4,6,9,11月只有30天 为小月*/
if(anjian2==0)if(ri1)ri=ri-1;else(ri=30);        //调整日-1
}
}
rilijs();      //日历自动计算函数
Ds3231Init();  //停止时钟 调整时钟数据写入ds3231
Delay_ms(200); //延时一段时间 如果还没松开 继续加减
break;
case 5:if(anjian2==0)if(yue1)yue=yue-1;else(yue=12); //调整月-1
rilijs();      //日历自动计算函数
Ds3231Init();  //停止时钟 调整时钟数据写入ds3231
Delay_ms(200); //延时一段时间 如果还没松开 继续加减
break;               
case 6:if(anjian2==0)if(nian0)nian=nian-1;else(nian=99); //调整年-1
rilijs();      //日历自动计算函数
Ds3231Init();  //停止时钟 调整时钟数据写入ds3231
Delay_ms(200); //延时一段时间 如果还没松开 继续加减
break;         
}
}
else if(shezhiym==2) //闹钟设置页面
{
switch(naozhongsz)
{
case 1:if(anjian2==0)nz1_kg=1; //调整闹钟1开
if(anjian3==0)nz1_kg=0; //调整闹钟1关
break;
case 2:if(anjian2==0)if(nz1_fen0)nz1_fen=nz1_fen-1;else(nz1_fen=59); //调整闹钟1分-
Delay_ms(200); //延时一段时间 如果还没松开 继续加减
break;        
case 3:if(anjian2==0)if(nz1_shi0)nz1_shi=nz1_shi-1;else(nz1_shi=23); //调整闹钟1时-
Delay_ms(200); //延时一段时间 如果还没松开 继续加减
break;        
case 4:if(anjian2==0)nz2_kg=1; //调整闹钟2开
if(anjian3==0)nz2_kg=0; //调整闹钟2关
break;
case 5:if(anjian2==0)if(nz2_fen0)nz2_fen=nz2_fen-1;else(nz2_fen=59); //调整闹钟2分-
Delay_ms(200); //延时一段时间 如果还没松开 继续加减
break;        
case 6:if(anjian2==0)if(nz2_shi0)nz2_shi=nz2_shi-1;else(nz2_shi=23); //调整闹钟2时-
Delay_ms(200); //延时一段时间 如果还没松开 继续加减
break;                                       
}   
}
else //设置选项页面
{
switch(shezhixx)
{
/*时钟字体设置*/
case 1:if(anjian2==0)
{
if(anjian2_3sf==0) //给与限制条件 每次操作只允许运行一次
{
if(shizhongzt0)shizhongzt=shizhongzt-1;else(shizhongzt=2); //时钟字体选项-
anjian2_3sf=1; //完成操作按键释放
}
}
break;
/*键灯模式设置*/
case 2:if(anjian2==0)jdms=1; //单点模式
if(anjian3==0)jdms=0; //全亮模式
break;
/*背光时长设置*/
case 3:if(anjian2==0)
{
if(anjian2_3sf==0) //给与限制条件 每次操作只允许运行一次
{
if(bgsc0)bgsc=bgsc-1;else(bgsc=5); //时钟字体选项-
anjian2_3sf=1; //完成操作按键释放
}
}
break;
/*按键声音设置*/
case 4:if(anjian2==0)anjiansy_kg=1; //按键声音开
if(anjian3==0)anjiansy_kg=0; //按键声音关
break;
/*整点报时声音设置*/
/*允许时间 起点6-11可调  止点18-23可调*/
case 5:if(anjian2==0)zdbs_kg=1; //整点报时开
if(anjian3==0)zdbs_kg=0; //整点报时关
break;
case 6:if(anjian2==0)if(zdbs_qd6)zdbs_qd=zdbs_qd-1;//调整整点报时起点-
Delay_ms(200); //延时一段时间 如果还没松开 继续加减
break;        
case 7:if(anjian2==0)if(zdbs_zd18)zdbs_zd=zdbs_zd-1;//调整整点报时止点-
Delay_ms(200); //延时一段时间 如果还没松开 继续加减
break;
}
}
}                 
}
else
{
if(jdms==1)
{
anjian2LED=1;   //松手关闭按键2灯
anjian3LED=1;   //松手关闭按键3灯
}
anjian2_3sf=0; //完成操作按键2与按键3释放标记复位清零 等待下一次执行
}
/*按键4返回与关闭响铃按键*/
if(anjian4==0) //判断按键是否按下
{
if(jdms==1)anjian4LED=0; //按键灯4单点模式
if(anjian4sf==0) //给与限制条件 每次操作只允许运行一次
{   
if(xianshiyemian==0) //在时钟页面中操作
{
if(nz1_xl==1||nz2_xl==1) //闹钟1或者2正在响铃时
{
nz1_xl=0;  //按下关闭闹钟1响铃
nz2_xl=0;  //按下关闭闹钟2响铃
}
}
else  //在功能菜单页面中操作
{
if(shezhiym==0) //返回时钟页面处理
{
/*返回时钟页面前操作*/
fb_shizwz=0;    //时钟文字取消反白
fb_nzwz=0;      //闹钟文字取消反白
fb_szwz=0;      //设置文字取消反白
gncdym=0;       //功能菜单页面选项变量复位清零
ClearDisplay(); //LCD清屏
/*完成操作*/
xianshiyemian=0; //返回时钟页面
}
else  //返回功能菜单页面处理
{
/*返回功能菜单页面前操作*/
if(shezhiym==1&&shizhongsz!=0)shizhongsz=0;   //在退出时钟设置选项变量复位清零
if((shezhiym==2&&naozhongsz!=0)||(shezhiym==3&&shezhixx!=0)) //在退出闹钟设置与设置选项页面前 把设置好的数据保存到EEPROM1扇区
{
IapEraseSector(EEPROM_0);         //EEPROM_1扇区擦除 地址0x0000-0x01ff
IapProgramByte(EEPROM_0,nz1_kg);  //存储闹钟1开关状态到EEPROM_0 地址0x0000
IapProgramByte(EEPROM_1,nz1_fen); //存储闹钟1分到EEPROM_1 地址0x0001
IapProgramByte(EEPROM_2,nz1_shi); //存储闹钟1时到EEPROM_2 地址0x0002
IapProgramByte(EEPROM_3,nz2_kg);  //存储闹钟2开关状态到EEPROM_3 地址0x0003
IapProgramByte(EEPROM_4,nz2_fen); //存储闹钟2分到EEPROM_4 地址0x0004
IapProgramByte(EEPROM_5,nz2_shi); //存储闹钟2时到EEPROM_5 地址0x0005
IapProgramByte(EEPROM_6,shizhongzt);    //存储时钟字体到EEPROM_6 地址0x0006
IapProgramByte(EEPROM_7,jdms);          //存储键灯模式到EEPROM_7 地址0x0007
IapProgramByte(EEPROM_8,bgsc);          //存储背光时长到EEPROM_8 地址0x0008
IapProgramByte(EEPROM_9,anjiansy_kg);   //存储按键声音到EEPROM_9 地址0x0009
IapProgramByte(EEPROM_0a,zdbs_kg);      //存储整点报时开关到EEPROM_0a 地址0x000a
IapProgramByte(EEPROM_0b,zdbs_qd);      //存储整点报时起点到EEPROM_0b 地址0x000b
IapProgramByte(EEPROM_0c,zdbs_zd);      //存储整点报时止点到EEPROM_0c 地址0x000c
naozhongsz=0;   //闹钟设置选项变量复位清零
shezhixx=0; //设置选项变量复位清零
}
ClearDisplay(); //LCD清屏
/*完成操作*/
shezhiym=0; //返回功能菜单页面  
}
}
anjian4sf=1;  //完成操作按键4释放
}
}
else
{
anjian4sf=0; //完成操作按键4释放标记复位清零 等待下一次执行
if(jdms==1)anjian4LED=1;
}
}
/*EEPROM读出初始化*/
void EEPROM_AInit()
{
/*方式一*/
/*从未擦写个的EEPROM数据是空白的 读出也是错误的!*/
/*需要判断EEPROM==0xff数据空白 如果数据是空白跳过EEPROM读出*/
if(IapReadByte(EEPROM_0)!=0xff)nz1_kg=IapReadByte(EEPROM_0);  //读出EEPROM_0 闹钟1开关状态 地址0x0000
if(IapReadByte(EEPROM_1)!=0xff)nz1_fen=IapReadByte(EEPROM_1); //读出EEPROM_1 闹钟1分数据 地址0x0001
if(IapReadByte(EEPROM_2)!=0xff)nz1_shi=IapReadByte(EEPROM_2); //读出EEPROM_2 闹钟1时数据 地址0x0002
if(IapReadByte(EEPROM_3)!=0xff)nz2_kg=IapReadByte(EEPROM_3);  //读出EEPROM_3 闹钟2开关状态 地址0x0003
if(IapReadByte(EEPROM_4)!=0xff)nz2_fen=IapReadByte(EEPROM_4); //读出EEPROM_4 闹钟2分数据 地址0x0004
if(IapReadByte(EEPROM_5)!=0xff)nz2_shi=IapReadByte(EEPROM_5); //读出EEPROM_5 闹钟1时数据 地址0x0005
/*方式二*/
/*从未擦写个的EEPROM数据是空白 需要变量重新初始化 也可以做为出厂默认*/
/*用户自行设置后出厂默认会直接跳过*/
shizhongzt=IapReadByte(EEPROM_6);             //读出EEPROM_6 时钟字体状态 地址0x0006
if(IapReadByte(EEPROM_6)==0xff)shizhongzt=1;  //判断时钟字体数据是否空白 如果空白重新初始化 默认数码字体 否则数据不是空白直接跳过
jdms=IapReadByte(EEPROM_7);             //读出EEPROM_7 键灯模式状态 地址0x0007
if(IapReadByte(EEPROM_7)==0xff)jdms=0;  //判断键灯模式数据是否空白 如果空白重新初始化 默认全亮 否则数据不是空白直接跳过
bgsc=IapReadByte(EEPROM_8);             //读出EEPROM_8 背光时长状态 地址0x0008
if(IapReadByte(EEPROM_8)==0xff)bgsc=2;  //判断背光时长数据是否空白 如果空白重新初始化 默认30秒 否则数据不是空白直接跳过
anjiansy_kg=IapReadByte(EEPROM_9);             //读出EEPROM_9 按键声音开关状态 地址0x0009
if(IapReadByte(EEPROM_9)==0xff)anjiansy_kg=1;  //判断按键声音数据是否空白 如果空白重新初始化 默认开 否则数据不是空白直接跳过
zdbs_kg=IapReadByte(EEPROM_0a);             //读出EEPROM_0a 整点报时开关状态 地址0x000a
if(IapReadByte(EEPROM_0a)==0xff)zdbs_kg=1;  //判断整点报时开关数据是否空白 如果空白重新初始化 默认开 否则数据不是空白直接跳过
zdbs_qd=IapReadByte(EEPROM_0b);             //读出EEPROM_0b 整点报时开关状态 地址0x000b
if(IapReadByte(EEPROM_0b)==0xff)zdbs_qd=8;  //判断整点报时起点数据是否空白 如果空白重新初始化 默认起点8时 否则数据不是空白直接跳过
zdbs_zd=IapReadByte(EEPROM_0c);             //读出EEPROM_0c 整点报时开关状态 地址0x000c
if(IapReadByte(EEPROM_0c)==0xff)zdbs_zd=21;  //判断整点报时止点数据是否空白 如果空白重新初始化 默认止点21时 否则数据不是空白直接跳过
}
/*背光时长 作为开机设置*/
void beiguangsc()
{
switch(bgsc)
{
case 0:miaomun=10;break;   //10秒设置
case 1:miaomun=20;break;   //20秒设置
case 2:miaomun=30;break;   //30秒设置
case 3:miaomun=60;break;   //1分钟设置
case 4:miaomun=120;break;  //2分钟设置
case 5:miaomun=180;break;  //3分钟设置
}
}
/*背光控制*/
void beiguangkz()
{
if(taidengLED==1||anjian1==0||anjian2==0||anjian3==0||anjian4==0||nz1_xl==1||nz2_xl==1) //背光跟随台灯 如果台灯开着 那么背光就一直亮 与任意键开屏背光
{
beiguangLED=0;  //开背光
TR0=0;          //关闭定时器0
pingbgjs=0;     //定时计数清零
miaojs=0;                    //定时计数清零
}
else  //否则台灯关闭下或者没有按键操作下
{
if(beiguangLED==0)TR0=1;  // 打开定时器0 开始定时器计时
else  //时间到了 背光关闭后
{
TR0=0;      //关闭定时器0
pingbgjs=0; //定时计数清零
miaojs=0;   //定时计数清零
}        
}
}
/*键灯全亮模式  .....单点模式放在按键里操作*/
void jiandengmoshi()
{
if(beiguangLED==0) //键灯跟随背光 背光开键灯亮 背光关键灯灭
{
if(jdms==0) //如果是全亮模式
{                        
anjian1LED=0; //按键灯1亮
anjian2LED=0; //按键灯2亮
anjian3LED=0; //按键灯3亮
anjian4LED=0; //按键灯4亮
}
}
else //如果背光关了 按键灯也跟着关闭
{
anjian1LED=1; //按键灯1灭
anjian2LED=1; //按键灯2灭
anjian3LED=1; //按键灯3灭
anjian4LED=1; //按键灯4灭
}
}
/*DS3231时钟初始化*/
void DS3231_szcqh()
{        
uint niana;
Ds3231ReadTime();  //读取ds3231时间数据
niana=nian+2000;
if(niana=zdbs_qd&&shi=0&&miao=30&&miao=0&&miao=30&&miao=0&&miao=30&&miao=0&&miao=20&&miao=40&&miao=0&&miao=20&&miao=40&&miao=0&&miao=20&&miao=40&&miao=0&&miao=15&&miao=30&&miao=45&&miao=0&&miao=5&&miao=10&&miao=15&&miao<20)
{
Disp_16x16(9,0,0,ZM5_16x16[0]);        
Disp_16x16(10,0,0,ZM5_16x16[0]);
Disp_16x16(11,0,0,ZM5_16x16[0]);
}
else
{
Disp_16x16(9,0,0,ZM5_16x16[1]);
Disp_16x16(10,0,0,ZM5_16x16[2]);
Disp_16x16(11,0,0,ZM5_16x16[3]);
}
}
else      //有闹钟铃响 则显示当前闹钟
{
if(nz1_xl==1)
{
Disp_8x16(18,0,0,ZM1_8x16[nz1_shi/10]);   //
Disp_8x16(19,0,0,ZM1_8x16[nz1_shi%10]);  //闹钟1时
Disp_8x16(20,0,0,ZM1_8x16[11]);                   //:
Disp_8x16(21,0,0,ZM1_8x16[nz1_fen/10]);  //
Disp_8x16(22,0,0,ZM1_8x16[nz1_fen%10]);  //闹钟1分
Disp_8x16(23,0,0,ZM1_8x16[12]);
}
if(nz2_xl==1)
{
Disp_8x16(18,0,0,ZM1_8x16[nz2_shi/10]);   //
Disp_8x16(19,0,0,ZM1_8x16[nz2_shi%10]);  //闹钟2时
Disp_8x16(20,0,0,ZM1_8x16[11]);                   //:
Disp_8x16(21,0,0,ZM1_8x16[nz2_fen/10]);  //
Disp_8x16(22,0,0,ZM1_8x16[nz2_fen%10]);  //闹钟2分
Disp_8x16(23,0,0,ZM1_8x16[12]);
}
}
}
else//xianshiyemian=1已进入功能菜单页面
{
if(nz1_xl==1||nz2_xl==1) //如果已进入功能菜单页面 则强行关闭闹钟响铃
{
nz1_xl=0;
nz2_xl=0;
}
if(shezhiym==0) //功能菜单页面
{
Ds3231ReadTime(); //不在时钟设置下运行时钟数据
Disp_64x48(0,0,0,ZM_64x48[0]);  //显示时钟图标
Disp_64x48(1,0,0,ZM_64x48[1]);  //显示闹钟图标
Disp_64x48(2,0,0,ZM_64x48[2]);  //显示设置图标
if(gncdym==1)fb_shizwz=1;else(fb_shizwz=0); //=1反白 =0取消反白
Disp_16x16(1,3,fb_shizwz,ZM5_16x16[10]);     //显示文字"时"
Disp_16x16(2,3,fb_shizwz,ZM5_16x16[12]);     //显示文字"钟"
if(gncdym==2)fb_nzwz=1;else(fb_nzwz=0);     //=1反白 =0取消反白
Disp_16x16(5,3,fb_nzwz,ZM5_16x16[11]);       //显示文字"闹"
Disp_16x16(6,3,fb_nzwz,ZM5_16x16[12]);       //显示文字"钟"
if(gncdym==3)fb_szwz=1;else(fb_szwz=0);     //=1反白 =0取消反白
Disp_16x16(9,3,fb_szwz,ZM5_16x16[13]);       //显示文字"设"
Disp_16x16(10,3,fb_szwz,ZM5_16x16[14]);      //显示文字"置"
}
else if(shezhiym==1) //shezhiym=0已进入时钟设置页面
{
//当进入时钟设置后 没按下加减键时钟依然保持运行
//否则按下加减键设置时钟生效 写入Ds3231时钟芯片 松开按键后恢复运行时钟数据
if(shizhongsz==0)Ds3231ReadTime(); //不在时钟设置下运行时钟数据
else
{
if(anjian2!=0&&anjian3!=0)Ds3231ReadTime(); //不在时钟设置下运行时钟数据
}
Disp_16x16(5,0,0,ZM5_16x16[10]);   //显示文字"时"
Disp_16x16(6,0,0,ZM5_16x16[12]);   //显示文字"钟"
Disp_16x16(2,2,0,ZM5_16x16[15]);   //显示文字"时"
Disp_16x16(3,2,0,ZM5_16x16[16]);   //显示文字"间"
Disp_16x16(2,3,0,ZM5_16x16[17]);   //显示文字"日"
Disp_16x16(3,3,0,ZM5_16x16[18]);   //显示文字"期"
if(shizhongsz==3)fbs_shi=1;else(fbs_shi=0);   //=1反白 =0取消反白
Disp_8x16(9,2,fbs_shi,ZM1_8x16[shi/10]);      //
Disp_8x16(10,2,fbs_shi,ZM1_8x16[shi%10]);     //时
Disp_8x16(11,2,0,ZM1_8x16[11]);               //:
if(shizhongsz==2)fbs_fen=1;else(fbs_fen=0);   //=1反白 =0取消反白
Disp_8x16(12,2,fbs_fen,ZM1_8x16[fen/10]);     //
Disp_8x16(13,2,fbs_fen,ZM1_8x16[fen%10]);     //分
Disp_8x16(14,2,0,ZM1_8x16[11]);               //:
if(shizhongsz==1)fbs_miao=1;else(fbs_miao=0); //=1反白 =0取消反白
Disp_8x16(15,2,fbs_miao,ZM1_8x16[miao/10]);   //
Disp_8x16(16,2,fbs_miao,ZM1_8x16[miao%10]);   //秒*/
if(shizhongsz==6)fbs_nian=1;else(fbs_nian=0); //=1反白 =0取消反白
Disp_8x16(9,3,fbs_nian,ZM1_8x16[2]);          //
Disp_8x16(10,3,fbs_nian,ZM1_8x16[0]);         //
Disp_8x16(11,3,fbs_nian,ZM1_8x16[nian/10]);   //
Disp_8x16(12,3,fbs_nian,ZM1_8x16[nian%10]);   //年
Disp_8x16(13,3,0,ZM1_8x16[10]);               //-
if(shizhongsz==5)fbs_yue=1;else(fbs_yue=0);   //=1反白 =0取消反白
Disp_8x16(14,3,fbs_yue,ZM1_8x16[yue/10]);     //
Disp_8x16(15,3,fbs_yue,ZM1_8x16[yue%10]);     //月
Disp_8x16(16,3,0,ZM1_8x16[10]);               //-
if(shizhongsz==4)fbs_ri=1;else(fbs_ri=0);     //=1反白 =0取消反白
Disp_8x16(17,3,fbs_ri,ZM1_8x16[ri/10]);       //
Disp_8x16(18,3,fbs_ri,ZM1_8x16[ri%10]);       //日
}
else if(shezhiym==2) //shezhiym=1已进入闹钟设置页面
{
Ds3231ReadTime(); //不在时钟设置下运行时钟数据
Disp_16x16(5,0,0,ZM5_16x16[11]);   //显示文字"闹"
Disp_16x16(6,0,0,ZM5_16x16[12]);   //显示文字"钟"
/*显示时钟*/
Disp_8x16(8,1,0,ZM1_8x16[shi/10]);     //
Disp_8x16(9,1,0,ZM1_8x16[shi%10]);     //时        
Disp_8x16(10,1,0,ZM1_8x16[11]);        //:
Disp_8x16(11,1,0,ZM1_8x16[fen/10]);    //
Disp_8x16(12,1,0,ZM1_8x16[fen%10]);    //分
Disp_8x16(13,1,0,ZM1_8x16[11]);        //:
Disp_8x16(14,1,0,ZM1_8x16[miao/10]);   //
Disp_8x16(15,1,0,ZM1_8x16[miao%10]);   //秒*/
/*闹钟1*/
Disp_16x16(2,2,0,ZM5_16x16[19]);   //显示文字"闹"
Disp_16x16(3,2,0,ZM5_16x16[20]);   //显示文字"钟"
Disp_8x16(8,2,0,ZM1_8x16[1]);     //显示数字"1"
if(naozhongsz==3)fb_nz1_shi=1;else(fb_nz1_shi=0);
Disp_8x16(10,2,fb_nz1_shi,ZM1_8x16[nz1_shi/10]);   //
Disp_8x16(11,2,fb_nz1_shi,ZM1_8x16[nz1_shi%10]);  //闹钟时
Disp_8x16(12,2,0,ZM1_8x16[11]);                   //:
if(naozhongsz==2)fb_nz1_fen=1;else(fb_nz1_fen=0);
Disp_8x16(13,2,fb_nz1_fen,ZM1_8x16[nz1_fen/10]);  //
Disp_8x16(14,2,fb_nz1_fen,ZM1_8x16[nz1_fen%10]);  //闹钟分
if(naozhongsz==1)fb_nz1_kg=1;else(fb_nz1_kg=0);
if(nz1_kg==1)Disp_16x16(8,2,fb_nz1_kg,ZM5_16x16[21]); //如果闹钟1打开 显示文字"开"
else Disp_16x16(8,2,fb_nz1_kg,ZM5_16x16[22]);  //如果闹钟1关闭 显示文字"关"
/*闹钟2*/
Disp_16x16(2,3,0,ZM5_16x16[19]);   //显示文字"闹"
Disp_16x16(3,3,0,ZM5_16x16[20]);   //显示文字"钟"
Disp_8x16(8,3,0,ZM1_8x16[2]);     //显示数字"2"
if(naozhongsz==6)fb_nz2_shi=1;else(fb_nz2_shi=0); //=1反白 =0取消反白
Disp_8x16(10,3,fb_nz2_shi,ZM1_8x16[nz2_shi/10]);  //
Disp_8x16(11,3,fb_nz2_shi,ZM1_8x16[nz2_shi%10]);  //闹钟时
Disp_8x16(12,3,0,ZM1_8x16[11]);                   //:
if(naozhongsz==5)fb_nz2_fen=1;else(fb_nz2_fen=0);  //=1反白 =0取消反白
Disp_8x16(13,3,fb_nz2_fen,ZM1_8x16[nz2_fen/10]);   //
Disp_8x16(14,3,fb_nz2_fen,ZM1_8x16[nz2_fen%10]);  //闹钟分
if(naozhongsz==4)fb_nz2_kg=1;else(fb_nz2_kg=0);        //=1反白 =0取消反白
if(nz2_kg==1)Disp_16x16(8,3,fb_nz2_kg,ZM5_16x16[21]); //如果闹钟2打开 显示文字"开"
else Disp_16x16(8,3,fb_nz2_kg,ZM5_16x16[22]);  //如果闹钟2关闭 显示文字"关"
}
else //shezhiym=2已进入设置页面
{
Ds3231ReadTime(); //不在时钟设置下运行时钟数据
Disp_16x16(5,0,0,ZM5_16x16[13]);   //显示文字"设"
Disp_16x16(6,0,0,ZM5_16x16[14]);   //显示文字"置"
/*时钟字体设置*/
Disp_16x16(0,1,0,ZM5_16x16[23]);   //显示文字"字"
Disp_16x16(1,1,0,ZM5_16x16[24]);   //显示文字"体"
Disp_16x16(2,1,0,ZM5_16x16[8]);   //显示单向箭头图标
if(shezhixx==1)fb_shizhongzt=1;else(fb_shizhongzt=0);//=1反白 =0取消反白
switch(shizhongzt)
{
case 0:Disp_16x16(3,1,fb_shizhongzt,ZM5_16x16[25]);Disp_16x16(4,1,fb_shizhongzt,ZM5_16x16[24]); break; //显示文字"宋体"
case 1:Disp_16x16(3,1,fb_shizhongzt,ZM5_16x16[26]);Disp_16x16(4,1,fb_shizhongzt,ZM5_16x16[27]);break;  //显示文字"数码"
case 2:Disp_16x16(3,1,fb_shizhongzt,ZM5_16x16[28]);Disp_16x16(4,1,fb_shizhongzt,ZM5_16x16[29]);break;  //显示文字"创意"
}
/*按键灯设置*/
Disp_16x16(7,1,0,ZM5_16x16[30]);   //显示文字"键"
Disp_16x16(8,1,0,ZM5_16x16[31]);   //显示文字"灯"
Disp_16x16(9,1,0,ZM5_16x16[8]);    //显示单向箭头图标
if(shezhixx==2)fb_jdms=1;else(fb_jdms=0); //=1反白 =0取消反白
if(jdms==0)
{
Disp_16x16(10,1,fb_jdms,ZM5_16x16[32]);   //显示文字"全"
Disp_16x16(11,1,fb_jdms,ZM5_16x16[33]);   //显示文字"亮"
}
else
{
Disp_16x16(10,1,fb_jdms,ZM5_16x16[34]);   //显示文字"单"
Disp_16x16(11,1,fb_jdms,ZM5_16x16[35]);   //显示文字"点"
}
/*背光时长*/
Disp_16x16(0,2,0,ZM5_16x16[36]);   //显示文字"背"
Disp_16x16(1,2,0,ZM5_16x16[37]);   //显示文字"光"
Disp_16x16(2,2,0,ZM5_16x16[8]);   //显示单向箭头图标
if(shezhixx==3)fb_bgsc=1;else(fb_bgsc=0); //=1反白 =0取消反白
switch(bgsc)
{
case 0:Disp_8x16(6,2,fb_bgsc,ZM1_8x16[1]);  //10秒设置
Disp_8x16(7,2,fb_bgsc,ZM1_8x16[0]);
Disp_16x16(4,2,0,ZM5_16x16[38]);
Disp_16x16(5,2,0,ZM5_16x16[20]);
miaomun=10;
break;
case 1:Disp_8x16(6,2,fb_bgsc,ZM1_8x16[2]);  //20秒设置
Disp_8x16(7,2,fb_bgsc,ZM1_8x16[0]);
Disp_16x16(4,2,0,ZM5_16x16[38]);
Disp_16x16(5,2,0,ZM5_16x16[20]);
miaomun=20;
break;
case 2:Disp_8x16(6,2,fb_bgsc,ZM1_8x16[3]);  //30秒设置
Disp_8x16(7,2,fb_bgsc,ZM1_8x16[0]);
Disp_16x16(4,2,0,ZM5_16x16[38]);
Disp_16x16(5,2,0,ZM5_16x16[20]);
miaomun=30;
break;
case 3:Disp_8x16(6,2,0,ZM1_8x16[12]);      //1分钟设置
Disp_8x16(7,2,fb_bgsc,ZM1_8x16[1]);
Disp_16x16(4,2,0,ZM5_16x16[39]);
Disp_16x16(5,2,0,ZM5_16x16[20]);
miaomun=60;
break;
case 4:Disp_8x16(6,2,0,ZM1_8x16[12]);      //2分钟设置
Disp_8x16(7,2,fb_bgsc,ZM1_8x16[2]);
Disp_16x16(4,2,0,ZM5_16x16[39]);
Disp_16x16(5,2,0,ZM5_16x16[20]);
miaomun=120;
break;
case 5:Disp_8x16(6,2,0,ZM1_8x16[12]);      //3分钟设置
Disp_8x16(7,2,fb_bgsc,ZM1_8x16[3]);
Disp_16x16(4,2,0,ZM5_16x16[39]);
Disp_16x16(5,2,0,ZM5_16x16[20]);
miaomun=180;
break;
}
/*按键声音*/
Disp_16x16(7,2,0,ZM5_16x16[30]);   //显示文字"键"
Disp_16x16(8,2,0,ZM5_16x16[40]);   //显示文字"声"
Disp_16x16(9,2,0,ZM5_16x16[8]);    //显示单向箭头图标
if(shezhixx==4)fb_anjiansy=1;else(fb_anjiansy=0); //=1反白 =0取消反白
if(anjiansy_kg==1)Disp_16x16(10,2,fb_anjiansy,ZM5_16x16[21]); //按键声音开
else Disp_16x16(10,2,fb_anjiansy,ZM5_16x16[22]); //按键声音开
/*整点报时*/
Disp_16x16(0,3,0,ZM5_16x16[41]);   //显示文字"报"
Disp_16x16(1,3,0,ZM5_16x16[15]);   //显示文字"时"
Disp_16x16(2,3,0,ZM5_16x16[8]);    //显示单向箭头图标
if(shezhixx==5)fb_zdbs_kg=1;else(fb_zdbs_kg=0); //=1反白 =0取消反白
if(zdbs_kg==1)Disp_16x16(3,3,fb_zdbs_kg,ZM5_16x16[21]);   //显示文字"开"
else Disp_16x16(3,3,fb_zdbs_kg,ZM5_16x16[22]);   //显示文字"关"
if(shezhixx==6)fb_zdbs_qd=1;else(fb_zdbs_qd=0); //=1反白 =0取消反白
Disp_8x16(10,3,fb_zdbs_qd,ZM1_8x16[zdbs_qd/10]);   //
Disp_8x16(11,3,fb_zdbs_qd,ZM1_8x16[zdbs_qd%10]);   //整点报时允许范围 起点
Disp_16x16(6,3,0,ZM5_16x16[9]);                    //显示双向箭头图标   
if(shezhixx==7)fb_zdbs_zd=1;else(fb_zdbs_zd=0); //=1反白 =0取消反白                                
Disp_8x16(14,3,fb_zdbs_zd,ZM1_8x16[zdbs_zd/10]);   //
Disp_8x16(15,3,fb_zdbs_zd,ZM1_8x16[zdbs_zd%10]);   //整点报时允许范围 止点
}        
}
}                 
}
/*定时器0函数*/
void Timer0() interrupt 1
{
TH0=0x0D1;
TL0=0x20;  //给定时器0赋初值,定时1ms
pingbgjs++;     //当背光打开时定时器开始计数 用于屏背光自动关闭控制
if(pingbgjs==84)
{
miaojs++;
if(miaojs==miaomun)
{
beiguangLED=1; //
TR0=0;         //关闭定时器0
}
pingbgjs=0;
}
}
/*定时器1函数*/
void Timer1() interrupt 3
{
TH1=0x0D1;
TL1=0x20;  //给定时器0赋初值,定时1ms        
/*按键短声*/
if(anjiansy_kg==1&&nz1_xl!=1&&nz2_xl!=1)
{
if(anjian1==0||anjian2==0||anjian3==0||anjian4==0)
{
if(anjians0&&anjians0&&naozhonglx5&&naozhonglx10&&naozhonglx15&&naozhonglx20&&naozhonglx<=25)fmq=0;         //第3声
else fmq=1;
}
}

本站无任何商业行为
个人在线分享 » 全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯
E-->