资料下载地址:全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯
这是旧版 退役拆解了
新版
与电路图所示 共设置4个按键 短按开关台灯 加减键调光 长按进入菜单
1.台灯 加入PCA PWM 调光
STC12C5A60S2的PCA PWM非常好用 设置简单无极调节 0-255可调
设置
时钟字体 宋体 数码 创意 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 数据不会丢失
下载前须知
固件版本在v7.1及以上可用
部分程序
#include <STC12C5A60S2.H> //此文件中定义了单片机的一些特殊功能寄存器
#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<=100)anjianjsbl++; //给按键计数变量设置最大范围值 范围内anjianjsbl++ 否则停止anjianjsbl++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_mun<255)LED_mun=LED_mun+5; //台灯调光加Delay_ms(10); //延时一段时间 如果还没松开 继续加减}if(anjian3==0){if(LED_mun>10)LED_mun=LED_mun-5; //台灯调光减Delay_ms(10); //延时一段时间 如果还没松开 继续加减}}else //以下操作在功能菜单页面有效{if(shezhiym==0) //功能菜单页面{if(anjian2_3sf==0) //给与限制条件 每次操作只允许运行一次{if(anjian2==0)if(gncdym<3)gncdym=gncdym+1;else(gncdym=1); //功能菜单页面 功能菜单页面选项变量 ++if(anjian3==0)if(gncdym>1)gncdym=gncdym-1;else(gncdym=3); //功能菜单页面 功能菜单页面选项变量 --anjian2_3sf=1; //完成操作按键释放}}else if(shezhiym==1) //时钟设置页面{switch(shizhongsz){case 1:if(anjian2==0)if(miao<59)miao=miao+1;else(miao=0); //调整秒+if(anjian3==0)if(miao>0)miao=miao-1;else(miao=59); //调整秒-1Ds3231Init(); //停止时钟 调整时钟数据写入ds3231Delay_ms(200); //延时一段时间 如果还没松开 继续加减break; case 2:if(anjian2==0)if(fen<59)fen=fen+1;else(fen=0); //调整分+if(anjian3==0)if(fen>0)fen=fen-1;else(fen=59); //调整分-1Ds3231Init(); //停止时钟 调整时钟数据写入ds3231Delay_ms(200); //延时一段时间 如果还没松开 继续加减break;case 3:if(anjian2==0)if(shi<23)shi=shi+1;else(shi=0); //调整时+1if(anjian3==0)if(shi>0)shi=shi-1;else(shi=23); //调整时-1Ds3231Init(); //停止时钟 调整时钟数据写入ds3231Delay_ms(200); //延时一段时间 如果还没松开 继续加减break;case 4:if(yue==2){if(nian_r==0) //闰年{/*...如果是闰年2月只有29天.....*/if(anjian2==0)if(ri<29)ri=ri+1;else(ri=1); //调整日+1if(anjian3==0)if(ri>1)ri=ri-1;else(ri=29); //调整日-1}else //平年{/*....如果是平年2月只有28天.....*/if(anjian2==0)if(ri<28)ri=ri+1;else(ri=1); //调整日+1if(anjian3==0)if(ri>1)ri=ri-1;else(ri=28); //调整日-1}}else{if(yue_dx==0) //大月{/*1,3,5,7,8,10,12月有31天 为大月*/if(anjian2==0)if(ri<31)ri=ri+1;else(ri=1); //调整日+1if(anjian3==0)if(ri>1)ri=ri-1;else(ri=31); //调整日-1}else //小月{ /*4,6,9,11月只有30天 为小月*/if(anjian2==0)if(ri<30)ri=ri+1;else(ri=1); //调整日+1if(anjian3==0)if(ri>1)ri=ri-1;else(ri=30); //调整日-1}}rilijs(); //日历自动计算函数Ds3231Init(); //停止时钟 调整时钟数据写入ds3231Delay_ms(200); //延时一段时间 如果还没松开 继续加减break;case 5:if(anjian2==0)if(yue<12)yue=yue+1;else(yue=1); //调整月+1if(anjian3==0)if(yue>1)yue=yue-1;else(yue=12); //调整月-1rilijs(); //日历自动计算函数Ds3231Init(); //停止时钟 调整时钟数据写入ds3231Delay_ms(200); //延时一段时间 如果还没松开 继续加减break; case 6:if(anjian2==0)if(nian<99)nian=nian+1;else(nian=0); //调整年+1if(anjian3==0)if(nian>0)nian=nian-1;else(nian=99); //调整年-1rilijs(); //日历自动计算函数Ds3231Init(); //停止时钟 调整时钟数据写入ds3231Delay_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_fen<59)nz1_fen=nz1_fen+1;else(nz1_fen=0); //调整闹钟1分+if(anjian3==0)if(nz1_fen>0)nz1_fen=nz1_fen-1;else(nz1_fen=59); //调整闹钟1分-Delay_ms(200); //延时一段时间 如果还没松开 继续加减break; case 3:if(anjian2==0)if(nz1_shi<23)nz1_shi=nz1_shi+1;else(nz1_shi=0); //调整闹钟1时+if(anjian3==0)if(nz1_shi>0)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_fen<59)nz2_fen=nz2_fen+1;else(nz2_fen=0); //调整闹钟2分+if(anjian3==0)if(nz2_fen>0)nz2_fen=nz2_fen-1;else(nz2_fen=59); //调整闹钟2分-Delay_ms(200); //延时一段时间 如果还没松开 继续加减break; case 6:if(anjian2==0)if(nz2_shi<23)nz2_shi=nz2_shi+1;else(nz2_shi=0); //调整闹钟2时+if(anjian3==0)if(nz2_shi>0)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(shizhongzt<2)shizhongzt=shizhongzt+1;else(shizhongzt=0); //时钟字体选项+anjian2_3sf=1; //完成操作按键释放}}if(anjian3==0){if(anjian2_3sf==0) //给与限制条件 每次操作只允许运行一次{if(shizhongzt>0)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(bgsc<5)bgsc=bgsc+1;else(bgsc=0); //时钟字体选项+anjian2_3sf=1; //完成操作按键释放}}if(anjian3==0){if(anjian2_3sf==0) //给与限制条件 每次操作只允许运行一次{if(bgsc>0)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_qd<11)zdbs_qd=zdbs_qd+1; //调整整点报时起点+if(anjian3==0)if(zdbs_qd>6)zdbs_qd=zdbs_qd-1;//调整整点报时起点-Delay_ms(200); //延时一段时间 如果还没松开 继续加减break; case 7:if(anjian2==0)if(zdbs_zd<23)zdbs_zd=zdbs_zd+1; //调整整点报时止点+if(anjian3==0)if(zdbs_zd>18)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-0x01ffIapProgramByte(EEPROM_0,nz1_kg); //存储闹钟1开关状态到EEPROM_0 地址0x0000IapProgramByte(EEPROM_1,nz1_fen); //存储闹钟1分到EEPROM_1 地址0x0001IapProgramByte(EEPROM_2,nz1_shi); //存储闹钟1时到EEPROM_2 地址0x0002IapProgramByte(EEPROM_3,nz2_kg); //存储闹钟2开关状态到EEPROM_3 地址0x0003IapProgramByte(EEPROM_4,nz2_fen); //存储闹钟2分到EEPROM_4 地址0x0004IapProgramByte(EEPROM_5,nz2_shi); //存储闹钟2时到EEPROM_5 地址0x0005IapProgramByte(EEPROM_6,shizhongzt); //存储时钟字体到EEPROM_6 地址0x0006IapProgramByte(EEPROM_7,jdms); //存储键灯模式到EEPROM_7 地址0x0007IapProgramByte(EEPROM_8,bgsc); //存储背光时长到EEPROM_8 地址0x0008IapProgramByte(EEPROM_9,anjiansy_kg); //存储按键声音到EEPROM_9 地址0x0009IapProgramByte(EEPROM_0a,zdbs_kg); //存储整点报时开关到EEPROM_0a 地址0x000aIapProgramByte(EEPROM_0b,zdbs_qd); //存储整点报时起点到EEPROM_0b 地址0x000bIapProgramByte(EEPROM_0c,zdbs_zd); //存储整点报时止点到EEPROM_0c 地址0x000cnaozhongsz=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开关状态 地址0x0000if(IapReadByte(EEPROM_1)!=0xff)nz1_fen=IapReadByte(EEPROM_1); //读出EEPROM_1 闹钟1分数据 地址0x0001if(IapReadByte(EEPROM_2)!=0xff)nz1_shi=IapReadByte(EEPROM_2); //读出EEPROM_2 闹钟1时数据 地址0x0002if(IapReadByte(EEPROM_3)!=0xff)nz2_kg=IapReadByte(EEPROM_3); //读出EEPROM_3 闹钟2开关状态 地址0x0003if(IapReadByte(EEPROM_4)!=0xff)nz2_fen=IapReadByte(EEPROM_4); //读出EEPROM_4 闹钟2分数据 地址0x0004if(IapReadByte(EEPROM_5)!=0xff)nz2_shi=IapReadByte(EEPROM_5); //读出EEPROM_5 闹钟1时数据 地址0x0005/*方式二*//*从未擦写个的EEPROM数据是空白 需要变量重新初始化 也可以做为出厂默认*//*用户自行设置后出厂默认会直接跳过*/shizhongzt=IapReadByte(EEPROM_6); //读出EEPROM_6 时钟字体状态 地址0x0006if(IapReadByte(EEPROM_6)==0xff)shizhongzt=1; //判断时钟字体数据是否空白 如果空白重新初始化 默认数码字体 否则数据不是空白直接跳过jdms=IapReadByte(EEPROM_7); //读出EEPROM_7 键灯模式状态 地址0x0007if(IapReadByte(EEPROM_7)==0xff)jdms=0; //判断键灯模式数据是否空白 如果空白重新初始化 默认全亮 否则数据不是空白直接跳过bgsc=IapReadByte(EEPROM_8); //读出EEPROM_8 背光时长状态 地址0x0008if(IapReadByte(EEPROM_8)==0xff)bgsc=2; //判断背光时长数据是否空白 如果空白重新初始化 默认30秒 否则数据不是空白直接跳过anjiansy_kg=IapReadByte(EEPROM_9); //读出EEPROM_9 按键声音开关状态 地址0x0009if(IapReadByte(EEPROM_9)==0xff)anjiansy_kg=1; //判断按键声音数据是否空白 如果空白重新初始化 默认开 否则数据不是空白直接跳过zdbs_kg=IapReadByte(EEPROM_0a); //读出EEPROM_0a 整点报时开关状态 地址0x000aif(IapReadByte(EEPROM_0a)==0xff)zdbs_kg=1; //判断整点报时开关数据是否空白 如果空白重新初始化 默认开 否则数据不是空白直接跳过zdbs_qd=IapReadByte(EEPROM_0b); //读出EEPROM_0b 整点报时开关状态 地址0x000bif(IapReadByte(EEPROM_0b)==0xff)zdbs_qd=8; //判断整点报时起点数据是否空白 如果空白重新初始化 默认起点8时 否则数据不是空白直接跳过zdbs_zd=IapReadByte(EEPROM_0c); //读出EEPROM_0c 整点报时开关状态 地址0x000cif(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; //关闭定时器0pingbgjs=0; //定时计数清零miaojs=0; //定时计数清零}else //否则台灯关闭下或者没有按键操作下{if(beiguangLED==0)TR0=1; // 打开定时器0 开始定时器计时else //时间到了 背光关闭后{TR0=0; //关闭定时器0pingbgjs=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<2020||yue==0||ri==0) //若读取的月日数据都为0则执行以下程序 否则直接跳过此程序{nian=22; //初始化年 22年yue=01; //初始化月 1月ri=01; //初始化日 1日zhou=06; //初始化周 周6shi=12; //初始化时 12时fen=00; //初始化分 00分miao=00; //初始化秒 00秒rilijs(); //日历自动计算函数Ds3231Init(); //把初始化好后的时间数据写入Ds3231时钟芯片}
}/*闹钟对比*/
void naozhong()
{if(nz1_kg==1||nz2_kg==1){/*闹钟开关图标显示*/if(nz1_kg==1&&nz2_kg==0)Disp_16x16(8,0,0,ZM5_16x16[5]); //如果闹钟1打开 显示闹钟1图标else if(nz1_kg==0&&nz2_kg==1)Disp_16x16(8,0,0,ZM5_16x16[6]); //如果闹钟2打开 显示闹钟2图标else if(nz1_kg==1&&nz2_kg==1)Disp_16x16(8,0,0,ZM5_16x16[7]); //如果闹钟1 闹钟2都打开 显示闹钟1/2图标else Disp_16x16(8,0,0,ZM5_16x16[0]); //否则如果闹钟1或闹钟2关闭 取消显示闹钟图标/*闹钟1对比*/if(nz1_kg==1) //如果闹钟1打开 开始闹钟对比{if(shi==nz1_shi&&fen==nz1_fen&&miao==0){nz1_fen_Stop=nz1_fen+30; //限制约束响铃时间条件变量 若不手动关闭响铃 30分后自动关闭响铃nz1_xl=1; //时间到闹钟1响铃}if(nz1_xl==1,shi==nz1_shi&&fen==nz1_fen_Stop)nz1_xl=0; //限制约束响铃时间到关闭响铃 最多只允许响铃30分钟}/*闹钟2对比*/if(nz2_kg==1) //如果闹钟1打开 开始闹钟对比{if(shi==nz2_shi&&fen==nz2_fen&&miao==0){nz2_fen_Stop=nz2_fen+30; //限制约束响铃时间条件变量 若不手动关闭响铃 30分后自动关闭响铃nz2_xl=1; //时间到闹钟2响铃}if(nz2_xl==1,shi==nz2_shi&&fen==nz2_fen_Stop)nz2_xl=0; //限制约束响铃时间到关闭响铃 最多只允许响铃30分钟}}
}/*整点报时*/
/*允许时间 起点6-11可调 止点18-23可调*/
/*在允许时间报时 否则不报时*/
/*例如:设置允许时间为8-21 可允许8时到21时内报时 */
void zhengdianbaoshi()
{if(zdbs_kg==1) //判断整点报时是否打开{if(shi>=zdbs_qd&&shi<=zdbs_zd) //判断报时时间是否在许可范围{if(fen==0&&miao==0) //如果时间=00分 =00秒 开启报时{if(nz1_xl!=1||nz2_xl!=1)zdbs=1; //闹钟响时不允许报时}else(zdbs=0); }}
}/*蜂鸣器协调 采用定时器1控制蜂鸣器响应时间与次数 包括闹钟闹钟铃响 整点报时声音 按键声音*/
void fmqxt()
{/*闹钟1与闹钟2蜂鸣器响铃程序 滴滴滴~ 3声*/if(zdbs==1||nz1_xl==1||nz2_xl==1||anjiansy_kg==1&&(anjian1==0||anjian2==0||anjian3==0||anjian4==0)){if(zdbs==1)fmq=0; //报时响声时长1秒 不需要定时器计数TR1=1; //开定时器1}else{fmq=1; //关闭响铃后 蜂鸣器停止响应TR1=0; //关定时器1naozhonglx=0;anjians=0;}
}/**********************************
*函数名称:PCA_Init(void)
*输入 :无
*输出 :无
*调用说明:外部调用
*函数说明:PWM模块初始化
***********************************/
void PCA_Init()
{CCON = 0; //PCA初始化CMOD = 0x00; //空闲时不计数,不产生中断,时钟源为Sysclk/12,PWM频率大约为4KHzCL = 0x00; //PCA低8位清零CH = 0x00; //PCA高8位清零CCAPM0 = 0x42; //8位PWM模式,无中断//CCAP0H = 0; //PWM0占空比(调节此处值调节PWM占空比 0~255)//CCAP0L = 0; //PWM0占空比(调节此处值调节PWM占空比0~255)CR = 1; //启动PCA计数器
}/*台灯控制程序*/
void taidengkz()
{if(taidengLED==1) //开台灯{CCAP0H=LED_mun; //LED_mun变量 10——255 范围可调CCAP0L=LED_mun; if(xianshiyemian==0){Disp_8x16(11,0,0,ZM_8x16[LED_mun%1000/100]);Disp_8x16(12,0,0,ZM_8x16[LED_mun%100/10]);Disp_8x16(13,0,0,ZM_8x16[LED_mun%10]);Disp_16x16(7,0,0,ZM5_16x16[4]); //如果台灯打开显示台灯图标}}else //关台灯{CCAP0H=0; //当CCAP0H=0时 已经关闭了CCAP0L=0;if(xianshiyemian==0){Disp_8x16(11,0,0,ZM_8x16[15]);Disp_8x16(12,0,0,ZM_8x16[15]);Disp_8x16(13,0,0,ZM_8x16[15]);Disp_16x16(7,0,0,ZM5_16x16[0]); //否则如果台灯关闭不显示台灯图标}}}/*主函数*/
void main()
{TMOD=0x11; //定时器0与定时器1打开TH0=0x0D1;TL0=0x20; //给定时器0赋初值,定时1msTH1=0x0D1;TL1=0x20; //给定时器1赋初值,定时1msET0=1; //打开定时器0中断允许TR0=1; //打开定时器0ET1=1; //打开定时器1中断允许//TR1=1; //打开定时器1EA=1; //打开总中断PCA_Init(); //PCA PWM初始化LED_mun=255; //默认台灯最亮DS3231_szcqh(); //DS3231时钟初始化beiguangLED=0; //刚通电屏背光开EEPROM_AInit(); //EEPROM读出初始化beiguangsc(); //开机读出背光时长LCD_AInit(); //LCD屏初始化ClearDisplay(); //LCD清屏while(1){fmqxt(); //运行蜂鸣器协调程序anjiangn(); //运行按键功能程序beiguangkz(); //运行背光控制程序jiandengmoshi(); //运行键灯全亮模式程序zhengdianbaoshi(); //运行整点报时程序taidengkz(); //运行台灯控制程序if(xianshiyemian==0) //xianshiyemian=0时钟页面{Ds3231ReadTime(); //不在时钟设置下运行时钟数据naozhong(); //运行闹钟对比 只允许在时间页面运行/*年月日显示*/Disp_8x16(0,0,0,ZM_8x16[2]); //Disp_8x16(1,0,0,ZM_8x16[0]); //Disp_8x16(2,0,0,ZM_8x16[nian/10]); //Disp_8x16(3,0,0,ZM_8x16[nian%10]); //年Disp_8x16(4,0,0,ZM_8x16[10]); //-Disp_8x16(5,0,0,ZM_8x16[yue/10]); //Disp_8x16(6,0,0,ZM_8x16[yue%10]); //月Disp_8x16(7,0,0,ZM_8x16[10]); //-Disp_8x16(8,0,0,ZM_8x16[ri/10]); //Disp_8x16(9,0,0,ZM_8x16[ri%10]); //日/*时分秒显示*/switch(shizhongzt) //时钟字体选择{case 0:Disp_16x32(0,8,0,ZM_16x32[shi/10]); // 宋体Disp_16x32(1,8,0,ZM_16x32[shi%10]); //时Disp_16x32(2,8,0,ZM_16x32[10]); //:Disp_16x32(3,8,0,ZM_16x32[fen/10]); //Disp_16x32(4,8,0,ZM_16x32[fen%10]); //分Disp_16x32(5,8,0,ZM_16x32[10]); //:Disp_16x32(6,8,0,ZM_16x32[miao/10]); //Disp_16x32(7,8,0,ZM_16x32[miao%10]); //秒*/break;case 1:Disp_16x32(0,8,0,ZM1_16x32[shi/10]); // 数码Disp_16x32(1,8,0,ZM1_16x32[shi%10]); //时Disp_16x32(2,8,0,ZM1_16x32[10]); //:Disp_16x32(3,8,0,ZM1_16x32[fen/10]); //Disp_16x32(4,8,0,ZM1_16x32[fen%10]); //分Disp_16x32(5,8,0,ZM1_16x32[10]); //:Disp_16x32(6,8,0,ZM1_16x32[miao/10]); //Disp_16x32(7,8,0,ZM1_16x32[miao%10]); //秒*/break;case 2:Disp_16x32(0,8,0,ZM2_16x32[shi/10]); // 创意Disp_16x32(1,8,0,ZM2_16x32[shi%10]); //时Disp_16x32(2,8,0,ZM2_16x32[10]); //:Disp_16x32(3,8,0,ZM2_16x32[fen/10]); //Disp_16x32(4,8,0,ZM2_16x32[fen%10]); //分Disp_16x32(5,8,0,ZM2_16x32[10]); //:Disp_16x32(6,8,0,ZM2_16x32[miao/10]); //Disp_16x32(7,8,0,ZM2_16x32[miao%10]); //秒*/break;}/*星期显示*/Disp_16x16(5,3,0,ZM_16x16[18]); //星Disp_16x16(6,3,0,ZM_16x16[19]); //期switch(zhou){case 1:Disp_16x16(7,3,0,ZM_16x16[1]);break; //星期一case 2:Disp_16x16(7,3,0,ZM_16x16[2]);break; //星期二case 3:Disp_16x16(7,3,0,ZM_16x16[3]);break; //星期三case 4:Disp_16x16(7,3,0,ZM_16x16[4]);break; //星期四case 5:Disp_16x16(7,3,0,ZM_16x16[5]);break; //星期五case 6:Disp_16x16(7,3,0,ZM_16x16[6]);break; //星期六case 7:Disp_16x16(7,3,0,ZM_16x16[17]);break; //星期天}nonglixs();//显示农历pingrunjs(); //闰年平年计算gljr(); //公历节日计算nonglijrjs(); //农历节日计算jiqijs(); //节气计算if(gljrjs!=0&&nljs==0&&jieqijs==0) //如果当天只有公历节日 轮番显示生肖公历节日显示 {if(miao>=0&&miao<30)shengxiaoxs(); //显示生肖及闰平年if(miao>=30&&miao<=59)gljxs(); //公历节日显示}else if(gljrjs==0&&nljs!=0&&jieqijs==0) //如果当天只有农历节日 轮番显示生肖农历节日{if(miao>=0&&miao<30)shengxiaoxs(); //显示生肖及闰平年if(miao>=30&&miao<=59)nonglijrxs(); //显示农历节日}else if(gljrjs==0&&nljs==0&&jieqijs!=0) //如果当天只有节气 轮番显示生肖节气{if(miao>=0&&miao<30)shengxiaoxs(); //显示生肖及闰平年if(miao>=30&&miao<=59)jieqixs(); //显示节气}else if(gljrjs!=0&&nljs!=0&&jieqijs==0) //如果当天同时有公历节日和农历节日 轮番显示生肖公历节日农历节日{if(miao>=0&&miao<20)shengxiaoxs(); //显示生肖及闰平年if(miao>=20&&miao<40)gljxs(); //显示公历节日if(miao>=40&&miao<=59)nonglijrxs(); //显示农历节日}else if(gljrjs!=0&&nljs==0&&jieqijs!=0) //如果当天同时有公历节日和节气 轮番显示生肖公历节日节气{if(miao>=0&&miao<20)shengxiaoxs(); //显示生肖及闰平年if(miao>=20&&miao<40)gljxs(); //显示公历节日if(miao>=40&&miao<=59)jieqixs(); //显示节气}else if(gljrjs==0&&nljs!=0&&jieqijs!=0) //如果当天同时有农历节日和节气 轮番显示生肖农历节日节气{if(miao>=0&&miao<20)shengxiaoxs(); //显示生肖及闰平年if(miao>=20&&miao<40)nonglijrxs(); //显示农历节日if(miao>=40&&miao<=59)jieqixs(); //显示节气}else if(jieqijs!=0&&nljs!=0&&gljrjs!=0) //如果当天同时有公历节日农历节日生肖 轮番显示生肖公历节日农历节日节气{if(miao>=0&&miao<15)shengxiaoxs(); //显示生肖及闰平年if(miao>=15&&miao<30)gljxs(); //公历节日显示if(miao>=30&&miao<45)nonglijrxs(); //农历节日显示if(miao>=45&&miao<=59)jieqixs(); //显示节气}else shengxiaoxs(); //如果没有其他节日只显示生肖及闰平年/*温湿度显示*/DHT11_receive(); //读取湿度温度函数Disp_8x16(18,1,0,ZM_8x16[11]);Disp_8x16(20,1,0,ZM_8x16[RH/10]); //湿度Disp_8x16(21,1,0,ZM_8x16[RH%10]);Disp_8x16(22,1,0,ZM_8x16[12]);Disp_8x16(18,2,0,ZM_8x16[13]);Disp_8x16(20,2,0,ZM_8x16[TH/10]); //温度Disp_8x16(21,2,0,ZM_8x16[TH%10]);Disp_8x16(22,2,0,ZM_8x16[14]); if(nz1_xl==0&&nz2_xl==0) //如果没有闹钟铃响 显示小动物{if(miao>=0&&miao<5){Disp_16x16(9,0,0,ZM5_16x16[1]); Disp_16x16(10,0,0,ZM5_16x16[0]);Disp_16x16(11,0,0,ZM5_16x16[0]);}else if(miao>=5&&miao<10){Disp_16x16(9,0,0,ZM5_16x16[0]);Disp_16x16(10,0,0,ZM5_16x16[2]);Disp_16x16(11,0,0,ZM5_16x16[0]);}else if(miao>=10&&miao<15){Disp_16x16(9,0,0,ZM5_16x16[0]);Disp_16x16(10,0,0,ZM5_16x16[0]);Disp_16x16(11,0,0,ZM5_16x16[3]);}else if(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赋初值,定时1mspingbgjs++; //当背光打开时定时器开始计数 用于屏背光自动关闭控制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(anjians<10)anjians++;if(anjians>0&&anjians<5)fmq=0;else fmq=1;}}/*闹钟响声 滴滴滴~ 3声*/if(nz1_xl==1||nz2_xl==1){naozhonglx++;if(naozhonglx==100)naozhonglx=0; //闹钟铃响计数变量if(naozhonglx>0&&naozhonglx<=5)fmq=0; //第1声else if(naozhonglx>5&&naozhonglx<=10)fmq=1;else if(naozhonglx>10&&naozhonglx<=15)fmq=0; //第2声else if(naozhonglx>15&&naozhonglx<=20)fmq=1;else if(naozhonglx>20&&naozhonglx<=25)fmq=0; //第3声else fmq=1;}
}