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

 资料下载地址:全新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); //调整秒-1
                                               Ds3231Init();  //停止时钟 调整时钟数据写入ds3231
                                   Delay_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); //调整分-1
                                               Ds3231Init();  //停止时钟 调整时钟数据写入ds3231
                                   Delay_ms(200); //延时一段时间 如果还没松开 继续加减
                                               break;
                                       
                                        case 3:if(anjian2==0)if(shi<23)shi=shi+1;else(shi=0);  //调整时+1
                                               if(anjian3==0)if(shi>0)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(ri<29)ri=ri+1;else(ri=1);        //调整日+1
                                                                                 if(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);        //调整日+1
                                                                                 if(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); //调整日+1
                                                                                 if(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);        //调整日+1
                                                                                 if(anjian3==0)if(ri>1)ri=ri-1;else(ri=30);        //调整日-1
                                                                         }
                                                                 }
                                                                 rilijs();      //日历自动计算函数
                                               Ds3231Init();  //停止时钟 调整时钟数据写入ds3231
                                   Delay_ms(200); //延时一段时间 如果还没松开 继续加减
                                               break;
                                                                 
                                        case 5:if(anjian2==0)if(yue<12)yue=yue+1;else(yue=1);         //调整月+1
                                               if(anjian3==0)if(yue>1)yue=yue-1;else(yue=12); //调整月-1
                                                                 rilijs();      //日历自动计算函数
                                               Ds3231Init();  //停止时钟 调整时钟数据写入ds3231
                                   Delay_ms(200); //延时一段时间 如果还没松开 继续加减
                                               break;               
                                                                 
          case 6:if(anjian2==0)if(nian<99)nian=nian+1;else(nian=0);  //调整年+1
                                               if(anjian3==0)if(nian>0)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_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-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<2020||yue==0||ri==0)  //若读取的月日数据都为0则执行以下程序 否则直接跳过此程序
  {
          nian=22;  //初始化年 22年
    yue=01;   //初始化月 1月
    ri=01;    //初始化日 1日
    zhou=06;  //初始化周 周6
    shi=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; //关定时器1
                        naozhonglx=0;
                        anjians=0;
                }
}

