控制系统直接通过STC 8a8k64s4a12 单片机控制两组4位的数码管进行显示,使用DS1302时钟芯片进行获取时钟数据,使用DS18b20,获取温度信息,通过HC-05 蓝牙模块进行与手机app通讯,手机app由App Inventor 2编写 可以实现闹钟、用户设置数据的掉电保存,联机自动校时等功能。
作品实物如图所示:
数码管驱动:- #include <STC8.H>
- #include <shumaguan.H>
- #include <delay.H>
- uchar code shuzi[]={
- 0xc0,//0
- 0xf9,//1
- 0xa4,//2
- 0xb0,//3
- 0x99,//4
- 0x92,//5
- 0x82,//6
- 0xf8,//7
- 0x80,//8
- 0x90,//9
- 0x88,//A
- 0x83,//B 11
- 0xc6,//C 12
- 0xa1,//D
- 0x86,//E
- 0x8e,//F
- 0x8c,//P 16
- 0x40,//0.
- 0x79,//1.
- 0x24,//2.
- 0x30,//3.
- 0x19,//4.
- 0x12,//5.
- 0x02,//6.
- 0x78,//7.
- 0x00,//8.
- 0x10,//9.
- 0xbf,//- 27
- 0xff,// 熄灭 28
- 0x7f,//. 29
- 0x88,//A 30
- 0xc7,//L 31
- 0x87,//t 32
- 0x86,//E 33
- 0x8c,//P 34
- 0x83,//b 35
- 0x8b,//h 36
- 0x8e,//F 37
- 0xc8,//N 38
- 0x9c,//小圈 39
- 0xc1,//v 40
- };
- /***********************************************************************************************************
- * 函数名称: xianshi()
- * 输入参数:uchar,uchar,uchar,uchar,uchar,uchar,uchar,uchar
- * 输出参数: void
- *
- * 功 能: 数码管驱动程序
- *
- * 备 注:驱动8位数码管、形参的值对应数组shuzi里的位 、第几位形参对应数码管的位
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
-
- void xianshi(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar g,uchar h)////公阴
- {
- P2=0xff-shuzi[a];
- wei1=0;
- delay(2);
- wei1=1;
- P2=0xff-shuzi[b];
- wei2=0;
- delay(2);
- wei2=1;
- P2=0xff-shuzi[c];
- wei3=0;
- delay(2);
- wei3=1;
- P2=0xff-shuzi[d];
- wei4=0;
- delay(2);
- wei4=1;
- P2=0xff-shuzi[e];
- wei5=0;
- delay(2);
- wei5=1;
- P2=0xff-shuzi[f];
- wei6=0;
- delay(2);
- wei6=1;
- P2=0xff-shuzi[g];
- wei7=0;
- delay(2);
- wei7=1;
- P2=0xff-shuzi[h];
- wei8=0;
- delay(2);
- wei8=1;
- }
- /***********************************************************************************************************
- * 函数名称: xianshi5()
- * 输入参数:uchar,uchar,uchar,uchar,uchar
- * 输出参数: void
- *
- * 功 能: 数码管驱动程序
- *
- * 备 注:驱动5位数码管、形参的值对应数组shuzi里的位 、第几位形参对应数码管的位、显示周期短
- *
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void xianshi5(uchar d,uchar e,uchar f,uchar g,uchar h)////公阴
- {
- wei1=wei2=wei3=1;
- P2=0xff-shuzi[d];
- wei4=0;
- delay(2);
- wei4=1;
- P2=0xff-shuzi[e];
- wei5=0;
- delay(2);
- wei5=1;
- P2=0xff-shuzi[f];
- wei6=0;
- delay(2);
- wei6=1;
- P2=0xff-shuzi[g];
- wei7=0;
- delay(2);
- wei7=1;
- P2=0xff-shuzi[h];
- wei8=0;
- delay(2);
- wei8=1;
- }
-
复制代码
ds1302驱动:
- #include <STC8.H>
- #include <ds1302.H>
- #include <delay.H>
- uchar shijian[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};//时间缓存数组
- /***********************************************************************************************************
- * 函数名称: xie1302()
- * 输入参数:uchar
- * 输出参数: void
- *
- * 功 能: 写1302时序
- *
- * 备 注:向DS1302中写入形参
- *
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void xie1302(uchar dat)//写1302时序
- {
- uchar i;
- SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备
- delayus(2); //稍微等待,使硬件做好准备
- for(i=0;i<8;i++)
- {
- IO=dat&0x01;//取出dat的第0位数据写入1302
- delayus(2); //稍微等待,使硬件做好准备
- SCLK=1; //上升沿写入数据
- delayus(2); //稍微等待,使硬件做好准备3
- SCLK=0; //重新拉低SCLK,形成脉冲
- dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位
- }
- }
- /***********************************************************************************************************
- * 函数名称: du1302()
- * 输入参数:void
- * 输出参数: uchar
- *
- * 功 能:读1302时序
- *
- * 备 注:将读到的数据输出
- *
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- uchar du1302(void)//读1302时序
- {
- uchar i,dat;
- delayus(2); //稍微等待,使硬件做好准备
- for(i=0;i<8;i++)
- {
- dat>>=1;//将dat的各数据位右移1位,因为先读出的是字节的最低位
- if(IO==1) //如果读出的数据是1
- dat|=0x80; //将1取出,写在dat的最高位
- SCLK=1; //将SCLK置于高电平,为下降沿读出
- delayus(2); //稍微等待,使硬件做好准备
- SCLK=0; //拉低SCLK,形成脉冲下降沿
- delayus(2); //稍微等待,使硬件做好准备
- }
- return dat; //将读出的数据返回
- }
- /***********************************************************************************************************
- * 函数名称:xiemingling1302()
- * 输入参数:uchar ,uchar
- * 输出参数: void
- *
- * 功 能:向ds1302写指令、写数据
- *
- * 备 注:实际上是调用两次xie1302(),分别写入指令、数据
- *
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void xiemingling1302(uchar cmd,uchar dat)//写命令 数据
- {
- CE=0;//禁止数据传递
- SCLK=0; //确保写数据前SCLK被拉低
- CE=1; //启动数据传输
- delayus(2); //稍微等待,使硬件做好准备
- xie1302(cmd); //写入命令字
- xie1302(dat); //写数据
- SCLK=1; //将时钟电平置于已知状态
- CE=0; //禁止数据传递
- }
- /***********************************************************************************************************
- * 函数名称: dumingling1302()
- * 输入参数: uchar
- * 输出参数: uchar
- *
- * 功 能:向ds1302写指令、读数据
- *
- * 备 注:实际上是调用一次xie1302()一次du1302(),分别写入指令、读出数据
- *
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- uchar dumingling1302(uchar cmd)
- {
- uchar dat;
- CE=0; //拉低RST
- SCLK=0; //确保写数居前SCLK被拉低
- CE=1; //启动数据传输
- xie1302(cmd); //写入命令字
- dat=du1302(); //读出数据
- SCLK=1; //将时钟电平置于已知状态
- CE=0; //禁止数据传递
- return dat; //将读出的数据返回
- }
- /***********************************************************************************************************
- * 函数名称: zhuanhuan()
- * 输入参数: void
- * 输出参数: void
- *
- * 功 能:读ds1302的时钟数据,并转换之后缓存在shijian[]数组的相应的位
- *
- * 备 注:实际上是分别读取ds1302的周、秒、分钟、小时、日、月、年信息,并根据数据手册取出其相应的位进行存储
- *
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void zhuanhuan()//转换
- {
-
- uchar a,b,c,d,e,f,g;
- g=dumingling1302(0x8B);//周
- f=dumingling1302(0x81);//秒
- e=dumingling1302(0x83);//分钟
- d=dumingling1302(0x85);//小时
- c=dumingling1302(0x87);//日
- b=dumingling1302(0x89);//月
- a=dumingling1302(0x8D);//年
-
- shijian[12]=(g&0x07);//周转化个位
- shijian[11]=(f&0x0f);//秒转化个位
- shijian[10]=(f&0x70)>>4;//秒转化十位
- shijian[9]=(e&0x0f);//分钟转化个位
- shijian[8]=(e&0x70)>>4;//分钟转化十位
- shijian[7]=(d&0x0f);//小时转化个位
- shijian[6]=(d&0x30)>>4;//小时转化十位
- shijian[5]=(c&0x0f);//日转化个位
- shijian[4]=(c&0x70)>>4;//日转化十位
- shijian[3]=(b&0x0f);//月转化个位
- shijian[2]=(b&0x10)>>4;//月转化十位
- shijian[1]=(a&0x0f);//年转化个位
- shijian[0]=(a>>4);//年转化十位
- }
- /***********************************************************************************************************
- * 函数名称: xieshijian()
- * 输入参数: uchar ,uchar ,uchar ,uchar ,uchar , uchar ,uchar
- * 输出参数: void
- *
- * 功 能:向DS1302写入时钟数据
- *
- * 备 注:无
- *
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void xieshijian(uchar nian,uchar yue,uchar ri,uchar shi,uchar fen, uchar miao,uchar zhou)
- {
-
- xiemingling1302(0x8E,0x00);//根据写状态寄存器命令字, 写入不保护指令
- xiemingling1302(0x80,((miao/10)<<4|(miao%10))); //根据写秒寄存器命令字,写入秒的初始值
- xiemingling1302(0x82,((fen/10)<<4|(fen%10))); //根据写分寄存器命令字,写入分的初始值
- xiemingling1302(0x84,((shi/10)<<4|(shi%10))); // 根据写小时寄存器命令字,写入小时的初始值
- xiemingling1302(0x86,((ri/10)<<4|(ri%10))); // 根据写日寄存器命令字,写入日的初始值
- xiemingling1302(0x88,((yue/10)<<4|(yue%10))); // 根据写月寄存器命令字,写入月的初始值
- xiemingling1302(0x8c,((nian/10)<<4|(nian%10))); //根据写年寄存器命令字,写入年的初始值
- xiemingling1302(0x8B,((zhou/10)<<4|(zhou%10))); //根据写周寄存器命令字,写入周的初始值
- }
复制代码
ds18b20驱动:
- #include "18b20.h"
- #include <delay.H>
- #include <shumaguan.H>
- int wendu;//温度信息
- bit deng=0;//等待标志位
- /***********************************************************************************************************
- * 函数名称: DS18b20Init()
- * 输入参数:void
- * 输出参数: void
- *
- * 功 能: ds18b20初始化程序
- *
- * 备 注:无
- *
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void DS18b20Init()
- {
- if(deng==0)
- {
- DQ = 0; //将总线拉低480us~960us
- Delay640us();
- DQ = 1; //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
- deng=1;
- }
- if(DQ&&deng==1) //等待DS18B20拉低总线
- {
- deng=0;
- Delay60us();
- }
- }
- /***********************************************************************************************************
- * 函数名称: DS18b20WriteByte()
- * 输入参数:uchar
- * 输出参数: void
- *
- * 功 能: ds18b20写数据程序
- *
- * 备 注:注意时间的把握
- *
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void DS18b20WriteByte(uchar dat)
- {
- uint i;
- for(i=0; i<8; i++)
- {
- DQ = 0; //每写入一位数据之前先把总线拉低1us
- Delay1us();
- DQ = dat & 0x01; //然后写入一个数据,从最低位开始
- Delay68us();
- DQ = 1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
- dat >>= 1;
- }
- }
- /***********************************************************************************************************
- * 函数名称: DS18b20ReadByte()
- * 输入参数: void
- * 输出参数: uchar
- *
- * 功 能: ds18b20读数据程序
- *
- * 备 注:注意时间的把握
- *
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- uchar DS18b20ReadByte()
- {
- uchar byte, bi;
- uint i;
-
- for(i=8; i>0; i--)
- {
- DQ = 0;//先将总线拉低1us
- Delay1us();
- DQ = 1;//然后释放总线
- Delay6us();
- bi = DQ; //读取数据,从最低位开始读取
- /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
- byte = (byte >> 1) | (bi << 7);
- Delay48us(); //读取完之后等待48us再接着读取下一个数
- }
- return byte;
- }
- /***********************************************************************************************************
- * 函数名称: DS18b20ChangTemp()
- * 输入参数: void
- * 输出参数: void
- *
- * 功 能: 向ds18b20写启动温度转换命令
- *
- * 备 注:
- *
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void DS18b20ChangTemp()
- {
- DS18b20Init();
- Delay100us();
- DS18b20WriteByte(0xcc); //跳过ROM操作命令
- DS18b20WriteByte(0x44); //温度转换命令
- }
- /***********************************************************************************************************
- * 函数名称: DS18b20ReadTempCom()
- * 输入参数: void
- * 输出参数: void
- *
- * 功 能: 向ds18b20写读取温度命令
- *
- * 备 注:
- *
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void DS18b20ReadTempCom()
- {
- DS18b20Init();
- Delay100us();
- DS18b20WriteByte(0xcc); //跳过ROM操作命令
- DS18b20WriteByte(0xbe); //发送读取温度命令
- }
- /***********************************************************************************************************
- * 函数名称: DS18b20ReadTemp()
- * 输入参数: void
- * 输出参数: int
- *
- * 功 能: 读取ds18b20温度
- *
- * 备 注:读取ds18b20温度,并返回出来
- *
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- int DS18b20ReadTemp()
- {
- int temp = 0;
- uchar tmh, tml;
- DS18b20ChangTemp(); //先写入转换命令
- DS18b20ReadTempCom(); //然后等待转换完后发送读取温度命令
- tml = DS18b20ReadByte(); //读取温度值共16位,先读低字节
- tmh = DS18b20ReadByte(); //再读高字节
- temp = tmh;
- temp <<= 8;
- temp |= tml;
- if(tmh>0x07)
- {
- temp=~temp+1;
- temp=temp*6.25;
- temp=temp+5;
- temp=temp/10;
- temp=temp+10000;
- }
- else
- {
- temp=temp*6.25;
- temp=temp+5;
- temp=temp/10;
- }
- return temp;
- }
- /***********************************************************************************************************
- * 函数名称: xianshiwendu()
- * 输入参数: void
- * 输出参数: void
- *
- * 功 能: 转换温度数据
- *
- * 备 注:无
- *
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void xianshiwendu()
- {
- wendu=DS18b20ReadTemp();
- if(wendu<10000) xianshi5(28,wendu%1000/100,wendu%100/10+17,wendu%10,12);
- if(wendu>10000) xianshi5(27,wendu%1000/100,wendu%100/10+17,wendu%10,12);
- }
复制代码
菜单程序(主要逻辑):
- #include <STC8.H>
- #include <caidan.H>
- #include <ds1302.H>
- #include <shumaguan.H>
- #include <anjian.H>
- #include <delay.H>
- #include <eeprom.h>
- #include <fengmingqi.H>
- #include <18b20.H>
- extern uchar shijian[13];
- extern uint ms1;//用于闪烁计时
- extern uint ms2;//用于按键长按快加计时
- extern uint ms4;//用于循环显示计时
- bit changan=0;//长按标志位
- uint n=0;//计算平年闰年
- uint y=0;//计算月份
- bit runnian=1; //闰年标志位
- uchar yue=0;//大月标志位 1大月 2 2月 0小月
- uchar tiaozheng[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};//调整时间数据暂存数组
- uchar cd=0;//菜单
- bit aj1,aj2,aj3,aj4;
- extern int nao_kaiguan,nao_shi,nao_fen,nao2_kaiguan,nao2_shi,nao2_fen,wendu_kaiguan;//eeprom数据
- bit s;//闹钟1、2切换标志位
- extern int wendu;//温度信息
- /***********************************************************************************************************
- * 函数名称: caidan()
- * 输入参数: void
- * 输出参数: void
- *
- * 功 能: 菜单程序
- *
- * 备 注: 该程序是本作品的核心
- *0级菜单用于正常显示时间、日期、温度;
- *1级菜单用于闪烁全部的时间(提示是否修改)
- *2级菜单用于显示日期的全部闪烁(提示是否修改)
- *3级菜单用于闪烁al(提示是否修改闹钟信息)
- *4级菜单用于闪烁temp(提示是否修改温度开关)
- *5级菜单预留
- *10级菜单用于闪烁小时位
- *11级菜单用于闪烁分钟位
- *12级菜单用于闪烁秒位
- *13级级菜单用于闪烁年位
- *14级菜单用于闪烁月位
- *15级级菜单用于闪烁日位
- *16级菜单用于闪烁闹钟一的开关
- *17级级菜单用于闪烁闹钟一的时位
- *18级菜单用于闪烁闹钟一的分位
- *19级级菜单用于闪烁温度的开关
- *20级菜单用于闪烁闹钟一闹钟二选择位
- *21级菜单用于闪烁闹钟二的开关
- *22级菜单用于闪烁闹钟二的时位
- *23级菜单用于闪烁闹钟二的分位
- *
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void caidan()
- {
- zhuanhuan();//获取时间信息
- naozhong();//检测闹钟
- if(cd==0)//0级菜单
- {
- if(ms4>0&&ms4<10000) xianshi(shijian[6],shijian[7],27,shijian[8],shijian[9],27,shijian[10],shijian[11]);
- if(ms4>10000&&ms4<10100) wendu=DS18b20ReadTemp();
- if(ms4>10100&&ms4<15000) xianshi(2,0,shijian[0],shijian[1]+17,shijian[2],shijian[3]+17,shijian[4],shijian[5]);
- if(wendu_kaiguan==0&&ms4>15000) ms4=0;
- if(ms4>15200&&ms4<20000) xianshiwendu();
- if(ms4>20000) ms4=0;
- if(anjian1==0&&aj1==0)
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1) aj1=0,cd=1,ms1=0;//按键1按下松开,去1级菜单
- }
- if(cd==1)//1级菜单 闪烁全部时间
- {
- if(ms1>0&&ms1<300) xianshi(shijian[6],shijian[7],27,shijian[8],shijian[9],27,shijian[10],shijian[11]);
- if(ms1>300&&ms1<600) xianshi(28,28,27,28,28,27,28,28);
- if(ms1>600) ms1=0;
-
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1) aj1=0,cd=2,ms1=0;//按键1按下松开,去2级菜单
-
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- tiaozheng[0]=shijian[0];
- tiaozheng[1]=shijian[1];
- tiaozheng[2]=shijian[2];
- tiaozheng[3]=shijian[3];
- tiaozheng[4]=shijian[4];
- tiaozheng[5]=shijian[5];
- tiaozheng[6]=shijian[6];
- tiaozheng[7]=shijian[7];
- tiaozheng[8]=shijian[8];
- tiaozheng[9]=shijian[9];
- tiaozheng[10]=shijian[10];
- tiaozheng[11]=shijian[11];
- aj2=0;
- cd=10;
- ms1=0;//按键2按下松开,去10级菜单
- }
- }
-
- if(cd==2)//2级菜单 闪烁全部日期
- {
- if(ms1>0&&ms1<300) xianshi(2,0,shijian[0],shijian[1]+17,shijian[2],shijian[3]+17,shijian[4],shijian[5]);
- if(ms1>300&&ms1<600) xianshi(28,28,28,29,28,29,28,28);
- if(ms1>600) ms1=0;
-
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1) aj1=0,cd=3,ms1=0;//按键1按下松开,去3级菜单
-
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- tiaozheng[0]=shijian[0];
- tiaozheng[1]=shijian[1];
- tiaozheng[2]=shijian[2];
- tiaozheng[3]=shijian[3];
- tiaozheng[4]=shijian[4];
- tiaozheng[5]=shijian[5];
- tiaozheng[6]=shijian[6];
- tiaozheng[7]=shijian[7];
- tiaozheng[8]=shijian[8];
- tiaozheng[9]=shijian[9];
- tiaozheng[10]=shijian[10];
- tiaozheng[11]=shijian[11];
- aj2=0;
- cd=13;
- ms1=0;//按键2按下松开,去13级菜单
- }
- }
- if(cd==3)//3级菜单 显示al闹钟
- {
- if(ms1>0&&ms1<300) xianshi(27,27,27,30,31,27,27,27);
- if(ms1>300&&ms1<600) xianshi(27,27,27,28,28,27,27,27);
- if(ms1>600) ms1=0;
-
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1) aj1=0,cd=4,ms1=0;//按键1按下松开,去4级菜单
-
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- aj2=0;
- cd=20;
- dunaozhong();//读取闹钟数据
- ms1=0;//按键2按下松开,去20级菜单
- }
- }
-
- if(cd==4)//4级菜单 显示temp 温度
- {
- if(ms1>0&&ms1<300) xianshi(27,27,32,33,34,33,27,27);
- if(ms1>300&&ms1<600) xianshi(27,27,28,28,28,28,27,27);
- if(ms1>600) ms1=0;
-
- if(anjian1==0&&aj1==0)//检测按键1
- {
-
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1) aj1=0,cd=0,ms1=0;//按键1按下松开,去0级菜单
-
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- aj2=0;
- cd=19;
- wendu_kaiguan=IapRead(0x0800);
- ms1=0;//按键2按下松开,去19级菜单
- }
- }
-
- if(cd==5)//5级菜单 预留
- {
- // if(ms1>0&&ms1<300) xianshi(27,27,35,31,32,36,27,27);
- // if(ms1>300&&ms1<600) xianshi(27,27,28,28,28,28,27,27);
- // if(ms1>600) ms1=0;
- //
- // if(anjian1==0&&aj1==0)//检测按键1
- // {
- // delay(5);
- // if(anjian1==0) aj1=1;
- // }
- // if(anjian1==1&&aj1==1) aj1=0,cd=0,ms1=0;//按键1按下松开,去0级菜单
- // if(anjian2==0&&aj2==0)//检测按键2
- // {
- // delay(5);
- // if(anjian2==0) aj2=1;
- // }
- // if(anjian2==1&&aj2==1)
- // {
- // aj2=0;
- // cd=20;//按键2按下松开,去20级菜单
- // }
- }
-
- while(cd==10)//10级菜单 小时位闪烁调整
- {
- if(ms1>0&&ms1<300) xianshi(tiaozheng[6],tiaozheng[7],27,tiaozheng[8],tiaozheng[9],27,tiaozheng[10],tiaozheng[11]);
- if(ms1>300&&ms1<600) xianshi(28,28,27,tiaozheng[8],tiaozheng[9],27,tiaozheng[10],tiaozheng[11]);
- if(ms1>600) ms1=0;
- if(ms1>300&&changan==1) ms1=0;
-
-
-
- if(anjian3==0&&aj3==0)//检测按键3
- {
- delay(5);
- if(anjian3==0) aj3=1,ms2=0;
- }
- if(anjian3==1&&aj3==1)
- {
- tiaozheng[7]++;
- if((tiaozheng[6]==2)&&(tiaozheng[7]==4)) tiaozheng[6]=tiaozheng[7]=0;
- if(((tiaozheng[6]==0)||(tiaozheng[6]==1))&&(tiaozheng[7]==10)) tiaozheng[6]++,tiaozheng[7]=0;
- changan=0;
- aj3=0;//按键1按下松开,小时++
- }
- if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj3==1&&changan==1&&ms2>=100)//快加
- {
- tiaozheng[7]++;
- if((tiaozheng[6]==2)&&(tiaozheng[7]==4)) tiaozheng[6]=tiaozheng[7]=0;
- if(((tiaozheng[6]==0)||(tiaozheng[6]==1))&&(tiaozheng[7]==10)) tiaozheng[6]++,tiaozheng[7]=0;
- ms2=0;
- }
-
- if(anjian4==0&&aj4==0)//检测按键4
- {
- delay(5);
- if(anjian4==0) aj4=1,ms2=0;
- }
- if(anjian4==1&&aj4==1)
- {
- tiaozheng[7]--;
- if((tiaozheng[6]==0)&&(tiaozheng[7]>100)) tiaozheng[6]=2,tiaozheng[7]=3;
- if(((tiaozheng[6]==2)||(tiaozheng[6]==1))&&(tiaozheng[7]>100)) tiaozheng[6]--,tiaozheng[7]=9;
- changan=0;
- aj4=0;//按键1按下松开,小时--
- }
- if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj4==1&&changan==1&&ms2>=100)//快减
- {
- tiaozheng[7]--;
- if((tiaozheng[6]==0)&&(tiaozheng[7]>100)) tiaozheng[6]=2,tiaozheng[7]=3;
- if(((tiaozheng[6]==2)||(tiaozheng[6]==1))&&(tiaozheng[7]>100)) tiaozheng[6]--,tiaozheng[7]=9;
- ms2=0;
- }
-
-
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- aj2=0;
- cd=11;
- ms1=0;//按键2按下松开,去11级菜单
- }
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1)
- {
- aj1=0;
- cd=2;
- xieshijian(tiaozheng[0]*10+tiaozheng[1],tiaozheng[2]*10+tiaozheng[3],tiaozheng[4]*10+tiaozheng[5],tiaozheng[6]*10+tiaozheng[7],tiaozheng[8]*10+tiaozheng[9],tiaozheng[10]*10+tiaozheng[11],shijian[12]);
- ms1=0;//按键1按下松开,去2级菜单
- }
- }
- while(cd==11)//11级菜单 分钟位闪烁调整
- {
- if(ms1>0&&ms1<300) xianshi(tiaozheng[6],tiaozheng[7],27,tiaozheng[8],tiaozheng[9],27,tiaozheng[10],tiaozheng[11]);
- if(ms1>300&&ms1<600) xianshi(tiaozheng[6],tiaozheng[7],27,28,28,27,tiaozheng[10],tiaozheng[11]);
- if(ms1>600) ms1=0;
- if(ms1>300&&changan==1) ms1=0;
-
- if(anjian3==0&&aj3==0)//检测按键3
- {
- delay(5);
- if(anjian3==0) aj3=1,ms2=0;
- }
- if(anjian3==1&&aj3==1)
- {
- tiaozheng[9]++;
- if(tiaozheng[9]==10) tiaozheng[8]++,tiaozheng[9]=0;
- if(tiaozheng[8]==6) tiaozheng[8]=tiaozheng[9]=0;
- changan=0;
- aj3=0;//按键1按下松开,小时++
- }
- if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj3==1&&changan==1&&ms2>=100)//快加
- {
- tiaozheng[9]++;
- if(tiaozheng[9]==10) tiaozheng[8]++,tiaozheng[9]=0;
- if(tiaozheng[8]==6) tiaozheng[8]=tiaozheng[9]=0;
- ms2=0;
- }
-
- if(anjian4==0&&aj4==0)//检测按键4
- {
- delay(5);
- if(anjian4==0) aj4=1,ms2=0;
- }
- if(anjian4==1&&aj4==1)
- {
- tiaozheng[9]--;
- if(tiaozheng[9]>100) tiaozheng[8]--,tiaozheng[9]=9;
- if(tiaozheng[8]>100) tiaozheng[8]=5,tiaozheng[9]=9;
- changan=0;
- aj4=0;//按键1按下松开,小时--
- }
- if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj4==1&&changan==1&&ms2>=100)//快减
- {
- tiaozheng[9]--;
- if(tiaozheng[9]>100) tiaozheng[8]--,tiaozheng[9]=9;
- if(tiaozheng[8]>100) tiaozheng[8]=5,tiaozheng[9]=9;
- ms2=0;
- }
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- aj2=0;
- cd=12;
- ms1=0;//按键2按下松开,去12级菜单
- }
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1)
- {
- aj1=0;
- cd=2;
- xieshijian(tiaozheng[0]*10+tiaozheng[1],tiaozheng[2]*10+tiaozheng[3],tiaozheng[4]*10+tiaozheng[5],tiaozheng[6]*10+tiaozheng[7],tiaozheng[8]*10+tiaozheng[9],tiaozheng[10]*10+tiaozheng[11],shijian[12]);
- ms1=0;//按键1按下松开,去2级菜单
- }
-
- }
- while(cd==12)//12级菜单 秒位闪烁调整
- {
- if(ms1>0&&ms1<300) xianshi(tiaozheng[6],tiaozheng[7],27,tiaozheng[8],tiaozheng[9],27,tiaozheng[10],tiaozheng[11]);
- if(ms1>300&&ms1<600) xianshi(tiaozheng[6],tiaozheng[7],27,tiaozheng[8],tiaozheng[9],27,28,28);
- if(ms1>600) ms1=0;
- if(ms1>300&&changan==1) ms1=0;
-
- if(anjian3==0&&aj3==0)//检测按键3
- {
- delay(5);
- if(anjian3==0) aj3=1,ms2=0;
- }
- if(anjian3==1&&aj3==1)
- {
- tiaozheng[11]++;
- if(tiaozheng[11]==10) tiaozheng[10]++,tiaozheng[11]=0;
- if(tiaozheng[10]==6) tiaozheng[10]=tiaozheng[11]=0;
- changan=0;
- aj3=0;//按键1按下松开,小时++
- }
- if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj3==1&&changan==1&&ms2>=100)//快加
- {
- tiaozheng[11]++;
- if(tiaozheng[11]==10) tiaozheng[10]++,tiaozheng[11]=0;
- if(tiaozheng[10]==6) tiaozheng[10]=tiaozheng[11]=0;
- ms2=0;
- }
-
- if(anjian4==0&&aj4==0)//检测按键4
- {
- delay(5);
- if(anjian4==0) aj4=1,ms2=0;
- }
- if(anjian4==1&&aj4==1)
- {
- tiaozheng[11]--;
- if(tiaozheng[11]>100) tiaozheng[10]--,tiaozheng[11]=9;
- if(tiaozheng[10]>100) tiaozheng[10]=5,tiaozheng[11]=9;
- changan=0;
- aj4=0;//按键1按下松开,小时--
- }
- if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj4==1&&changan==1&&ms2>=100)//快减
- {
- tiaozheng[11]--;
- if(tiaozheng[11]>100) tiaozheng[10]--,tiaozheng[11]=9;
- if(tiaozheng[10]>100) tiaozheng[10]=5,tiaozheng[11]=9;
- ms2=0;
- }
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- aj2=0;
- cd=10;
- ms1=0;//按键2按下松开,去10级菜单
- }
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1)
- {
- aj1=0;
- cd=2;
- xieshijian(tiaozheng[0]*10+tiaozheng[1],tiaozheng[2]*10+tiaozheng[3],tiaozheng[4]*10+tiaozheng[5],tiaozheng[6]*10+tiaozheng[7],tiaozheng[8]*10+tiaozheng[9],tiaozheng[10]*10+tiaozheng[11],shijian[12]);
- ms1=0;//按键1按下松开,去2级菜单
- }
- }
- while(cd==13)//第13级菜单 年位闪烁
- {
- if(ms1>0&&ms1<300) xianshi(2,0,tiaozheng[0],tiaozheng[1]+17,tiaozheng[2],tiaozheng[3]+17,tiaozheng[4],tiaozheng[5]);
- if(ms1>300&&ms1<600) xianshi(28,28,28,29,tiaozheng[2],tiaozheng[3]+17,tiaozheng[4],tiaozheng[5]);
- if(ms1>600) ms1=0;
- if(ms1>300&&changan==1) ms1=0;
-
- if(anjian3==0&&aj3==0)//检测按键3
- {
- delay(5);
- if(anjian3==0) aj3=1,ms2=0;
- }
- if(anjian3==1&&aj3==1)
- {
- tiaozheng[1]++;
- if(tiaozheng[1]==10) tiaozheng[0]++,tiaozheng[1]=0;
- if(tiaozheng[0]==10) tiaozheng[0]=tiaozheng[1]=0;
- changan=0;
- aj3=0;//按键1按下松开,小时++
- }
- if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj3==1&&changan==1&&ms2>=100)//快加
- {
- tiaozheng[1]++;
- if(tiaozheng[1]==10) tiaozheng[0]++,tiaozheng[1]=0;
- if(tiaozheng[0]==10) tiaozheng[0]=tiaozheng[1]=0;
- ms2=0;
- }
- if(anjian4==0&&aj4==0)//检测按键4
- {
- delay(5);
- if(anjian4==0) aj4=1,ms2=0;
- }
- if(anjian4==1&&aj4==1)
- {
- tiaozheng[1]--;
- if(tiaozheng[1]>100) tiaozheng[0]--,tiaozheng[1]=9;
- if(tiaozheng[0]>100) tiaozheng[0]=9,tiaozheng[1]=9;
- changan=0;
- aj4=0;//按键1按下松开,小时--
- }
- if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj4==1&&changan==1&&ms2>=100)//快减
- {
- tiaozheng[1]--;
- if(tiaozheng[1]>100) tiaozheng[0]--,tiaozheng[1]=9;
- if(tiaozheng[0]>100) tiaozheng[0]=9,tiaozheng[1]=9;
- ms2=0;
- }
-
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- aj2=0;
- cd=14;
- ms1=0;//按键2按下松开,去14级菜单
- }
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1)
- {
- aj1=0;
- cd=3;
- xieshijian(tiaozheng[0]*10+tiaozheng[1],tiaozheng[2]*10+tiaozheng[3],tiaozheng[4]*10+tiaozheng[5],tiaozheng[6]*10+tiaozheng[7],tiaozheng[8]*10+tiaozheng[9],tiaozheng[10]*10+tiaozheng[11],shijian[12]);
- ms1=0;//按键1按下松开,去3级菜单
- }
- }
-
- while(cd==14)//第14级菜单 月位闪烁
- {
- if(ms1>0&&ms1<300) xianshi(2,0,tiaozheng[0],tiaozheng[1]+17,tiaozheng[2],tiaozheng[3]+17,tiaozheng[4],tiaozheng[5]);
- if(ms1>300&&ms1<600) xianshi(2,0,tiaozheng[0],tiaozheng[1]+17,28,28,tiaozheng[4],tiaozheng[5]);
- if(ms1>600) ms1=0;
- if(ms1>300&&changan==1) ms1=0;
-
- if(anjian3==0&&aj3==0)//检测按键3
- {
- delay(5);
- if(anjian3==0) aj3=1,ms2=0;
- }
- if(anjian3==1&&aj3==1)
- {
- tiaozheng[3]++;
- if(tiaozheng[3]==10) tiaozheng[2]++,tiaozheng[3]=0;
- if(tiaozheng[2]==1&&tiaozheng[3]==3) tiaozheng[2]=0,tiaozheng[3]=1;
- changan=0;
- aj3=0;//按键1按下松开,小时++
- }
- if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj3==1&&changan==1&&ms2>=100)//快加
- {
- tiaozheng[3]++;
- if(tiaozheng[3]==10) tiaozheng[2]++,tiaozheng[3]=0;
- if(tiaozheng[2]==1&&tiaozheng[3]==3) tiaozheng[2]=0,tiaozheng[3]=1;
- ms2=0;
- }
- if(anjian4==0&&aj4==0)//检测按键4
- {
- delay(5);
- if(anjian4==0) aj4=1,ms2=0;
- }
- if(anjian4==1&&aj4==1)
- {
- tiaozheng[3]--;
- if(tiaozheng[3]>100) tiaozheng[2]--,tiaozheng[3]=9;
- if(tiaozheng[2]==0&&tiaozheng[3]==0) tiaozheng[2]=1,tiaozheng[3]=2;
- changan=0;
- aj4=0;//按键1按下松开,小时--
- }
- if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj4==1&&changan==1&&ms2>=100)//快减
- {
- tiaozheng[3]--;
- if(tiaozheng[3]>100) tiaozheng[2]--,tiaozheng[3]=9;
- if(tiaozheng[2]==0&&tiaozheng[3]==0) tiaozheng[2]=1,tiaozheng[3]=2;
- ms2=0;
- }
-
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- aj2=0;
- cd=15;
- n=2000+tiaozheng[0]*10+tiaozheng[1];//计算平年闰年
- y=tiaozheng[2]*10+tiaozheng[3];
- if((n%4==0)&&(n%100!=0)) runnian=1; //闰年标志位
- else runnian=0;
- if(y==1||y==3||y==5||y==7||y==8||y==10||y==12) yue=1;//大月标志位
- else if(y==2) yue=2;//2月标志位
- else yue=0;//小月标志位
- ms1=0;//按键2按下松开,去15级菜单
- }
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1)
- {
- aj1=0;
- cd=3;
- xieshijian(tiaozheng[0]*10+tiaozheng[1],tiaozheng[2]*10+tiaozheng[3],tiaozheng[4]*10+tiaozheng[5],tiaozheng[6]*10+tiaozheng[7],tiaozheng[8]*10+tiaozheng[9],tiaozheng[10]*10+tiaozheng[11],shijian[12]);
- ms1=0;//按键1按下松开,去3级菜单
- }
- }
- while(cd==15)//第15级菜单 日位闪烁
- {
- if(ms1>0&&ms1<300) xianshi(2,0,tiaozheng[0],tiaozheng[1]+17,tiaozheng[2],tiaozheng[3]+17,tiaozheng[4],tiaozheng[5]);
- if(ms1>300&&ms1<600) xianshi(2,0,tiaozheng[0],tiaozheng[1]+17,tiaozheng[2],tiaozheng[3]+17,28,28);
- if(ms1>600) ms1=0;
- if(ms1>300&&changan==1) ms1=0;
-
- if(anjian3==0&&aj3==0)//检测按键3
- {
- delay(5);
- if(anjian3==0) aj3=1,ms2=0;
- }
- if(anjian3==1&&aj3==1)
- {
- tiaozheng[5]++;
- if(tiaozheng[5]==10) tiaozheng[4]++,tiaozheng[5]=0;
- if(runnian==1&&yue==2&&tiaozheng[4]==3) tiaozheng[4]=0,tiaozheng[5]=1;
- if(runnian==0&&yue==2&&tiaozheng[4]==2&&tiaozheng[5]==9) tiaozheng[4]=0,tiaozheng[5]=1;
- if(yue==1&&tiaozheng[4]==3&&tiaozheng[5]==2) tiaozheng[4]=0,tiaozheng[5]=1;
- if(yue==0&&tiaozheng[4]==3&&tiaozheng[5]==1) tiaozheng[4]=0,tiaozheng[5]=1;
- changan=0;
- aj3=0;//按键1按下松开,日++
- }
- if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj3==1&&changan==1&&ms2>=100)//快加
- {
- tiaozheng[5]++;
- if(tiaozheng[5]==10) tiaozheng[4]++,tiaozheng[5]=0;
- if(runnian==1&&yue==2&&tiaozheng[4]==3) tiaozheng[4]=0,tiaozheng[5]=1;
- if(runnian==0&&yue==2&&tiaozheng[4]==2&&tiaozheng[5]==9) tiaozheng[4]=0,tiaozheng[5]=1;
- if(yue==1&&tiaozheng[4]==3&&tiaozheng[5]==2) tiaozheng[4]=0,tiaozheng[5]=1;
- if(yue==0&&tiaozheng[4]==3&&tiaozheng[5]==1) tiaozheng[4]=0,tiaozheng[5]=1;
- ms2=0;
- }
- if(anjian4==0&&aj4==0)//检测按键4
- {
- delay(5);
- if(anjian4==0) aj4=1,ms2=0;
- }
- if(anjian4==1&&aj4==1)
- {
- tiaozheng[5]--;
- if(tiaozheng[5]>100) tiaozheng[4]--,tiaozheng[5]=9;
- if(runnian==1&&yue==2&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=2,tiaozheng[5]=9;
- if(runnian==0&&yue==2&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=2,tiaozheng[5]=8;
- if(yue==1&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=3,tiaozheng[5]=1;
- if(yue==0&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=3,tiaozheng[5]=0;
- changan=0;
- aj4=0;//按键1按下松开,日--
- }
- if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj4==1&&changan==1&&ms2>=100)//快减
- {
- tiaozheng[5]--;
- if(tiaozheng[5]>100) tiaozheng[4]--,tiaozheng[5]=9;
- if(runnian==1&&yue==2&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=2,tiaozheng[5]=9;
- if(runnian==0&&yue==2&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=2,tiaozheng[5]=8;
- if(yue==1&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=3,tiaozheng[5]=1;
- if(yue==0&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=3,tiaozheng[5]=0;
- ms2=0;
- }
-
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- aj2=0;
- cd=13;
- ms1=0;//按键2按下松开,去13级菜单
- }
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1)
- {
- aj1=0;
- cd=3;
- xieshijian(tiaozheng[0]*10+tiaozheng[1],tiaozheng[2]*10+tiaozheng[3],tiaozheng[4]*10+tiaozheng[5],tiaozheng[6]*10+tiaozheng[7],tiaozheng[8]*10+tiaozheng[9],tiaozheng[10]*10+tiaozheng[11],shijian[12]);
- ms1=0;//按键1按下松开,去3级菜单
- }
- }
- while(cd==16)//菜单16 设置闹钟1开关
- {
- if(nao_kaiguan==0)
- {
- if(ms1>0&&ms1<300) xianshi(30,31,1,27,27,0,37,37);
- if(ms1>300&&ms1<600) xianshi(30,31,1,27,27,28,28,28);
- if(ms1>600) ms1=0;
- }
- if(nao_kaiguan==1)
- {
- if(ms1>0&&ms1<300) xianshi(30,31,1,27,27,27,0,38);
- if(ms1>300&&ms1<600) xianshi(30,31,1,27,27,27,28,28);
- if(ms1>600) ms1=0;
- }
-
- if(anjian3==0&&aj3==0)//检测按键3
- {
- delay(5);
- if(anjian3==0) aj3=1;
- }
- if(anjian3==1&&aj3==1)
- {
- aj3=0;
- nao_kaiguan++;
- }
- if(anjian4==0&&aj4==0)//检测按键4
- {
- delay(5);
- if(anjian4==0) aj4=1;
- }
- if(anjian4==1&&aj4==1)
- {
- aj4=0;
- nao_kaiguan++;
- }
- if(nao_kaiguan>1) nao_kaiguan=0;
-
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1)
- {
- aj1=0;
- cd=4;
- IapErase(0x0200);
- IapProgram(0x0200, nao_kaiguan);//写开关值
- }
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- aj2=0;
- cd=17;//去菜单17
- IapErase(0x0200);
- IapProgram(0x0200, nao_kaiguan);//写开关值
- }
- }
- while(cd==17)//菜单17 设置闹钟1 时
- {
- if(ms1>0&&ms1<300) xianshi(27,nao_shi/10,nao_shi%10,27,27,nao_fen/10,nao_fen%10,27);
- if(ms1>300&&ms1<600) xianshi(27,28,28,27,27,nao_fen/10,nao_fen%10,27);
- if(ms1>600) ms1=0;
- if(ms1>300&&changan==1) ms1=0;
-
-
-
- if(anjian3==0&&aj3==0)//检测按键3
- {
- delay(5);
- if(anjian3==0) aj3=1,ms2=0;
- }
- if(anjian3==1&&aj3==1)
- {
- nao_shi++;
- if(nao_shi==25) nao_shi=0;
- changan=0;
- aj3=0;//按键1按下松开,小时++
- }
- if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj3==1&&changan==1&&ms2>=100)//快加
- {
- nao_shi++;
- if(nao_shi==25) nao_shi=0;
- ms2=0;
- }
-
- if(anjian4==0&&aj4==0)//检测按键4
- {
- delay(5);
- if(anjian4==0) aj4=1,ms2=0;
- }
- if(anjian4==1&&aj4==1)
- {
- nao_shi--;
- if(nao_shi<0) nao_shi=24;
- changan=0;
- aj4=0;//按键1按下松开,小时--
- }
- if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj4==1&&changan==1&&ms2>=100)//快减
- {
- nao_shi--;
- if(nao_shi<0) nao_shi=24;
- ms2=0;
- }
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1)
- {
- aj1=0;
- cd=4;
- IapErase(0x0400);
- IapProgram(0x0400, nao_shi);//写小时值
- }
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- aj2=0;
- cd=18;//去菜单18
- IapErase(0x0400);
- IapProgram(0x0400, nao_shi);//写小时值
- }
-
- }
- while(cd==18)//菜单18 设置闹钟1 分
- {
- if(ms1>0&&ms1<300) xianshi(27,nao_shi/10,nao_shi%10,27,27,nao_fen/10,nao_fen%10,27);
- if(ms1>300&&ms1<600) xianshi(27,nao_shi/10,nao_shi%10,27,27,28,28,27);
- if(ms1>600) ms1=0;
- if(ms1>300&&changan==1) ms1=0;
-
-
-
- if(anjian3==0&&aj3==0)//检测按键3
- {
- delay(5);
- if(anjian3==0) aj3=1,ms2=0;
- }
- if(anjian3==1&&aj3==1)
- {
- nao_fen++;
- if(nao_fen==60) nao_fen=0;
- changan=0;
- aj3=0;//按键1按下松开,小时++
- }
- if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj3==1&&changan==1&&ms2>=100)//快加
- {
- nao_fen++;
- if(nao_fen==60) nao_fen=0;
- ms2=0;
- }
-
- if(anjian4==0&&aj4==0)//检测按键4
- {
- delay(5);
- if(anjian4==0) aj4=1,ms2=0;
- }
- if(anjian4==1&&aj4==1)
- {
- nao_fen--;
- if(nao_fen<0) nao_fen=59;
- changan=0;
- aj4=0;//按键1按下松开,小时--
- }
- if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj4==1&&changan==1&&ms2>=100)//快减
- {
- nao_fen--;
- if(nao_fen<0) nao_fen=59;
- ms2=0;
- }
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1)
- {
- aj1=0;
- cd=4;
- IapErase(0x0600);
- IapProgram(0x0600, nao_fen);//写小时值
- }
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- aj2=0;
- cd=20;//去菜单20
- IapErase(0x0600);
- IapProgram(0x0600, nao_fen);//写小时值
- }
- }
- while(cd==19)//菜单19 设置温度开关
- {
- if(wendu_kaiguan==0)
- {
- if(ms1>0&&ms1<300) xianshi(32,33,34,33,27,0,37,37);
- if(ms1>300&&ms1<600) xianshi(32,33,34,33,27,28,28,28);
- if(ms1>600) ms1=0;
- }
- if(wendu_kaiguan==1)
- {
- if(ms1>0&&ms1<300) xianshi(32,33,34,33,27,27,0,38);
- if(ms1>300&&ms1<600) xianshi(32,33,34,33,27,27,28,28);
- if(ms1>600) ms1=0;
- }
-
- if(anjian3==0&&aj3==0)//检测按键3
- {
- delay(5);
- if(anjian3==0) aj3=1;
- }
- if(anjian3==1&&aj3==1)
- {
- aj3=0;
- wendu_kaiguan++;
- }
- if(anjian4==0&&aj4==0)//检测按键4
- {
- delay(5);
- if(anjian4==0) aj4=1;
- }
- if(anjian4==1&&aj4==1)
- {
- aj4=0;
- wendu_kaiguan++;
- }
- if(wendu_kaiguan>1) wendu_kaiguan=0;
-
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1)
- {
- aj1=0;
- cd=0;
- IapErase(0x0800);
- IapProgram(0x0800, wendu_kaiguan);//写开关值
- }
- }
- while(cd==20)//菜单20 选择闹钟1、2
- {
- if(s==0)
- {
- if(nao_kaiguan==0)
- {
- if(ms1>0&&ms1<300) xianshi(30,31,1,27,27,0,37,37);
- if(ms1>300&&ms1<600) xianshi(30,31,28,27,27,0,37,37);
- if(ms1>600) ms1=0;
- }
- if(nao_kaiguan==1)
- {
- if(ms1>0&&ms1<300) xianshi(30,31,1,27,27,27,0,38);
- if(ms1>300&&ms1<600) xianshi(30,31,28,27,27,27,0,38);
- if(ms1>600) ms1=0;
- }
- }
- if(s==1)
- {
- if(nao2_kaiguan==0)
- {
- if(ms1>0&&ms1<300) xianshi(30,31,2,27,27,0,37,37);
- if(ms1>300&&ms1<600) xianshi(30,31,28,27,27,0,37,37);
- if(ms1>600) ms1=0;
- }
- if(nao2_kaiguan==1)
- {
- if(ms1>0&&ms1<300) xianshi(30,31,2,27,27,27,0,38);
- if(ms1>300&&ms1<600) xianshi(30,31,28,27,27,27,0,38);
- if(ms1>600) ms1=0;
- }
- }
-
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1) aj1=0,cd=4,ms1=0;//按键1按下松开,去4级菜单
-
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- aj2=0;
- if(s==1) cd=21;//按键2按下松开,去21级菜单
- if(s==0) cd=16;//按键2按下松开,去16级菜单
- }
-
- if(anjian3==0&&aj3==0)//检测按键3
- {
- delay(5);
- if(anjian3==0) aj3=1;
- }
- if(anjian3==1&&aj3==1)
- {
- aj3=0;
- s=1;
- }
- if(anjian4==0&&aj4==0)//检测按键4
- {
- delay(5);
- if(anjian4==0) aj4=1;
- }
- if(anjian4==1&&aj4==1)
- {
- aj4=0;
- s=0;
- }
- }
- while(cd==21)//菜单21 设置闹钟2开关
- {
- if(nao2_kaiguan==0)
- {
- if(ms1>0&&ms1<300) xianshi(30,31,2,27,27,0,37,37);
- if(ms1>300&&ms1<600) xianshi(30,31,2,27,27,28,28,28);
- if(ms1>600) ms1=0;
- }
- if(nao2_kaiguan==1)
- {
- if(ms1>0&&ms1<300) xianshi(30,31,2,27,27,27,0,38);
- if(ms1>300&&ms1<600) xianshi(30,31,2,27,27,27,28,28);
- if(ms1>600) ms1=0;
- }
-
- if(anjian3==0&&aj3==0)//检测按键3
- {
- delay(5);
- if(anjian3==0) aj3=1;
- }
- if(anjian3==1&&aj3==1)
- {
- aj3=0;
- nao2_kaiguan++;
- }
- if(anjian4==0&&aj4==0)//检测按键4
- {
- delay(5);
- if(anjian4==0) aj4=1;
- }
- if(anjian4==1&&aj4==1)
- {
- aj4=0;
- nao2_kaiguan++;
- }
- if(nao2_kaiguan>1) nao2_kaiguan=0;
-
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1)
- {
- aj1=0;
- cd=4;
- IapErase(0x0c00);
- IapProgram(0x0c00, nao2_kaiguan);//写开关值
- }
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- aj2=0;
- cd=22;//去菜单22
- IapErase(0x0c00);
- IapProgram(0x0c00, nao2_kaiguan);//写开关值
- }
- }
- while(cd==22)//菜单22 设置闹钟2 时
- {
- if(ms1>0&&ms1<300) xianshi(27,nao2_shi/10,nao2_shi%10,27,27,nao2_fen/10,nao2_fen%10,27);
- if(ms1>300&&ms1<600) xianshi(27,28,28,27,27,nao2_fen/10,nao2_fen%10,27);
- if(ms1>600) ms1=0;
- if(ms1>300&&changan==1) ms1=0;
-
-
-
- if(anjian3==0&&aj3==0)//检测按键3
- {
- delay(5);
- if(anjian3==0) aj3=1,ms2=0;
- }
- if(anjian3==1&&aj3==1)
- {
- nao2_shi++;
- if(nao2_shi==25) nao2_shi=0;
- changan=0;
- aj3=0;//按键1按下松开,小时++
- }
- if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj3==1&&changan==1&&ms2>=100)//快加
- {
- nao2_shi++;
- if(nao2_shi==25) nao2_shi=0;
- ms2=0;
- }
-
- if(anjian4==0&&aj4==0)//检测按键4
- {
- delay(5);
- if(anjian4==0) aj4=1,ms2=0;
- }
- if(anjian4==1&&aj4==1)
- {
- nao2_shi--;
- if(nao2_shi<0) nao2_shi=24;
- changan=0;
- aj4=0;//按键1按下松开,小时--
- }
- if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj4==1&&changan==1&&ms2>=100)//快减
- {
- nao2_shi--;
- if(nao2_shi<0) nao2_shi=24;
- ms2=0;
- }
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1)
- {
- aj1=0;
- cd=4;
- IapErase(0x0e00);
- IapProgram(0x0e00, nao2_shi);//写小时值
- }
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- aj2=0;
- cd=23;//去菜单23
- IapErase(0x0e00);
- IapProgram(0x0e00, nao2_shi);//写小时值
- }
- }
-
- while(cd==23)//菜单23 设置闹钟2 分
- {
- if(ms1>0&&ms1<300) xianshi(27,nao2_shi/10,nao2_shi%10,27,27,nao2_fen/10,nao2_fen%10,27);
- if(ms1>300&&ms1<600) xianshi(27,nao2_shi/10,nao2_shi%10,27,27,28,28,27);
- if(ms1>600) ms1=0;
- if(ms1>300&&changan==1) ms1=0;
-
- if(anjian3==0&&aj3==0)//检测按键3
- {
- delay(5);
- if(anjian3==0) aj3=1,ms2=0;
- }
- if(anjian3==1&&aj3==1)
- {
- nao2_fen++;
- if(nao2_fen==60) nao2_fen=0;
- changan=0;
- aj3=0;//按键1按下松开,小时++
- }
- if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj3==1&&changan==1&&ms2>=100)//快加
- {
- nao2_fen++;
- if(nao2_fen==60) nao2_fen=0;
- ms2=0;
- }
-
- if(anjian4==0&&aj4==0)//检测按键4
- {
- delay(5);
- if(anjian4==0) aj4=1,ms2=0;
- }
- if(anjian4==1&&aj4==1)
- {
- if(nao2_fen==0) nao2_fen=60;
- nao2_fen--;
- changan=0;
- aj4=0;//按键1按下松开,小时--
- }
- if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
- if(aj4==1&&changan==1&&ms2>=100)//快减
- {
- nao2_fen--;
- if(nao2_fen<0) nao2_fen=59;
- ms2=0;
- }
- if(anjian1==0&&aj1==0)//检测按键1
- {
- delay(5);
- if(anjian1==0) aj1=1;
- }
- if(anjian1==1&&aj1==1)
- {
- aj1=0;
- cd=4;
- IapErase(0x1000);
- IapProgram(0x1000, nao2_fen);//写小时值
- }
- if(anjian2==0&&aj2==0)//检测按键2
- {
- delay(5);
- if(anjian2==0) aj2=1;
- }
- if(anjian2==1&&aj2==1)
- {
- aj2=0;
- cd=20;//去菜单20
- IapErase(0x1000);
- IapProgram(0x1000, nao2_fen);//写小时值
- }
- }
- }
复制代码
串口驱动:
- #include <STC8.H>
- #include <uart.H>
- #include "intrins.h"
- #define FOSC 11059200UL
- #define BRT (65536 - FOSC / 115200 / 4)
- bit busy;
- //extern uchar tiaozheng[];
- char a=0;
- uchar huancun[15]={0};
- /*Z-------------A*/ //传送时间数据
- /*Z----------B*/ //传送闹钟数据
- /*Z----------C*/ //请求传送温度数据
- /***********************************************************************************************************
- * 函数名称: UartIsr()
- * 输入参数: void
- * 输出参数: void
- *
- * 功 能: 串口1中断(第4号中断)
- *
- * 备 注:将数据缓存在 huancun[]数组中
- *
- * 作 者: 范
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void UartIsr() interrupt 4
- {
- if (TI)
- {
- TI = 0;
- busy = 0;
- }
- if (RI)
- {
- RI = 0;
- switch(SBUF)
- {
- case 'Z': a=0;//时间数据传送开始标志
- break;
- case 'A': huancun[14]=1;//时间数据更新标志
- break;
- case 'B': huancun[14]=2;//闹钟数据更新标志
- break;
- case 'C': huancun[14]=3;//请求传送温度数据 标志
- break;
- case '0': huancun[a]=0,a++;
- break;
- case '1': huancun[a]=1,a++;
- break;
- case '2': huancun[a]=2,a++;
- break;
- case '3': huancun[a]=3,a++;
- break;
- case '4': huancun[a]=4,a++;
- break;
- case '5': huancun[a]=5,a++;
- break;
- case '6': huancun[a]=6,a++;
- break;
- case '7': huancun[a]=7,a++;
- break;
- case '8': huancun[a]=8,a++;
- break;
- case '9': huancun[a]=9,a++;
- break;
- default:break;
- }
- }
- }
- /***********************************************************************************************************
- * 函数名称: UartInit()
- * 输入参数: void
- * 输出参数: void
- *
- * 功 能: 串口1初始化
- *
- * 备 注:用定时器2做波特率发生器
- *
- * 作 者: 范
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void UartInit()
- {
- SCON = 0x50;
- T2L = BRT;
- T2H = BRT >> 8;
- AUXR = 0x15;
- busy = 0;
- }
- /***********************************************************************************************************
- * 函数名称: UartSend()
- * 输入参数: char
- * 输出参数: void
- *
- * 功 能: 串口1发送一个字符
- *
- * 备 注:无
- *
- * 作 者: 范
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void UartSend(char dat)
- {
- while (busy);
- busy = 1;
- SBUF = dat;
- }
- /***********************************************************************************************************
- * 函数名称: UartSendStr()
- * 输入参数: char *p
- * 输出参数: void
- *
- * 功 能: 串口1发送一个字符串
- *
- * 备 注:无
- *
- * 作 者: 范
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void UartSendStr(char *p)
- {
- while (*p)
- {
- UartSend(*p++);
- }
- }
复制代码
主函数:- #include <STC8.H>
- #include <caidan.H>//菜单
- #include <chushihua.H>//初始化
- #include <uart.H>
- #include <ds1302.H>
- #include "eeprom.h"
- extern uchar huancun[];//蓝牙接收缓存数据
- extern int nao_kaiguan,nao_shi,nao_fen,nao2_kaiguan,nao2_shi,nao2_fen;//eeprom数据
- extern int wendu;//温度信息
- uchar wenzhuan[5]={0,0,0,0,0};
- uchar i;
- uchar xiawu;//下午标志位
- /***********************************************************************************************************
- * 函数名称: main()
- * 输入参数: void
- * 输出参数: void
- *
- * 功 能: 主函数
- *
- * 备 注:程序的初始化、串口打印、串口接收手机端发来的数据、运行菜单程序
- *
- * 作 者: 范
- *
- * 完成时间: 2019.12.25
- ************************************************************************************************************/
- void main()
- {
- itin();
- UartSendStr("Uart Test !\r\n");
- while(1)
- {
- caidan();
- if(huancun[14]==1)//待时间更新数据
- {
- huancun[14]=0;//清标志位
- if(huancun[13]==1) xiawu=12;
- if(huancun[13]==0) xiawu=0;
- xieshijian(huancun[0]*10+huancun[1],huancun[2]*10+huancun[3],huancun[4]*10+huancun[5],huancun[6]*10+huancun[7]+xiawu,huancun[8]*10+huancun[9],huancun[10]*10+huancun[11],huancun[12]);//更新时间
- UartSendStr("时间信息已校准\r\n");
- }
- if(huancun[14]==2)//待闹钟更新数据
- {
- huancun[14]=0;//清标志位
- nao_kaiguan=huancun[0];
- nao_shi=huancun[1]*10+huancun[2];
- nao_fen=huancun[3]*10+huancun[4];
- nao2_kaiguan=huancun[5];
- nao2_shi=huancun[6]*10+huancun[7];
- nao2_fen=huancun[8]*10+huancun[9];
- IapErase(0x0200);
- IapProgram(0x0200, nao_kaiguan);//写闹钟1开关默认值
- IapErase(0x0400);
- IapProgram(0x0400, nao_shi);//写闹钟1小时默认值
- IapErase(0x0600);
- IapProgram(0x0600, nao_fen);//写闹钟1分钟默认值
- IapErase(0x0c00);
- IapProgram(0x0c00, nao2_kaiguan);//写闹钟2分钟默认值
- IapErase(0x0e00);
- IapProgram(0x0e00, nao2_shi);//写闹钟2分钟默认值
- IapErase(0x1000);
- IapProgram(0x1000, nao2_fen);//写闹钟2亮度默认值
- UartSendStr("闹钟信息已更改\r\n");
- }
- if(huancun[14]==3)//请求传送温度数据 标志
- {
- huancun[14]=0;//清标志位
- wenzhuan[0]=wendu%1000/100;
- if(wendu<10000) wenzhuan[0]=wendu%1000/100,wenzhuan[1]=wendu%100/10,wenzhuan[2]=wendu%10,wenzhuan[3]=0;
- if(wendu>10000) wenzhuan[0]=wendu%1000/100,wenzhuan[1]=wendu%100/10,wenzhuan[2]=wendu%10,wenzhuan[3]=1;
- for(i=0;i<4;i++)
- {
- switch(wenzhuan[i])
- {
- case 0 : UartSend('0');
- break;
- case 1 : UartSend('1');
- break;
- case 2 : UartSend('2');
- break;
- case 3 : UartSend('3');
- break;
- case 4 : UartSend('4');
- break;
- case 5 : UartSend('5');
- break;
- case 6 : UartSend('6');
- break;
- case 7 : UartSend('7');
- break;
- case 8 : UartSend('8');
- break;
- case 9 : UartSend('9');
- break;
- default:break;
- }
- }
- }
- }
- }
复制代码
由于代码较多,完整的代码、原理图、pcb图、手机app等 可以从附件中查找
123.zip
(17.73 MB, 下载次数: 53)
|