/**********************************
*函数名称:PCA_Init(void)
*输入    :无
*输出    :无
*调用说明:外部调用
*函数说明:PWM模块初始化
***********************************/
void PCA_Init()
{
        CCON = 0;                                //PCA初始化
        CMOD = 0x00;                        //空闲时不计数,不产生中断,时钟源为Sysclk/12,PWM频率大约为4KHz
        CL = 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赋初值,定时1ms
        TH1=0x0D1;
  TL1=0x20;       //给定时器1赋初值,定时1ms
  ET0=1;          //打开定时器0中断允许
  TR0=1;          //打开定时器0
        ET1=1;          //打开定时器1中断允许
  //TR1=1;          //打开定时器1
        EA=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赋初值,定时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(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;
        }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/678148.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文件夹突变解析:类型变文件的数据恢复与预防

在数字化时代&#xff0c;文件夹作为我们存储和组织数据的基本单元&#xff0c;其重要性不言而喻。然而&#xff0c;有时我们可能会遇到一种令人困惑的情况——文件夹的类型突然变为文件&#xff0c;导致无法正常访问其中的内容。这种现象不仅会影响我们的工作效率&#xff0c;…

如何把几个pdf文件合成在一个pdf文件

PDF合并&#xff0c;作为一种常见的文件处理方式&#xff0c;无论是在学术研究、工作汇报还是日常生活中&#xff0c;都有着广泛的应用。本文将详细介绍PDF合并的多种方法&#xff0c;帮助读者轻松掌握这一技能。 打开 “轻云处理pdf官网” 的网站&#xff0c;然后上传pdf。 pd…

dnf手游版游玩感悟

dnf手游于5月21号正式上线&#xff0c;作为一个dnf端游老玩家&#xff0c;并且偶尔上线ppk&#xff0c;自然下载了手游版&#xff0c;且玩了几天。 不得不说dnf手游的优化做到了极好的程度。 就玩法系统这块&#xff0c;因为dnf属于城镇地下城模式&#xff0c;相比…

神经网络是什么?有什么作用?

人工智能是当前的热门科技领域&#xff0c;在自动驾驶、金融服务、智能家居、零售和电商、工业制造、医疗领域、教育领域、交通领域、娱乐领域、能源管理、农业、航空航天等很多领域都有越来越多的应用。 发展人工智能&#xff0c;离不开算力&#xff08;芯片&#xff09;、算…

【Python】 Python装饰器的魔法:深入理解functools.wraps

基本原理 在Python中&#xff0c;装饰器是一种设计模式&#xff0c;用于修改或增强函数或方法的功能。functools.wraps是一个装饰器工厂&#xff0c;它用来帮助我们保持被装饰函数的元数据&#xff0c;比如函数的名字、文档字符串等。 当你创建一个装饰器时&#xff0c;你可能…

进口泰国榴莲注意事项 | 国际物流运输服务 | 箱讯科技

进口泰国榴莲&#xff0c;这个看似简单的行为背后其实隐藏着许多需要注意的细节和相关费用。下面小编带大家了解一下有哪些细节和费用需要注意。 01清关费用 进口泰国榴莲涉及的清关费用包括&#xff1a; 国外提货成本、港口服务费、报关手续费。 国际运输费&#xff0c;可能…

《幸福》期刊杂志投稿发表

《幸福》杂志是由国家新闻出版总署批准&#xff0c;武汉出版社主管&#xff0c;武汉市妇联和武汉出版社联合主办&#xff0c;面向全国发行的人文社科综合期刊。办刊宗旨&#xff1a;宣传普及科学知识及科学方法的研究&#xff1b;倡导新型的人际关系&#xff0c;推介健康的家庭…

Linux学习笔记8

介绍man命令 在Linux中&#xff0c;man命令用于查看系统手册页&#xff08;manual pages&#xff09;。系统手册页是关于各种Linux命令、函数库以及系统调用的详尽文档&#xff0c;能够提供关于命令的使用方法、参数说明、示例以及其他相关信息 可以利用man xxx的命令去查找某…

探索气象数据的多维度三维可视化:PM2.5、风速与高度分析

探索气象数据的多维度可视化&#xff1a;PM2.5、风速与高度分析 摘要 在现代气象学中&#xff0c;数据可视化是理解复杂气象模式和趋势的关键工具。本文将介绍一种先进的数据可视化技术&#xff0c;它能够将PM2.5浓度、风速和高度等多维度数据以直观和动态的方式展现出来。 …

Facebook与AI:探索人工智能在社交平台上的应用

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;社交媒体平台正利用这些先进技术为用户提供更为个性化和高效的体验。作为全球最大的社交媒体平台之一&#xff0c;Facebook在AI应用领域的探索和实践尤为引人注目。本文将深入探讨Facebook如何在其平台上应用…

23-通过JS代码处理click失效问题

有时候按钮元素已经定位到了&#xff0c;运行也没报错&#xff0c;点击后页面没有反应。这种问题是比较头疼的&#xff0c;因为没有任何报错&#xff0c;只是click事件失效了。本篇用两种方法解决这种诡异的点击事件失效问题。 一、遇到的问题 在百度的搜索设置中&#xff0c;…

VisionPro界面乱序或字体排版异常,字体不适应界面窗口大小

很多人在安装Visionpro后都遇到了一个界面显示异常的问题&#xff1a; 打开visionpro后字体大小不统一,显示不全或显示在其他窗口之上&#xff0c;如下所示。 解决该问题&#xff0c;首先关闭Visionpro软件&#xff0c;右击软件选择属性->兼容性。勾选兼容模式下面的方框。…

2024年6月4日13:48:07-3.8功能说明1.保存草稿2.支持自定义SKU销售规格3.全网爆款企划支持一键提交

创建产品产品保存草稿、自定义编辑规格功能使用手册 尊敬的淘工厂商家&#xff1a; 淘工厂近两个月收到很多商家对淘工厂发品&#xff08;上品&#xff09;效率提升的改进建议&#xff0c;淘工厂本月将针对产品发布页的发品效率提升上线一系列改进功能&#xff0c;希望能加速…

存内计算:硬件的未来,今日已来

引言 存内计算的概念 存内计算&#xff08;In-Memory Computing, IMC&#xff09;是一种创新的计算架构&#xff0c;它颠覆了经典的冯诺依曼范式&#xff0c;其中数据和指令存储与数据处理是分开的。在存内计算模型中&#xff0c;计算单元被直接集成到存储器内部&#xff0c;…

了解CAN功能

了解CAN功能&#xff0c;学习CAN功能&#xff0c;理解CAN和串口的区别&#xff0c;以及它和RS485的相似之处。 1、“多主机”特性 在CAN网络通讯中&#xff0c;无需其它设备同意&#xff0c;每个CAN设备都可以主动向外发送数据&#xff0c;且所有设备都会收到数据&#xff0c…

基于springboot实现智慧校园之家长子系统项目【项目源码】计算机毕业设计

基于springboot实现智慧校园之家长子系统演示 SpringBoot框架介绍 本课题程序开发使用到的框架技术&#xff0c;英文名称缩写是SpringBoot&#xff0c;在JavaWeb开发中使用的流行框架有SSH、SpringBoot、SpringMVC等&#xff0c;作为一个课题程序采用SSH框架也可以&#xff0c…

钙钛矿电池产业化进程加快 狭缝涂布机市场需求空间广阔

钙钛矿电池产业化进程加快 狭缝涂布机市场需求空间广阔 狭缝涂布机即狭缝式涂布设备&#xff0c;是一种将涂料均匀、精密涂布在样品表面的设备。狭缝涂布机通常由涂布模头、喷嘴、刮刀、供液泵、运动平台等部分组成&#xff0c;通过控制供液泵及速率&#xff0c;将涂料从喷嘴挤…

Mendix 创客访谈录|Mendix助力开发高手10日交付复杂应用,且支持移动端呈现

本期创客 莊秉勳 布鲁科技技术顾问 各位Mendix社群的夥伴好&#xff0c;我是莊秉勳&#xff0c;大家也可以叫我Danny。 我大學是資訊科學背景&#xff0c;在與Mendix相遇前&#xff0c;曾在一上市製造企業&#xff0c;擔任軟體工程師&#xff0c;負責企業內部軟體開發&#xf…

【iOS】Runtime

文章目录 前言一、Runtime简介二、NSObject库起源isaisa_t结构体cache_t的具体实现class_data_bits_t的具体实现 三、[self class] 与 [super class]四、消息发送与转发五、Runtime应用场景 前言 之前分part学习了Runtime的内容&#xff0c;但是没有系统的总结&#xff0c;这篇…

如何安装“Whistle客户端”在Windows系统?

一、下载 https://github.com/avwo/whistle-client?tabreadme-ov-file 二、安装 按照正常的应用程序进行安装 三、安装根证书 1、 2、下载证书后&#xff0c;双击证书&#xff0c;根据指引安装证书。证书安装过程&#xff0c;要确保证书存储到受信任的根证书颁发机构下。重…