找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2702|回复: 3
打印 上一主题 下一主题
收起左侧

51单片机智能时钟设计 stc8系列 蓝牙通讯 App Inventor 2编写手机软件

[复制链接]
跳转到指定楼层
楼主
控制系统直接通过STC 8a8k64s4a12 单片机控制两组4位的数码管进行显示,使用DS1302时钟芯片进行获取时钟数据,使用DS18b20,获取温度信息,通过HC-05 蓝牙模块进行与手机app通讯,手机app由App Inventor 2编写 可以实现闹钟、用户设置数据的掉电保存,联机自动校时等功能。






作品实物如图所示:



数码管驱动:
  1. #include <STC8.H>
  2. #include <shumaguan.H>
  3. #include <delay.H>


  4. uchar code shuzi[]={
  5.                                                                                         0xc0,//0
  6.                                                                                         0xf9,//1
  7.                                                                                         0xa4,//2
  8.                                                                                         0xb0,//3
  9.                                                                                         0x99,//4
  10.                                                                                         0x92,//5
  11.                                                                                         0x82,//6
  12.                                                                                         0xf8,//7
  13.                                                                                         0x80,//8
  14.                                                                                         0x90,//9
  15.                                                                                         0x88,//A
  16.                                                                                         0x83,//B  11
  17.                                                                                         0xc6,//C  12
  18.                                                                                         0xa1,//D
  19.                                                                                         0x86,//E
  20.                                                                                         0x8e,//F
  21.                                                                                         0x8c,//P  16
  22.                                                                                         0x40,//0.
  23.                                                                                         0x79,//1.
  24.                                                                                         0x24,//2.
  25.                                                                                         0x30,//3.
  26.                                                                                         0x19,//4.
  27.                                                                                         0x12,//5.
  28.                                                                                         0x02,//6.
  29.                                                                                         0x78,//7.
  30.                                                                                         0x00,//8.
  31.                                                                                         0x10,//9.
  32.                                                                                         0xbf,//-   27
  33.                                                                                         0xff,// 熄灭 28
  34.                                                                                         0x7f,//. 29
  35.                                                                                         0x88,//A  30
  36.                                                                                         0xc7,//L   31
  37.                                                                                         0x87,//t 32
  38.                                                                                         0x86,//E 33
  39.                                                                                         0x8c,//P 34
  40.                                                                                         0x83,//b 35
  41.                                                                                         0x8b,//h 36
  42.                                                                                         0x8e,//F 37
  43.                                                                                         0xc8,//N 38
  44.                                                                                         0x9c,//小圈 39
  45.                                                                                         0xc1,//v 40
  46.                                                                                 };

  47. /***********************************************************************************************************
  48. * 函数名称: xianshi()
  49. * 输入参数:uchar,uchar,uchar,uchar,uchar,uchar,uchar,uchar
  50. * 输出参数: void
  51. *
  52. * 功    能: 数码管驱动程序
  53. *
  54. * 备    注:驱动8位数码管、形参的值对应数组shuzi里的位 、第几位形参对应数码管的位
  55. *
  56. * 完成时间: 2019.12.25
  57. ************************************************************************************************************/
  58.                                                                                 
  59. void xianshi(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar g,uchar h)////公阴
  60. {
  61.         P2=0xff-shuzi[a];
  62.         wei1=0;
  63.         delay(2);
  64.         wei1=1;
  65.         P2=0xff-shuzi[b];
  66.         wei2=0;
  67.         delay(2);
  68.         wei2=1;
  69.         P2=0xff-shuzi[c];
  70.         wei3=0;
  71.         delay(2);
  72.         wei3=1;
  73.         P2=0xff-shuzi[d];
  74.         wei4=0;
  75.         delay(2);
  76.         wei4=1;
  77.         P2=0xff-shuzi[e];
  78.         wei5=0;
  79.         delay(2);
  80.         wei5=1;
  81.         P2=0xff-shuzi[f];
  82.         wei6=0;
  83.         delay(2);
  84.         wei6=1;
  85.         P2=0xff-shuzi[g];
  86.         wei7=0;
  87.         delay(2);
  88.         wei7=1;
  89.         P2=0xff-shuzi[h];
  90.         wei8=0;
  91.         delay(2);
  92.         wei8=1;
  93. }

  94. /***********************************************************************************************************
  95. * 函数名称: xianshi5()
  96. * 输入参数:uchar,uchar,uchar,uchar,uchar
  97. * 输出参数: void
  98. *
  99. * 功    能: 数码管驱动程序
  100. *
  101. * 备    注:驱动5位数码管、形参的值对应数组shuzi里的位 、第几位形参对应数码管的位、显示周期短
  102. *
  103. *
  104. * 完成时间: 2019.12.25
  105. ************************************************************************************************************/

  106. void xianshi5(uchar d,uchar e,uchar f,uchar g,uchar h)////公阴
  107. {
  108.         wei1=wei2=wei3=1;
  109.         P2=0xff-shuzi[d];
  110.         wei4=0;
  111.         delay(2);
  112.         wei4=1;
  113.         P2=0xff-shuzi[e];
  114.         wei5=0;
  115.         delay(2);
  116.         wei5=1;
  117.         P2=0xff-shuzi[f];
  118.         wei6=0;
  119.         delay(2);
  120.         wei6=1;
  121.         P2=0xff-shuzi[g];
  122.         wei7=0;
  123.         delay(2);
  124.         wei7=1;
  125.         P2=0xff-shuzi[h];
  126.         wei8=0;
  127.         delay(2);
  128.         wei8=1;
  129. }
  130.                                                                                 
复制代码

ds1302驱动:
  1. #include <STC8.H>
  2. #include <ds1302.H>
  3. #include <delay.H>

  4. uchar shijian[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};//时间缓存数组                                                                                

  5. /***********************************************************************************************************
  6. * 函数名称: xie1302()
  7. * 输入参数:uchar
  8. * 输出参数: void
  9. *
  10. * 功    能: 写1302时序
  11. *
  12. * 备    注:向DS1302中写入形参
  13. *
  14. *
  15. * 完成时间: 2019.12.25
  16. ************************************************************************************************************/

  17. void xie1302(uchar dat)//写1302时序
  18. {
  19.         uchar i;
  20.         SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备
  21.         delayus(2); //稍微等待,使硬件做好准备
  22.         for(i=0;i<8;i++)
  23.         {
  24.                 IO=dat&0x01;//取出dat的第0位数据写入1302
  25.                 delayus(2); //稍微等待,使硬件做好准备
  26.                 SCLK=1; //上升沿写入数据
  27.                 delayus(2); //稍微等待,使硬件做好准备3
  28.                 SCLK=0; //重新拉低SCLK,形成脉冲
  29.                 dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位
  30.         }
  31. }

  32. /***********************************************************************************************************
  33. * 函数名称: du1302()
  34. * 输入参数:void
  35. * 输出参数: uchar
  36. *
  37. * 功    能:读1302时序
  38. *
  39. * 备    注:将读到的数据输出
  40. *
  41. *
  42. * 完成时间: 2019.12.25
  43. ************************************************************************************************************/

  44. uchar du1302(void)//读1302时序
  45. {
  46.         uchar i,dat;
  47.         delayus(2); //稍微等待,使硬件做好准备
  48.         for(i=0;i<8;i++)
  49.         {
  50.                 dat>>=1;//将dat的各数据位右移1位,因为先读出的是字节的最低位
  51.                 if(IO==1) //如果读出的数据是1
  52.      dat|=0x80; //将1取出,写在dat的最高位
  53.                 SCLK=1; //将SCLK置于高电平,为下降沿读出
  54.                 delayus(2); //稍微等待,使硬件做好准备
  55.                 SCLK=0; //拉低SCLK,形成脉冲下降沿
  56.                 delayus(2); //稍微等待,使硬件做好准备
  57.         }
  58.         return dat; //将读出的数据返回
  59. }

  60. /***********************************************************************************************************
  61. * 函数名称:xiemingling1302()
  62. * 输入参数:uchar ,uchar
  63. * 输出参数: void
  64. *
  65. * 功    能:向ds1302写指令、写数据
  66. *
  67. * 备    注:实际上是调用两次xie1302(),分别写入指令、数据
  68. *
  69. *
  70. * 完成时间: 2019.12.25
  71. ************************************************************************************************************/

  72. void xiemingling1302(uchar cmd,uchar dat)//写命令 数据
  73. {
  74.         CE=0;//禁止数据传递
  75.         SCLK=0; //确保写数据前SCLK被拉低
  76.         CE=1; //启动数据传输
  77.         delayus(2); //稍微等待,使硬件做好准备
  78.         xie1302(cmd); //写入命令字
  79.         xie1302(dat); //写数据
  80.         SCLK=1; //将时钟电平置于已知状态
  81.         CE=0; //禁止数据传递        
  82. }

  83. /***********************************************************************************************************
  84. * 函数名称: dumingling1302()
  85. * 输入参数: uchar
  86. * 输出参数: uchar
  87. *
  88. * 功    能:向ds1302写指令、读数据
  89. *
  90. * 备    注:实际上是调用一次xie1302()一次du1302(),分别写入指令、读出数据
  91. *
  92. *
  93. * 完成时间: 2019.12.25
  94. ************************************************************************************************************/

  95. uchar dumingling1302(uchar cmd)
  96. {
  97.         uchar dat;
  98.         CE=0; //拉低RST
  99.         SCLK=0; //确保写数居前SCLK被拉低
  100.         CE=1; //启动数据传输
  101.         xie1302(cmd); //写入命令字
  102.         dat=du1302(); //读出数据
  103.         SCLK=1; //将时钟电平置于已知状态
  104.         CE=0; //禁止数据传递
  105.         return dat; //将读出的数据返回
  106. }

  107. /***********************************************************************************************************
  108. * 函数名称: zhuanhuan()
  109. * 输入参数: void
  110. * 输出参数: void
  111. *
  112. * 功    能:读ds1302的时钟数据,并转换之后缓存在shijian[]数组的相应的位
  113. *
  114. * 备    注:实际上是分别读取ds1302的周、秒、分钟、小时、日、月、年信息,并根据数据手册取出其相应的位进行存储
  115. *
  116. *
  117. * 完成时间: 2019.12.25
  118. ************************************************************************************************************/

  119. void zhuanhuan()//转换
  120. {
  121.         
  122.         uchar a,b,c,d,e,f,g;
  123.                 g=dumingling1302(0x8B);//周
  124.                 f=dumingling1302(0x81);//秒
  125.                 e=dumingling1302(0x83);//分钟
  126.                 d=dumingling1302(0x85);//小时
  127.                 c=dumingling1302(0x87);//日
  128.                 b=dumingling1302(0x89);//月
  129.                 a=dumingling1302(0x8D);//年
  130.                                 
  131.                 shijian[12]=(g&0x07);//周转化个位               
  132.                 shijian[11]=(f&0x0f);//秒转化个位
  133.                 shijian[10]=(f&0x70)>>4;//秒转化十位
  134.                 shijian[9]=(e&0x0f);//分钟转化个位
  135.                 shijian[8]=(e&0x70)>>4;//分钟转化十位               
  136.                 shijian[7]=(d&0x0f);//小时转化个位
  137.                 shijian[6]=(d&0x30)>>4;//小时转化十位                                
  138.                 shijian[5]=(c&0x0f);//日转化个位
  139.                 shijian[4]=(c&0x70)>>4;//日转化十位
  140.                 shijian[3]=(b&0x0f);//月转化个位
  141.                 shijian[2]=(b&0x10)>>4;//月转化十位
  142.                 shijian[1]=(a&0x0f);//年转化个位
  143.                 shijian[0]=(a>>4);//年转化十位
  144. }

  145. /***********************************************************************************************************
  146. * 函数名称: xieshijian()
  147. * 输入参数: uchar ,uchar ,uchar ,uchar ,uchar , uchar ,uchar
  148. * 输出参数: void
  149. *
  150. * 功    能:向DS1302写入时钟数据
  151. *
  152. * 备    注:无
  153. *
  154. *
  155. * 完成时间: 2019.12.25
  156. ************************************************************************************************************/

  157. void xieshijian(uchar nian,uchar yue,uchar ri,uchar shi,uchar fen, uchar miao,uchar zhou)
  158. {
  159.         
  160.                 xiemingling1302(0x8E,0x00);//根据写状态寄存器命令字, 写入不保护指令
  161.                 xiemingling1302(0x80,((miao/10)<<4|(miao%10))); //根据写秒寄存器命令字,写入秒的初始值
  162.                 xiemingling1302(0x82,((fen/10)<<4|(fen%10))); //根据写分寄存器命令字,写入分的初始值
  163.                 xiemingling1302(0x84,((shi/10)<<4|(shi%10))); // 根据写小时寄存器命令字,写入小时的初始值
  164.                 xiemingling1302(0x86,((ri/10)<<4|(ri%10))); // 根据写日寄存器命令字,写入日的初始值
  165.                 xiemingling1302(0x88,((yue/10)<<4|(yue%10))); // 根据写月寄存器命令字,写入月的初始值
  166.                 xiemingling1302(0x8c,((nian/10)<<4|(nian%10))); //根据写年寄存器命令字,写入年的初始值
  167.                 xiemingling1302(0x8B,((zhou/10)<<4|(zhou%10))); //根据写周寄存器命令字,写入周的初始值

  168. }
复制代码

ds18b20驱动:
  1. #include "18b20.h"
  2. #include <delay.H>
  3. #include <shumaguan.H>

  4. int wendu;//温度信息
  5. bit deng=0;//等待标志位

  6. /***********************************************************************************************************
  7. * 函数名称: DS18b20Init()
  8. * 输入参数:void
  9. * 输出参数: void
  10. *
  11. * 功    能: ds18b20初始化程序
  12. *
  13. * 备    注:无
  14. *
  15. *
  16. * 完成时间: 2019.12.25
  17. ************************************************************************************************************/

  18. void DS18b20Init()
  19. {
  20.         if(deng==0)
  21.         {
  22.                 DQ = 0;                         //将总线拉低480us~960us
  23.                 Delay640us();
  24.                 DQ = 1;                        //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
  25.                 deng=1;
  26.         }
  27.         if(DQ&&deng==1)        //等待DS18B20拉低总线
  28.         {
  29.                 deng=0;
  30.                  Delay60us();
  31.         }
  32. }

  33. /***********************************************************************************************************
  34. * 函数名称: DS18b20WriteByte()
  35. * 输入参数:uchar
  36. * 输出参数: void
  37. *
  38. * 功    能: ds18b20写数据程序
  39. *
  40. * 备    注:注意时间的把握
  41. *
  42. *
  43. * 完成时间: 2019.12.25
  44. ************************************************************************************************************/

  45. void DS18b20WriteByte(uchar dat)
  46. {
  47.         uint i;

  48.         for(i=0; i<8; i++)
  49.         {
  50.                 DQ = 0;                       //每写入一位数据之前先把总线拉低1us
  51.                 Delay1us();
  52.                 DQ = dat & 0x01;  //然后写入一个数据,从最低位开始
  53.     Delay68us();
  54.                 DQ = 1;        //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
  55.                 dat >>= 1;
  56.         }
  57. }

  58. /***********************************************************************************************************
  59. * 函数名称: DS18b20ReadByte()
  60. * 输入参数: void
  61. * 输出参数: uchar
  62. *
  63. * 功    能: ds18b20读数据程序
  64. *
  65. * 备    注:注意时间的把握
  66. *
  67. *
  68. * 完成时间: 2019.12.25
  69. ************************************************************************************************************/

  70. uchar DS18b20ReadByte()
  71. {
  72.         uchar byte, bi;
  73.         uint i;        
  74.         
  75.         for(i=8; i>0; i--)
  76.         {
  77.                 DQ = 0;//先将总线拉低1us
  78.                 Delay1us();
  79.                 DQ = 1;//然后释放总线
  80.                 Delay6us();
  81.                 bi = DQ;         //读取数据,从最低位开始读取
  82.                 /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
  83.                 byte = (byte >> 1) | (bi << 7);                                                  
  84.                 Delay48us();                //读取完之后等待48us再接着读取下一个数
  85.         }                                
  86.         return byte;
  87. }

  88. /***********************************************************************************************************
  89. * 函数名称: DS18b20ChangTemp()
  90. * 输入参数: void
  91. * 输出参数: void
  92. *
  93. * 功    能: 向ds18b20写启动温度转换命令
  94. *
  95. * 备    注:
  96. *
  97. *
  98. * 完成时间: 2019.12.25
  99. ************************************************************************************************************/

  100. void DS18b20ChangTemp()
  101. {
  102.         DS18b20Init();
  103.         Delay100us();
  104.         DS18b20WriteByte(0xcc);                //跳过ROM操作命令                 
  105.         DS18b20WriteByte(0x44);            //温度转换命令
  106. }

  107. /***********************************************************************************************************
  108. * 函数名称: DS18b20ReadTempCom()
  109. * 输入参数: void
  110. * 输出参数: void
  111. *
  112. * 功    能: 向ds18b20写读取温度命令
  113. *
  114. * 备    注:
  115. *
  116. *
  117. * 完成时间: 2019.12.25
  118. ************************************************************************************************************/

  119. void DS18b20ReadTempCom()
  120. {        
  121.         DS18b20Init();
  122.         Delay100us();
  123.         DS18b20WriteByte(0xcc);         //跳过ROM操作命令
  124.         DS18b20WriteByte(0xbe);         //发送读取温度命令
  125. }

  126. /***********************************************************************************************************
  127. * 函数名称: DS18b20ReadTemp()
  128. * 输入参数: void
  129. * 输出参数: int
  130. *
  131. * 功    能: 读取ds18b20温度
  132. *
  133. * 备    注:读取ds18b20温度,并返回出来
  134. *
  135. *
  136. * 完成时间: 2019.12.25
  137. ************************************************************************************************************/

  138. int DS18b20ReadTemp()
  139. {
  140.         int temp = 0;
  141.         uchar tmh, tml;
  142.         DS18b20ChangTemp();                                 //先写入转换命令
  143.         DS18b20ReadTempCom();                        //然后等待转换完后发送读取温度命令
  144.         tml = DS18b20ReadByte();                //读取温度值共16位,先读低字节
  145.         tmh = DS18b20ReadByte();                //再读高字节
  146.         temp = tmh;
  147.         temp <<= 8;
  148.         temp |= tml;
  149.         if(tmh>0x07)
  150.         {
  151.                 temp=~temp+1;
  152.                 temp=temp*6.25;
  153.                 temp=temp+5;
  154.                 temp=temp/10;
  155.                 temp=temp+10000;
  156.         }
  157.         else
  158.         {
  159.                 temp=temp*6.25;
  160.                 temp=temp+5;
  161.                 temp=temp/10;
  162.         }
  163.         return temp;
  164. }

  165. /***********************************************************************************************************
  166. * 函数名称: xianshiwendu()
  167. * 输入参数: void
  168. * 输出参数: void
  169. *
  170. * 功    能: 转换温度数据
  171. *
  172. * 备    注:无
  173. *
  174. *
  175. * 完成时间: 2019.12.25
  176. ************************************************************************************************************/

  177. void xianshiwendu()
  178. {
  179.           wendu=DS18b20ReadTemp();
  180.                 if(wendu<10000) xianshi5(28,wendu%1000/100,wendu%100/10+17,wendu%10,12);
  181.                 if(wendu>10000) xianshi5(27,wendu%1000/100,wendu%100/10+17,wendu%10,12);

  182. }







复制代码

菜单程序(主要逻辑):
  1. #include <STC8.H>
  2. #include <caidan.H>
  3. #include <ds1302.H>
  4. #include <shumaguan.H>
  5. #include <anjian.H>
  6. #include <delay.H>
  7. #include <eeprom.h>
  8. #include <fengmingqi.H>
  9. #include <18b20.H>

  10. extern uchar shijian[13];               
  11. extern uint ms1;//用于闪烁计时
  12. extern uint ms2;//用于按键长按快加计时
  13. extern uint ms4;//用于循环显示计时
  14. bit changan=0;//长按标志位

  15. uint n=0;//计算平年闰年
  16. uint y=0;//计算月份
  17. bit runnian=1; //闰年标志位
  18. uchar yue=0;//大月标志位 1大月 2 2月 0小月

  19. uchar tiaozheng[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};//调整时间数据暂存数组

  20. uchar cd=0;//菜单
  21. bit aj1,aj2,aj3,aj4;

  22. extern int nao_kaiguan,nao_shi,nao_fen,nao2_kaiguan,nao2_shi,nao2_fen,wendu_kaiguan;//eeprom数据

  23. bit s;//闹钟1、2切换标志位

  24. extern int wendu;//温度信息

  25. /***********************************************************************************************************
  26. * 函数名称: caidan()
  27. * 输入参数: void
  28. * 输出参数: void
  29. *
  30. * 功    能: 菜单程序
  31. *
  32. * 备    注: 该程序是本作品的核心  
  33. *0级菜单用于正常显示时间、日期、温度;
  34. *1级菜单用于闪烁全部的时间(提示是否修改)
  35. *2级菜单用于显示日期的全部闪烁(提示是否修改)
  36. *3级菜单用于闪烁al(提示是否修改闹钟信息)
  37. *4级菜单用于闪烁temp(提示是否修改温度开关)   
  38. *5级菜单预留
  39. *10级菜单用于闪烁小时位                       
  40. *11级菜单用于闪烁分钟位
  41. *12级菜单用于闪烁秒位                        
  42. *13级级菜单用于闪烁年位
  43. *14级菜单用于闪烁月位                          
  44. *15级级菜单用于闪烁日位
  45. *16级菜单用于闪烁闹钟一的开关                  
  46. *17级级菜单用于闪烁闹钟一的时位
  47. *18级菜单用于闪烁闹钟一的分位               
  48. *19级级菜单用于闪烁温度的开关
  49. *20级菜单用于闪烁闹钟一闹钟二选择位         
  50. *21级菜单用于闪烁闹钟二的开关
  51. *22级菜单用于闪烁闹钟二的时位               
  52. *23级菜单用于闪烁闹钟二的分位
  53. *
  54. *
  55. * 完成时间: 2019.12.25
  56. ************************************************************************************************************/

  57. void caidan()
  58. {
  59.         zhuanhuan();//获取时间信息
  60.         naozhong();//检测闹钟
  61.         if(cd==0)//0级菜单
  62.         {
  63.                 if(ms4>0&&ms4<10000)        xianshi(shijian[6],shijian[7],27,shijian[8],shijian[9],27,shijian[10],shijian[11]);
  64.     if(ms4>10000&&ms4<10100)         wendu=DS18b20ReadTemp();               
  65.                 if(ms4>10100&&ms4<15000) xianshi(2,0,shijian[0],shijian[1]+17,shijian[2],shijian[3]+17,shijian[4],shijian[5]);
  66.                 if(wendu_kaiguan==0&&ms4>15000) ms4=0;
  67.                 if(ms4>15200&&ms4<20000) xianshiwendu();         
  68.                 if(ms4>20000) ms4=0;
  69.                 if(anjian1==0&&aj1==0)
  70.                 {
  71.                         delay(5);
  72.                         if(anjian1==0) aj1=1;
  73.                 }
  74.                 if(anjian1==1&&aj1==1) aj1=0,cd=1,ms1=0;//按键1按下松开,去1级菜单        
  75.         }
  76.         if(cd==1)//1级菜单 闪烁全部时间
  77.         {
  78.                 if(ms1>0&&ms1<300)        xianshi(shijian[6],shijian[7],27,shijian[8],shijian[9],27,shijian[10],shijian[11]);
  79.                 if(ms1>300&&ms1<600)  xianshi(28,28,27,28,28,27,28,28);
  80.                 if(ms1>600) ms1=0;
  81.                
  82.                 if(anjian1==0&&aj1==0)//检测按键1
  83.                 {
  84.                         delay(5);
  85.                         if(anjian1==0) aj1=1;
  86.                 }
  87.                 if(anjian1==1&&aj1==1) aj1=0,cd=2,ms1=0;//按键1按下松开,去2级菜单
  88.                
  89.                 if(anjian2==0&&aj2==0)//检测按键2
  90.                 {
  91.                         delay(5);
  92.                         if(anjian2==0) aj2=1;
  93.                 }
  94.                 if(anjian2==1&&aj2==1)
  95.                 {
  96.                         tiaozheng[0]=shijian[0];
  97.                         tiaozheng[1]=shijian[1];
  98.                         tiaozheng[2]=shijian[2];
  99.                         tiaozheng[3]=shijian[3];
  100.                         tiaozheng[4]=shijian[4];
  101.                         tiaozheng[5]=shijian[5];
  102.                         tiaozheng[6]=shijian[6];
  103.                         tiaozheng[7]=shijian[7];
  104.                         tiaozheng[8]=shijian[8];
  105.                         tiaozheng[9]=shijian[9];
  106.                         tiaozheng[10]=shijian[10];
  107.                         tiaozheng[11]=shijian[11];
  108.                         aj2=0;
  109.                         cd=10;
  110.                         ms1=0;//按键2按下松开,去10级菜单
  111.                 }
  112.         }
  113.         
  114.         if(cd==2)//2级菜单 闪烁全部日期
  115.         {
  116.                 if(ms1>0&&ms1<300)        xianshi(2,0,shijian[0],shijian[1]+17,shijian[2],shijian[3]+17,shijian[4],shijian[5]);
  117.                 if(ms1>300&&ms1<600)  xianshi(28,28,28,29,28,29,28,28);
  118.                 if(ms1>600) ms1=0;
  119.                
  120.                 if(anjian1==0&&aj1==0)//检测按键1
  121.                 {
  122.                         delay(5);
  123.                         if(anjian1==0) aj1=1;
  124.                 }
  125.                 if(anjian1==1&&aj1==1) aj1=0,cd=3,ms1=0;//按键1按下松开,去3级菜单
  126.                
  127.                 if(anjian2==0&&aj2==0)//检测按键2
  128.                 {
  129.                         delay(5);
  130.                         if(anjian2==0) aj2=1;
  131.                 }
  132.                 if(anjian2==1&&aj2==1)
  133.                 {
  134.                         tiaozheng[0]=shijian[0];
  135.                         tiaozheng[1]=shijian[1];
  136.                         tiaozheng[2]=shijian[2];
  137.                         tiaozheng[3]=shijian[3];
  138.                         tiaozheng[4]=shijian[4];
  139.                         tiaozheng[5]=shijian[5];
  140.                         tiaozheng[6]=shijian[6];
  141.                         tiaozheng[7]=shijian[7];
  142.                         tiaozheng[8]=shijian[8];
  143.                         tiaozheng[9]=shijian[9];
  144.                         tiaozheng[10]=shijian[10];
  145.                         tiaozheng[11]=shijian[11];

  146.                         aj2=0;
  147.                         cd=13;
  148.                         ms1=0;//按键2按下松开,去13级菜单
  149.                 }
  150.         }
  151.         if(cd==3)//3级菜单 显示al闹钟
  152.         {
  153.                 if(ms1>0&&ms1<300)        xianshi(27,27,27,30,31,27,27,27);
  154.                 if(ms1>300&&ms1<600)  xianshi(27,27,27,28,28,27,27,27);
  155.                 if(ms1>600) ms1=0;
  156.         
  157.                  if(anjian1==0&&aj1==0)//检测按键1
  158.           {
  159.                   delay(5);
  160.                   if(anjian1==0) aj1=1;
  161.           }
  162.           if(anjian1==1&&aj1==1) aj1=0,cd=4,ms1=0;//按键1按下松开,去4级菜单
  163.                
  164.                 if(anjian2==0&&aj2==0)//检测按键2
  165.                 {
  166.                         delay(5);
  167.                         if(anjian2==0) aj2=1;
  168.                 }
  169.                 if(anjian2==1&&aj2==1)
  170.                 {
  171.                         aj2=0;
  172.                         cd=20;
  173.                         dunaozhong();//读取闹钟数据
  174.                         ms1=0;//按键2按下松开,去20级菜单
  175.                 }
  176.         }
  177.         
  178.         if(cd==4)//4级菜单 显示temp 温度
  179.         {
  180.                 if(ms1>0&&ms1<300)        xianshi(27,27,32,33,34,33,27,27);
  181.                 if(ms1>300&&ms1<600)  xianshi(27,27,28,28,28,28,27,27);
  182.                 if(ms1>600) ms1=0;
  183.                
  184.                 if(anjian1==0&&aj1==0)//检测按键1
  185.           {
  186.                         
  187.                   delay(5);
  188.                   if(anjian1==0) aj1=1;
  189.           }
  190.           if(anjian1==1&&aj1==1) aj1=0,cd=0,ms1=0;//按键1按下松开,去0级菜单
  191.                
  192.                 if(anjian2==0&&aj2==0)//检测按键2
  193.                 {
  194.                         delay(5);
  195.                         if(anjian2==0) aj2=1;
  196.                 }
  197.                 if(anjian2==1&&aj2==1)
  198.                 {
  199.                         aj2=0;
  200.                         cd=19;
  201.                         wendu_kaiguan=IapRead(0x0800);
  202.                         ms1=0;//按键2按下松开,去19级菜单
  203.                 }               
  204.         }
  205.         
  206.         if(cd==5)//5级菜单 预留
  207.         {
  208. //                if(ms1>0&&ms1<300)        xianshi(27,27,35,31,32,36,27,27);
  209. //                if(ms1>300&&ms1<600)  xianshi(27,27,28,28,28,28,27,27);
  210. //                if(ms1>600) ms1=0;
  211. //               
  212. //                if(anjian1==0&&aj1==0)//检测按键1
  213. //          {
  214. //                  delay(5);
  215. //                  if(anjian1==0) aj1=1;
  216. //          }
  217. //          if(anjian1==1&&aj1==1) aj1=0,cd=0,ms1=0;//按键1按下松开,去0级菜单
  218. //                if(anjian2==0&&aj2==0)//检测按键2
  219. //                {
  220. //                        delay(5);
  221. //                        if(anjian2==0) aj2=1;
  222. //                }
  223. //                if(anjian2==1&&aj2==1)
  224. //                {
  225. //                        aj2=0;
  226. //                        cd=20;//按键2按下松开,去20级菜单
  227. //                }               

  228.         }
  229.         
  230.         while(cd==10)//10级菜单  小时位闪烁调整
  231.         {
  232.                 if(ms1>0&&ms1<300)        xianshi(tiaozheng[6],tiaozheng[7],27,tiaozheng[8],tiaozheng[9],27,tiaozheng[10],tiaozheng[11]);
  233.                 if(ms1>300&&ms1<600)  xianshi(28,28,27,tiaozheng[8],tiaozheng[9],27,tiaozheng[10],tiaozheng[11]);
  234.                 if(ms1>600) ms1=0;
  235.                 if(ms1>300&&changan==1) ms1=0;
  236.                
  237.                
  238.                
  239.                 if(anjian3==0&&aj3==0)//检测按键3
  240.           {
  241.                   delay(5);
  242.                   if(anjian3==0) aj3=1,ms2=0;
  243.           }
  244.           if(anjian3==1&&aj3==1)
  245.                 {
  246.                         tiaozheng[7]++;
  247.                         if((tiaozheng[6]==2)&&(tiaozheng[7]==4)) tiaozheng[6]=tiaozheng[7]=0;
  248.                         if(((tiaozheng[6]==0)||(tiaozheng[6]==1))&&(tiaozheng[7]==10)) tiaozheng[6]++,tiaozheng[7]=0;
  249.                         changan=0;
  250.                         aj3=0;//按键1按下松开,小时++
  251.                 }
  252.                 if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  253.                 if(aj3==1&&changan==1&&ms2>=100)//快加
  254.                 {
  255.                         tiaozheng[7]++;
  256.                         if((tiaozheng[6]==2)&&(tiaozheng[7]==4)) tiaozheng[6]=tiaozheng[7]=0;
  257.                         if(((tiaozheng[6]==0)||(tiaozheng[6]==1))&&(tiaozheng[7]==10)) tiaozheng[6]++,tiaozheng[7]=0;
  258.                         ms2=0;
  259.                 }
  260.                
  261.                 if(anjian4==0&&aj4==0)//检测按键4
  262.           {
  263.                   delay(5);
  264.                   if(anjian4==0) aj4=1,ms2=0;
  265.           }
  266.           if(anjian4==1&&aj4==1)
  267.                 {
  268.                         tiaozheng[7]--;
  269.                         if((tiaozheng[6]==0)&&(tiaozheng[7]>100)) tiaozheng[6]=2,tiaozheng[7]=3;
  270.                         if(((tiaozheng[6]==2)||(tiaozheng[6]==1))&&(tiaozheng[7]>100)) tiaozheng[6]--,tiaozheng[7]=9;
  271.                         changan=0;
  272.                         aj4=0;//按键1按下松开,小时--
  273.                 }
  274.                 if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  275.                 if(aj4==1&&changan==1&&ms2>=100)//快减
  276.                 {
  277.                         tiaozheng[7]--;
  278.                         if((tiaozheng[6]==0)&&(tiaozheng[7]>100)) tiaozheng[6]=2,tiaozheng[7]=3;
  279.                         if(((tiaozheng[6]==2)||(tiaozheng[6]==1))&&(tiaozheng[7]>100)) tiaozheng[6]--,tiaozheng[7]=9;
  280.                         ms2=0;
  281.                 }
  282.                
  283.                
  284.                 if(anjian2==0&&aj2==0)//检测按键2
  285.                 {
  286.                         delay(5);
  287.                         if(anjian2==0) aj2=1;
  288.                 }
  289.                 if(anjian2==1&&aj2==1)
  290.                 {
  291.                         aj2=0;
  292.                         cd=11;
  293.                         ms1=0;//按键2按下松开,去11级菜单
  294.                 }

  295.                 if(anjian1==0&&aj1==0)//检测按键1
  296.                 {
  297.                         delay(5);
  298.                         if(anjian1==0) aj1=1;
  299.                 }
  300.                 if(anjian1==1&&aj1==1)
  301.                 {
  302.                         aj1=0;
  303.                         cd=2;
  304.                         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]);
  305.                         ms1=0;//按键1按下松开,去2级菜单
  306.                 }
  307.         }
  308.         while(cd==11)//11级菜单  分钟位闪烁调整
  309.         {
  310.                 if(ms1>0&&ms1<300)        xianshi(tiaozheng[6],tiaozheng[7],27,tiaozheng[8],tiaozheng[9],27,tiaozheng[10],tiaozheng[11]);
  311.                 if(ms1>300&&ms1<600)  xianshi(tiaozheng[6],tiaozheng[7],27,28,28,27,tiaozheng[10],tiaozheng[11]);
  312.                 if(ms1>600) ms1=0;
  313.                 if(ms1>300&&changan==1) ms1=0;
  314.                
  315.                 if(anjian3==0&&aj3==0)//检测按键3
  316.           {
  317.                   delay(5);
  318.                   if(anjian3==0) aj3=1,ms2=0;
  319.           }
  320.           if(anjian3==1&&aj3==1)
  321.                 {
  322.                         tiaozheng[9]++;
  323.                         if(tiaozheng[9]==10) tiaozheng[8]++,tiaozheng[9]=0;
  324.                         if(tiaozheng[8]==6) tiaozheng[8]=tiaozheng[9]=0;
  325.                         changan=0;
  326.                         aj3=0;//按键1按下松开,小时++
  327.                 }
  328.                 if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  329.                 if(aj3==1&&changan==1&&ms2>=100)//快加
  330.                 {
  331.                         tiaozheng[9]++;
  332.                         if(tiaozheng[9]==10) tiaozheng[8]++,tiaozheng[9]=0;
  333.                         if(tiaozheng[8]==6) tiaozheng[8]=tiaozheng[9]=0;
  334.                         ms2=0;
  335.                 }
  336.                
  337.                 if(anjian4==0&&aj4==0)//检测按键4
  338.           {
  339.                   delay(5);
  340.                   if(anjian4==0) aj4=1,ms2=0;
  341.           }
  342.           if(anjian4==1&&aj4==1)
  343.                 {
  344.                         tiaozheng[9]--;
  345.                         if(tiaozheng[9]>100) tiaozheng[8]--,tiaozheng[9]=9;
  346.                         if(tiaozheng[8]>100) tiaozheng[8]=5,tiaozheng[9]=9;
  347.                         changan=0;
  348.                         aj4=0;//按键1按下松开,小时--
  349.                 }
  350.                 if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  351.                 if(aj4==1&&changan==1&&ms2>=100)//快减
  352.                 {
  353.                         tiaozheng[9]--;
  354.                         if(tiaozheng[9]>100) tiaozheng[8]--,tiaozheng[9]=9;
  355.                         if(tiaozheng[8]>100) tiaozheng[8]=5,tiaozheng[9]=9;
  356.                         ms2=0;
  357.                 }

  358.                 if(anjian2==0&&aj2==0)//检测按键2
  359.                 {
  360.                         delay(5);
  361.                         if(anjian2==0) aj2=1;
  362.                 }
  363.                 if(anjian2==1&&aj2==1)
  364.                 {
  365.                         aj2=0;
  366.                         cd=12;
  367.                         ms1=0;//按键2按下松开,去12级菜单
  368.                 }

  369.                 if(anjian1==0&&aj1==0)//检测按键1
  370.                 {
  371.                         delay(5);
  372.                         if(anjian1==0) aj1=1;
  373.                 }
  374.                 if(anjian1==1&&aj1==1)
  375.                 {
  376.                         aj1=0;
  377.                         cd=2;
  378.                         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]);
  379.                         ms1=0;//按键1按下松开,去2级菜单
  380.                 }               
  381.         
  382.         }

  383.         while(cd==12)//12级菜单  秒位闪烁调整
  384.         {
  385.                 if(ms1>0&&ms1<300)        xianshi(tiaozheng[6],tiaozheng[7],27,tiaozheng[8],tiaozheng[9],27,tiaozheng[10],tiaozheng[11]);
  386.                 if(ms1>300&&ms1<600)  xianshi(tiaozheng[6],tiaozheng[7],27,tiaozheng[8],tiaozheng[9],27,28,28);
  387.                 if(ms1>600) ms1=0;
  388.                 if(ms1>300&&changan==1) ms1=0;
  389.                
  390.                 if(anjian3==0&&aj3==0)//检测按键3
  391.           {
  392.                   delay(5);
  393.                   if(anjian3==0) aj3=1,ms2=0;
  394.           }
  395.           if(anjian3==1&&aj3==1)
  396.                 {
  397.                         tiaozheng[11]++;
  398.                         if(tiaozheng[11]==10) tiaozheng[10]++,tiaozheng[11]=0;
  399.                         if(tiaozheng[10]==6) tiaozheng[10]=tiaozheng[11]=0;
  400.                         changan=0;
  401.                         aj3=0;//按键1按下松开,小时++
  402.                 }
  403.                 if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  404.                 if(aj3==1&&changan==1&&ms2>=100)//快加
  405.                 {
  406.                         tiaozheng[11]++;
  407.                         if(tiaozheng[11]==10) tiaozheng[10]++,tiaozheng[11]=0;
  408.                         if(tiaozheng[10]==6) tiaozheng[10]=tiaozheng[11]=0;
  409.                         ms2=0;
  410.                 }
  411.                
  412.                 if(anjian4==0&&aj4==0)//检测按键4
  413.           {
  414.                   delay(5);
  415.                   if(anjian4==0) aj4=1,ms2=0;
  416.           }
  417.           if(anjian4==1&&aj4==1)
  418.                 {
  419.                         tiaozheng[11]--;
  420.                         if(tiaozheng[11]>100) tiaozheng[10]--,tiaozheng[11]=9;
  421.                         if(tiaozheng[10]>100) tiaozheng[10]=5,tiaozheng[11]=9;
  422.                         changan=0;
  423.                         aj4=0;//按键1按下松开,小时--
  424.                 }
  425.                 if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  426.                 if(aj4==1&&changan==1&&ms2>=100)//快减
  427.                 {
  428.                         tiaozheng[11]--;
  429.                         if(tiaozheng[11]>100) tiaozheng[10]--,tiaozheng[11]=9;
  430.                         if(tiaozheng[10]>100) tiaozheng[10]=5,tiaozheng[11]=9;
  431.                         ms2=0;
  432.                 }

  433.                 if(anjian2==0&&aj2==0)//检测按键2
  434.                 {
  435.                         delay(5);
  436.                         if(anjian2==0) aj2=1;
  437.                 }
  438.                 if(anjian2==1&&aj2==1)
  439.                 {
  440.                         aj2=0;
  441.                         cd=10;
  442.                         ms1=0;//按键2按下松开,去10级菜单
  443.                 }

  444.                 if(anjian1==0&&aj1==0)//检测按键1
  445.                 {
  446.                         delay(5);
  447.                         if(anjian1==0) aj1=1;
  448.                 }
  449.                 if(anjian1==1&&aj1==1)
  450.                 {
  451.                         aj1=0;
  452.                         cd=2;
  453.                         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]);
  454.                         ms1=0;//按键1按下松开,去2级菜单
  455.                 }               
  456.         }
  457.         while(cd==13)//第13级菜单 年位闪烁
  458.         {
  459.                 if(ms1>0&&ms1<300)        xianshi(2,0,tiaozheng[0],tiaozheng[1]+17,tiaozheng[2],tiaozheng[3]+17,tiaozheng[4],tiaozheng[5]);
  460.                 if(ms1>300&&ms1<600)  xianshi(28,28,28,29,tiaozheng[2],tiaozheng[3]+17,tiaozheng[4],tiaozheng[5]);
  461.                 if(ms1>600) ms1=0;
  462.                 if(ms1>300&&changan==1) ms1=0;

  463.                
  464.                 if(anjian3==0&&aj3==0)//检测按键3
  465.           {
  466.                   delay(5);
  467.                   if(anjian3==0) aj3=1,ms2=0;
  468.           }
  469.           if(anjian3==1&&aj3==1)
  470.                 {
  471.                         tiaozheng[1]++;
  472.                         if(tiaozheng[1]==10) tiaozheng[0]++,tiaozheng[1]=0;
  473.                         if(tiaozheng[0]==10) tiaozheng[0]=tiaozheng[1]=0;
  474.                         changan=0;
  475.                         aj3=0;//按键1按下松开,小时++
  476.                 }
  477.                 if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  478.                 if(aj3==1&&changan==1&&ms2>=100)//快加
  479.                 {
  480.                         tiaozheng[1]++;
  481.                         if(tiaozheng[1]==10) tiaozheng[0]++,tiaozheng[1]=0;
  482.                         if(tiaozheng[0]==10) tiaozheng[0]=tiaozheng[1]=0;
  483.                         ms2=0;
  484.                 }
  485.                 if(anjian4==0&&aj4==0)//检测按键4
  486.           {
  487.                   delay(5);
  488.                   if(anjian4==0) aj4=1,ms2=0;
  489.           }
  490.           if(anjian4==1&&aj4==1)
  491.                 {
  492.                         tiaozheng[1]--;
  493.                         if(tiaozheng[1]>100) tiaozheng[0]--,tiaozheng[1]=9;
  494.                         if(tiaozheng[0]>100) tiaozheng[0]=9,tiaozheng[1]=9;
  495.                         changan=0;
  496.                         aj4=0;//按键1按下松开,小时--
  497.                 }
  498.                 if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  499.                 if(aj4==1&&changan==1&&ms2>=100)//快减
  500.                 {
  501.                         tiaozheng[1]--;
  502.                         if(tiaozheng[1]>100) tiaozheng[0]--,tiaozheng[1]=9;
  503.                         if(tiaozheng[0]>100) tiaozheng[0]=9,tiaozheng[1]=9;
  504.                         ms2=0;
  505.                 }
  506.                
  507.                 if(anjian2==0&&aj2==0)//检测按键2
  508.                 {
  509.                         delay(5);
  510.                         if(anjian2==0) aj2=1;
  511.                 }
  512.                 if(anjian2==1&&aj2==1)
  513.                 {
  514.                         aj2=0;
  515.                         cd=14;
  516.                         ms1=0;//按键2按下松开,去14级菜单
  517.                 }               
  518.                 if(anjian1==0&&aj1==0)//检测按键1
  519.                 {
  520.                         delay(5);
  521.                         if(anjian1==0) aj1=1;
  522.                 }
  523.                 if(anjian1==1&&aj1==1)
  524.                 {
  525.                         aj1=0;
  526.                         cd=3;
  527.                         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]);
  528.                         ms1=0;//按键1按下松开,去3级菜单
  529.                 }               
  530.         }
  531.         
  532.         while(cd==14)//第14级菜单 月位闪烁
  533.         {
  534.                 if(ms1>0&&ms1<300)        xianshi(2,0,tiaozheng[0],tiaozheng[1]+17,tiaozheng[2],tiaozheng[3]+17,tiaozheng[4],tiaozheng[5]);
  535.                 if(ms1>300&&ms1<600)  xianshi(2,0,tiaozheng[0],tiaozheng[1]+17,28,28,tiaozheng[4],tiaozheng[5]);
  536.                 if(ms1>600) ms1=0;
  537.                 if(ms1>300&&changan==1) ms1=0;

  538.                
  539.                 if(anjian3==0&&aj3==0)//检测按键3
  540.           {
  541.                   delay(5);
  542.                   if(anjian3==0) aj3=1,ms2=0;
  543.           }
  544.           if(anjian3==1&&aj3==1)
  545.                 {
  546.                         tiaozheng[3]++;
  547.                         if(tiaozheng[3]==10) tiaozheng[2]++,tiaozheng[3]=0;
  548.                         if(tiaozheng[2]==1&&tiaozheng[3]==3) tiaozheng[2]=0,tiaozheng[3]=1;
  549.                         changan=0;
  550.                         aj3=0;//按键1按下松开,小时++
  551.                 }
  552.                 if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  553.                 if(aj3==1&&changan==1&&ms2>=100)//快加
  554.                 {
  555.                         tiaozheng[3]++;
  556.                         if(tiaozheng[3]==10) tiaozheng[2]++,tiaozheng[3]=0;
  557.                         if(tiaozheng[2]==1&&tiaozheng[3]==3) tiaozheng[2]=0,tiaozheng[3]=1;
  558.                         ms2=0;
  559.                 }
  560.                 if(anjian4==0&&aj4==0)//检测按键4
  561.           {
  562.                   delay(5);
  563.                   if(anjian4==0) aj4=1,ms2=0;
  564.           }
  565.           if(anjian4==1&&aj4==1)
  566.                 {
  567.                         tiaozheng[3]--;
  568.                         if(tiaozheng[3]>100) tiaozheng[2]--,tiaozheng[3]=9;
  569.                         if(tiaozheng[2]==0&&tiaozheng[3]==0) tiaozheng[2]=1,tiaozheng[3]=2;
  570.                         changan=0;
  571.                         aj4=0;//按键1按下松开,小时--
  572.                 }
  573.                 if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  574.                 if(aj4==1&&changan==1&&ms2>=100)//快减
  575.                 {
  576.                         tiaozheng[3]--;
  577.                         if(tiaozheng[3]>100) tiaozheng[2]--,tiaozheng[3]=9;
  578.                         if(tiaozheng[2]==0&&tiaozheng[3]==0) tiaozheng[2]=1,tiaozheng[3]=2;
  579.                         ms2=0;
  580.                 }
  581.                
  582.                 if(anjian2==0&&aj2==0)//检测按键2
  583.                 {
  584.                         delay(5);
  585.                         if(anjian2==0) aj2=1;
  586.                 }
  587.                 if(anjian2==1&&aj2==1)
  588.                 {
  589.                         aj2=0;
  590.                         cd=15;
  591.                         n=2000+tiaozheng[0]*10+tiaozheng[1];//计算平年闰年
  592.                         y=tiaozheng[2]*10+tiaozheng[3];
  593.                         if((n%4==0)&&(n%100!=0)) runnian=1; //闰年标志位
  594.                         else runnian=0;
  595.                         if(y==1||y==3||y==5||y==7||y==8||y==10||y==12) yue=1;//大月标志位
  596.                         else if(y==2) yue=2;//2月标志位
  597.                         else yue=0;//小月标志位
  598.                         ms1=0;//按键2按下松开,去15级菜单
  599.                 }               
  600.                 if(anjian1==0&&aj1==0)//检测按键1
  601.                 {
  602.                         delay(5);
  603.                         if(anjian1==0) aj1=1;
  604.                 }
  605.                 if(anjian1==1&&aj1==1)
  606.                 {
  607.                         aj1=0;
  608.                         cd=3;
  609.                         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]);
  610.                         ms1=0;//按键1按下松开,去3级菜单
  611.                 }               
  612.         }
  613.         while(cd==15)//第15级菜单 日位闪烁
  614.         {
  615.                 if(ms1>0&&ms1<300)        xianshi(2,0,tiaozheng[0],tiaozheng[1]+17,tiaozheng[2],tiaozheng[3]+17,tiaozheng[4],tiaozheng[5]);
  616.                 if(ms1>300&&ms1<600)  xianshi(2,0,tiaozheng[0],tiaozheng[1]+17,tiaozheng[2],tiaozheng[3]+17,28,28);
  617.                 if(ms1>600) ms1=0;
  618.                 if(ms1>300&&changan==1) ms1=0;

  619.                
  620.                 if(anjian3==0&&aj3==0)//检测按键3
  621.           {
  622.                   delay(5);
  623.                   if(anjian3==0) aj3=1,ms2=0;
  624.           }
  625.           if(anjian3==1&&aj3==1)
  626.                 {
  627.                         tiaozheng[5]++;
  628.                         if(tiaozheng[5]==10) tiaozheng[4]++,tiaozheng[5]=0;
  629.                         if(runnian==1&&yue==2&&tiaozheng[4]==3) tiaozheng[4]=0,tiaozheng[5]=1;
  630.                         if(runnian==0&&yue==2&&tiaozheng[4]==2&&tiaozheng[5]==9) tiaozheng[4]=0,tiaozheng[5]=1;
  631.                         if(yue==1&&tiaozheng[4]==3&&tiaozheng[5]==2) tiaozheng[4]=0,tiaozheng[5]=1;
  632.                         if(yue==0&&tiaozheng[4]==3&&tiaozheng[5]==1) tiaozheng[4]=0,tiaozheng[5]=1;

  633.                         changan=0;
  634.                         aj3=0;//按键1按下松开,日++
  635.                 }
  636.                 if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  637.                 if(aj3==1&&changan==1&&ms2>=100)//快加
  638.                 {
  639.                         tiaozheng[5]++;
  640.                         if(tiaozheng[5]==10) tiaozheng[4]++,tiaozheng[5]=0;
  641.                         if(runnian==1&&yue==2&&tiaozheng[4]==3) tiaozheng[4]=0,tiaozheng[5]=1;
  642.                         if(runnian==0&&yue==2&&tiaozheng[4]==2&&tiaozheng[5]==9) tiaozheng[4]=0,tiaozheng[5]=1;
  643.                         if(yue==1&&tiaozheng[4]==3&&tiaozheng[5]==2) tiaozheng[4]=0,tiaozheng[5]=1;
  644.                         if(yue==0&&tiaozheng[4]==3&&tiaozheng[5]==1) tiaozheng[4]=0,tiaozheng[5]=1;
  645.                         ms2=0;
  646.                 }
  647.                 if(anjian4==0&&aj4==0)//检测按键4
  648.           {
  649.                   delay(5);
  650.                   if(anjian4==0) aj4=1,ms2=0;
  651.           }
  652.           if(anjian4==1&&aj4==1)
  653.                 {
  654.                         tiaozheng[5]--;
  655.                         if(tiaozheng[5]>100) tiaozheng[4]--,tiaozheng[5]=9;
  656.                         if(runnian==1&&yue==2&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=2,tiaozheng[5]=9;
  657.                         if(runnian==0&&yue==2&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=2,tiaozheng[5]=8;
  658.                         if(yue==1&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=3,tiaozheng[5]=1;
  659.                         if(yue==0&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=3,tiaozheng[5]=0;
  660.                         changan=0;
  661.                         aj4=0;//按键1按下松开,日--
  662.                 }
  663.                 if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  664.                 if(aj4==1&&changan==1&&ms2>=100)//快减
  665.                 {
  666.                         tiaozheng[5]--;
  667.                         if(tiaozheng[5]>100) tiaozheng[4]--,tiaozheng[5]=9;
  668.                         if(runnian==1&&yue==2&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=2,tiaozheng[5]=9;
  669.                         if(runnian==0&&yue==2&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=2,tiaozheng[5]=8;
  670.                         if(yue==1&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=3,tiaozheng[5]=1;
  671.                         if(yue==0&&tiaozheng[4]==0&&tiaozheng[5]==0) tiaozheng[4]=3,tiaozheng[5]=0;
  672.                         ms2=0;
  673.                 }
  674.                
  675.                 if(anjian2==0&&aj2==0)//检测按键2
  676.                 {
  677.                         delay(5);
  678.                         if(anjian2==0) aj2=1;
  679.                 }
  680.                 if(anjian2==1&&aj2==1)
  681.                 {
  682.                         aj2=0;
  683.                         cd=13;
  684.                         ms1=0;//按键2按下松开,去13级菜单
  685.                 }               
  686.                 if(anjian1==0&&aj1==0)//检测按键1
  687.                 {
  688.                         delay(5);
  689.                         if(anjian1==0) aj1=1;
  690.                 }
  691.                 if(anjian1==1&&aj1==1)
  692.                 {
  693.                         aj1=0;
  694.                         cd=3;
  695.                         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]);
  696.                         ms1=0;//按键1按下松开,去3级菜单
  697.                 }               
  698.         }
  699.         while(cd==16)//菜单16 设置闹钟1开关
  700.         {
  701.                 if(nao_kaiguan==0)
  702.                 {
  703.                         if(ms1>0&&ms1<300)        xianshi(30,31,1,27,27,0,37,37);
  704.                         if(ms1>300&&ms1<600)  xianshi(30,31,1,27,27,28,28,28);
  705.                         if(ms1>600) ms1=0;
  706.                 }
  707.                 if(nao_kaiguan==1)
  708.                 {
  709.                         if(ms1>0&&ms1<300)        xianshi(30,31,1,27,27,27,0,38);
  710.                         if(ms1>300&&ms1<600)  xianshi(30,31,1,27,27,27,28,28);
  711.                         if(ms1>600) ms1=0;
  712.                 }
  713.                
  714.                 if(anjian3==0&&aj3==0)//检测按键3
  715.                 {
  716.                         delay(5);
  717.                         if(anjian3==0) aj3=1;
  718.                 }
  719.                 if(anjian3==1&&aj3==1)
  720.                 {
  721.                         aj3=0;
  722.                         nao_kaiguan++;
  723.                 }
  724.                 if(anjian4==0&&aj4==0)//检测按键4
  725.                 {
  726.                         delay(5);
  727.                         if(anjian4==0) aj4=1;
  728.                 }
  729.                 if(anjian4==1&&aj4==1)
  730.                 {
  731.                         aj4=0;
  732.                         nao_kaiguan++;
  733.                 }
  734.                 if(nao_kaiguan>1) nao_kaiguan=0;
  735.                
  736.                 if(anjian1==0&&aj1==0)//检测按键1
  737.                 {
  738.                         delay(5);
  739.                         if(anjian1==0) aj1=1;
  740.                 }
  741.                 if(anjian1==1&&aj1==1)
  742.                 {
  743.                         aj1=0;
  744.                         cd=4;
  745.                   IapErase(0x0200);
  746.                   IapProgram(0x0200, nao_kaiguan);//写开关值
  747.                 }
  748.                 if(anjian2==0&&aj2==0)//检测按键2
  749.                 {
  750.                         delay(5);
  751.                         if(anjian2==0) aj2=1;
  752.                 }
  753.                 if(anjian2==1&&aj2==1)
  754.                 {
  755.                         aj2=0;
  756.                         cd=17;//去菜单17
  757.                   IapErase(0x0200);
  758.                   IapProgram(0x0200, nao_kaiguan);//写开关值
  759.                 }
  760.         }
  761.         while(cd==17)//菜单17 设置闹钟1 时
  762.         {
  763.                 if(ms1>0&&ms1<300)        xianshi(27,nao_shi/10,nao_shi%10,27,27,nao_fen/10,nao_fen%10,27);
  764.                 if(ms1>300&&ms1<600)  xianshi(27,28,28,27,27,nao_fen/10,nao_fen%10,27);
  765.                 if(ms1>600) ms1=0;
  766.                 if(ms1>300&&changan==1) ms1=0;
  767.                
  768.                
  769.                
  770.                 if(anjian3==0&&aj3==0)//检测按键3
  771.           {
  772.                   delay(5);
  773.                   if(anjian3==0) aj3=1,ms2=0;
  774.           }
  775.           if(anjian3==1&&aj3==1)
  776.                 {
  777.                         nao_shi++;
  778.                         if(nao_shi==25) nao_shi=0;
  779.                         changan=0;
  780.                         aj3=0;//按键1按下松开,小时++
  781.                 }
  782.                 if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  783.                 if(aj3==1&&changan==1&&ms2>=100)//快加
  784.                 {
  785.                         nao_shi++;
  786.                         if(nao_shi==25) nao_shi=0;
  787.                         ms2=0;
  788.                 }
  789.                
  790.                 if(anjian4==0&&aj4==0)//检测按键4
  791.           {
  792.                   delay(5);
  793.                   if(anjian4==0) aj4=1,ms2=0;
  794.           }
  795.           if(anjian4==1&&aj4==1)
  796.                 {
  797.                         nao_shi--;
  798.                         if(nao_shi<0) nao_shi=24;
  799.                         changan=0;
  800.                         aj4=0;//按键1按下松开,小时--
  801.                 }
  802.                 if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  803.                 if(aj4==1&&changan==1&&ms2>=100)//快减
  804.                 {
  805.                         nao_shi--;
  806.                         if(nao_shi<0) nao_shi=24;
  807.                         ms2=0;
  808.                 }
  809.                 if(anjian1==0&&aj1==0)//检测按键1
  810.                 {
  811.                         delay(5);
  812.                         if(anjian1==0) aj1=1;
  813.                 }
  814.                 if(anjian1==1&&aj1==1)
  815.                 {
  816.                         aj1=0;
  817.                         cd=4;
  818.                   IapErase(0x0400);
  819.                   IapProgram(0x0400, nao_shi);//写小时值
  820.                 }
  821.                 if(anjian2==0&&aj2==0)//检测按键2
  822.                 {
  823.                         delay(5);
  824.                         if(anjian2==0) aj2=1;
  825.                 }
  826.                 if(anjian2==1&&aj2==1)
  827.                 {
  828.                         aj2=0;
  829.                         cd=18;//去菜单18
  830.                   IapErase(0x0400);
  831.                   IapProgram(0x0400, nao_shi);//写小时值
  832.                 }
  833.                
  834.         }
  835.         while(cd==18)//菜单18 设置闹钟1 分
  836.         {
  837.                 if(ms1>0&&ms1<300)        xianshi(27,nao_shi/10,nao_shi%10,27,27,nao_fen/10,nao_fen%10,27);
  838.                 if(ms1>300&&ms1<600)  xianshi(27,nao_shi/10,nao_shi%10,27,27,28,28,27);
  839.                 if(ms1>600) ms1=0;
  840.                 if(ms1>300&&changan==1) ms1=0;
  841.                
  842.                
  843.                
  844.                 if(anjian3==0&&aj3==0)//检测按键3
  845.           {
  846.                   delay(5);
  847.                   if(anjian3==0) aj3=1,ms2=0;
  848.           }
  849.           if(anjian3==1&&aj3==1)
  850.                 {
  851.                         nao_fen++;
  852.                         if(nao_fen==60) nao_fen=0;
  853.                         changan=0;
  854.                         aj3=0;//按键1按下松开,小时++
  855.                 }
  856.                 if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  857.                 if(aj3==1&&changan==1&&ms2>=100)//快加
  858.                 {
  859.                         nao_fen++;
  860.                         if(nao_fen==60) nao_fen=0;
  861.                         ms2=0;
  862.                 }
  863.                
  864.                 if(anjian4==0&&aj4==0)//检测按键4
  865.           {
  866.                   delay(5);
  867.                   if(anjian4==0) aj4=1,ms2=0;
  868.           }
  869.           if(anjian4==1&&aj4==1)
  870.                 {
  871.                         nao_fen--;
  872.                         if(nao_fen<0) nao_fen=59;
  873.                         changan=0;
  874.                         aj4=0;//按键1按下松开,小时--
  875.                 }
  876.                 if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  877.                 if(aj4==1&&changan==1&&ms2>=100)//快减
  878.                 {
  879.                         nao_fen--;
  880.                         if(nao_fen<0) nao_fen=59;
  881.                         ms2=0;
  882.                 }
  883.                 if(anjian1==0&&aj1==0)//检测按键1
  884.                 {
  885.                         delay(5);
  886.                         if(anjian1==0) aj1=1;
  887.                 }
  888.                 if(anjian1==1&&aj1==1)
  889.                 {
  890.                         aj1=0;
  891.                         cd=4;
  892.                   IapErase(0x0600);
  893.                   IapProgram(0x0600, nao_fen);//写小时值
  894.                 }
  895.                 if(anjian2==0&&aj2==0)//检测按键2
  896.                 {
  897.                         delay(5);
  898.                         if(anjian2==0) aj2=1;
  899.                 }
  900.                 if(anjian2==1&&aj2==1)
  901.                 {
  902.                         aj2=0;
  903.                         cd=20;//去菜单20
  904.                   IapErase(0x0600);
  905.                   IapProgram(0x0600, nao_fen);//写小时值
  906.                 }
  907.         }
  908.         while(cd==19)//菜单19 设置温度开关
  909.         {
  910.                 if(wendu_kaiguan==0)
  911.                 {
  912.                         if(ms1>0&&ms1<300)        xianshi(32,33,34,33,27,0,37,37);
  913.                         if(ms1>300&&ms1<600)  xianshi(32,33,34,33,27,28,28,28);
  914.                         if(ms1>600) ms1=0;
  915.                 }
  916.                 if(wendu_kaiguan==1)
  917.                 {
  918.                         if(ms1>0&&ms1<300)        xianshi(32,33,34,33,27,27,0,38);
  919.                         if(ms1>300&&ms1<600)  xianshi(32,33,34,33,27,27,28,28);
  920.                         if(ms1>600) ms1=0;
  921.                 }
  922.                
  923.                 if(anjian3==0&&aj3==0)//检测按键3
  924.                 {
  925.                         delay(5);
  926.                         if(anjian3==0) aj3=1;
  927.                 }
  928.                 if(anjian3==1&&aj3==1)
  929.                 {
  930.                         aj3=0;
  931.                         wendu_kaiguan++;
  932.                 }
  933.                 if(anjian4==0&&aj4==0)//检测按键4
  934.                 {
  935.                         delay(5);
  936.                         if(anjian4==0) aj4=1;
  937.                 }
  938.                 if(anjian4==1&&aj4==1)
  939.                 {
  940.                         aj4=0;
  941.                         wendu_kaiguan++;
  942.                 }
  943.                 if(wendu_kaiguan>1) wendu_kaiguan=0;
  944.                
  945.                 if(anjian1==0&&aj1==0)//检测按键1
  946.                 {
  947.                         delay(5);
  948.                         if(anjian1==0) aj1=1;
  949.                 }
  950.                 if(anjian1==1&&aj1==1)
  951.                 {
  952.                         aj1=0;
  953.                         cd=0;
  954.                   IapErase(0x0800);
  955.                   IapProgram(0x0800, wendu_kaiguan);//写开关值
  956.                 }
  957.         }
  958.         while(cd==20)//菜单20 选择闹钟1、2
  959.         {
  960.                 if(s==0)
  961.                 {
  962.                         if(nao_kaiguan==0)
  963.                         {
  964.                                 if(ms1>0&&ms1<300)        xianshi(30,31,1,27,27,0,37,37);
  965.                                 if(ms1>300&&ms1<600)  xianshi(30,31,28,27,27,0,37,37);
  966.                                 if(ms1>600) ms1=0;
  967.                         }
  968.                         if(nao_kaiguan==1)
  969.                         {
  970.                                 if(ms1>0&&ms1<300)        xianshi(30,31,1,27,27,27,0,38);
  971.                                 if(ms1>300&&ms1<600)  xianshi(30,31,28,27,27,27,0,38);
  972.                                 if(ms1>600) ms1=0;
  973.                         }
  974.                 }        
  975.                 if(s==1)
  976.                 {
  977.                         if(nao2_kaiguan==0)
  978.                         {
  979.                                 if(ms1>0&&ms1<300)        xianshi(30,31,2,27,27,0,37,37);
  980.                                 if(ms1>300&&ms1<600)  xianshi(30,31,28,27,27,0,37,37);
  981.                                 if(ms1>600) ms1=0;
  982.                         }
  983.                         if(nao2_kaiguan==1)
  984.                         {
  985.                                 if(ms1>0&&ms1<300)        xianshi(30,31,2,27,27,27,0,38);
  986.                                 if(ms1>300&&ms1<600)  xianshi(30,31,28,27,27,27,0,38);
  987.                                 if(ms1>600) ms1=0;
  988.                         }
  989.                 }
  990.                
  991.                 if(anjian1==0&&aj1==0)//检测按键1
  992.           {
  993.                   delay(5);
  994.                   if(anjian1==0) aj1=1;
  995.           }
  996.           if(anjian1==1&&aj1==1) aj1=0,cd=4,ms1=0;//按键1按下松开,去4级菜单
  997.                
  998.                 if(anjian2==0&&aj2==0)//检测按键2
  999.                 {
  1000.                         delay(5);
  1001.                         if(anjian2==0) aj2=1;
  1002.                 }
  1003.                 if(anjian2==1&&aj2==1)
  1004.                 {
  1005.                         aj2=0;
  1006.                         if(s==1) cd=21;//按键2按下松开,去21级菜单
  1007.                         if(s==0) cd=16;//按键2按下松开,去16级菜单
  1008.                 }        
  1009.                                 
  1010.                 if(anjian3==0&&aj3==0)//检测按键3
  1011.                 {
  1012.                         delay(5);
  1013.                         if(anjian3==0) aj3=1;
  1014.                 }
  1015.                 if(anjian3==1&&aj3==1)
  1016.                 {
  1017.                         aj3=0;
  1018.                         s=1;
  1019.                 }
  1020.                 if(anjian4==0&&aj4==0)//检测按键4
  1021.                 {
  1022.                         delay(5);
  1023.                         if(anjian4==0) aj4=1;
  1024.                 }
  1025.                 if(anjian4==1&&aj4==1)
  1026.                 {
  1027.                         aj4=0;
  1028.                         s=0;
  1029.                 }
  1030.         }
  1031.         while(cd==21)//菜单21 设置闹钟2开关
  1032.         {
  1033.                 if(nao2_kaiguan==0)
  1034.                 {
  1035.                         if(ms1>0&&ms1<300)        xianshi(30,31,2,27,27,0,37,37);
  1036.                         if(ms1>300&&ms1<600)  xianshi(30,31,2,27,27,28,28,28);
  1037.                         if(ms1>600) ms1=0;
  1038.                 }
  1039.                 if(nao2_kaiguan==1)
  1040.                 {
  1041.                         if(ms1>0&&ms1<300)        xianshi(30,31,2,27,27,27,0,38);
  1042.                         if(ms1>300&&ms1<600)  xianshi(30,31,2,27,27,27,28,28);
  1043.                         if(ms1>600) ms1=0;
  1044.                 }
  1045.                
  1046.                 if(anjian3==0&&aj3==0)//检测按键3
  1047.                 {
  1048.                         delay(5);
  1049.                         if(anjian3==0) aj3=1;
  1050.                 }
  1051.                 if(anjian3==1&&aj3==1)
  1052.                 {
  1053.                         aj3=0;
  1054.                         nao2_kaiguan++;
  1055.                 }
  1056.                 if(anjian4==0&&aj4==0)//检测按键4
  1057.                 {
  1058.                         delay(5);
  1059.                         if(anjian4==0) aj4=1;
  1060.                 }
  1061.                 if(anjian4==1&&aj4==1)
  1062.                 {
  1063.                         aj4=0;
  1064.                         nao2_kaiguan++;
  1065.                 }
  1066.                 if(nao2_kaiguan>1) nao2_kaiguan=0;
  1067.                
  1068.                 if(anjian1==0&&aj1==0)//检测按键1
  1069.                 {
  1070.                         delay(5);
  1071.                         if(anjian1==0) aj1=1;
  1072.                 }
  1073.                 if(anjian1==1&&aj1==1)
  1074.                 {
  1075.                         aj1=0;
  1076.                         cd=4;
  1077.                   IapErase(0x0c00);
  1078.                   IapProgram(0x0c00, nao2_kaiguan);//写开关值
  1079.                 }
  1080.                 if(anjian2==0&&aj2==0)//检测按键2
  1081.                 {
  1082.                         delay(5);
  1083.                         if(anjian2==0) aj2=1;
  1084.                 }
  1085.                 if(anjian2==1&&aj2==1)
  1086.                 {
  1087.                         aj2=0;
  1088.                         cd=22;//去菜单22
  1089.                   IapErase(0x0c00);
  1090.                   IapProgram(0x0c00, nao2_kaiguan);//写开关值
  1091.                 }
  1092.         }
  1093.         while(cd==22)//菜单22 设置闹钟2 时
  1094.         {
  1095.                 if(ms1>0&&ms1<300)        xianshi(27,nao2_shi/10,nao2_shi%10,27,27,nao2_fen/10,nao2_fen%10,27);
  1096.                 if(ms1>300&&ms1<600)  xianshi(27,28,28,27,27,nao2_fen/10,nao2_fen%10,27);
  1097.                 if(ms1>600) ms1=0;
  1098.                 if(ms1>300&&changan==1) ms1=0;
  1099.                
  1100.                
  1101.                
  1102.                 if(anjian3==0&&aj3==0)//检测按键3
  1103.           {
  1104.                   delay(5);
  1105.                   if(anjian3==0) aj3=1,ms2=0;
  1106.           }
  1107.           if(anjian3==1&&aj3==1)
  1108.                 {
  1109.                         nao2_shi++;
  1110.                         if(nao2_shi==25) nao2_shi=0;
  1111.                         changan=0;
  1112.                         aj3=0;//按键1按下松开,小时++
  1113.                 }
  1114.                 if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  1115.                 if(aj3==1&&changan==1&&ms2>=100)//快加
  1116.                 {
  1117.                         nao2_shi++;
  1118.                         if(nao2_shi==25) nao2_shi=0;
  1119.                         ms2=0;
  1120.                 }
  1121.                
  1122.                 if(anjian4==0&&aj4==0)//检测按键4
  1123.           {
  1124.                   delay(5);
  1125.                   if(anjian4==0) aj4=1,ms2=0;
  1126.           }
  1127.           if(anjian4==1&&aj4==1)
  1128.                 {
  1129.                         nao2_shi--;
  1130.                         if(nao2_shi<0) nao2_shi=24;
  1131.                         changan=0;
  1132.                         aj4=0;//按键1按下松开,小时--
  1133.                 }
  1134.                 if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  1135.                 if(aj4==1&&changan==1&&ms2>=100)//快减
  1136.                 {
  1137.                         nao2_shi--;
  1138.                         if(nao2_shi<0) nao2_shi=24;
  1139.                         ms2=0;
  1140.                 }
  1141.                 if(anjian1==0&&aj1==0)//检测按键1
  1142.                 {
  1143.                         delay(5);
  1144.                         if(anjian1==0) aj1=1;
  1145.                 }
  1146.                 if(anjian1==1&&aj1==1)
  1147.                 {
  1148.                         aj1=0;
  1149.                         cd=4;
  1150.                   IapErase(0x0e00);
  1151.                   IapProgram(0x0e00, nao2_shi);//写小时值
  1152.                 }
  1153.                 if(anjian2==0&&aj2==0)//检测按键2
  1154.                 {
  1155.                         delay(5);
  1156.                         if(anjian2==0) aj2=1;
  1157.                 }
  1158.                 if(anjian2==1&&aj2==1)
  1159.                 {
  1160.                         aj2=0;
  1161.                         cd=23;//去菜单23
  1162.                   IapErase(0x0e00);
  1163.                   IapProgram(0x0e00, nao2_shi);//写小时值
  1164.                 }        
  1165.         }
  1166.         

  1167.         while(cd==23)//菜单23 设置闹钟2 分
  1168.         {
  1169.                 if(ms1>0&&ms1<300)        xianshi(27,nao2_shi/10,nao2_shi%10,27,27,nao2_fen/10,nao2_fen%10,27);
  1170.                 if(ms1>300&&ms1<600)  xianshi(27,nao2_shi/10,nao2_shi%10,27,27,28,28,27);
  1171.                 if(ms1>600) ms1=0;
  1172.                 if(ms1>300&&changan==1) ms1=0;
  1173.                
  1174.                 if(anjian3==0&&aj3==0)//检测按键3
  1175.           {
  1176.                   delay(5);
  1177.                   if(anjian3==0) aj3=1,ms2=0;
  1178.           }
  1179.           if(anjian3==1&&aj3==1)
  1180.                 {
  1181.                         nao2_fen++;
  1182.                         if(nao2_fen==60) nao2_fen=0;
  1183.                         changan=0;
  1184.                         aj3=0;//按键1按下松开,小时++
  1185.                 }
  1186.                 if(aj3==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  1187.                 if(aj3==1&&changan==1&&ms2>=100)//快加
  1188.                 {
  1189.                         nao2_fen++;
  1190.                         if(nao2_fen==60) nao2_fen=0;
  1191.                         ms2=0;
  1192.                 }
  1193.                
  1194.                 if(anjian4==0&&aj4==0)//检测按键4
  1195.           {
  1196.                   delay(5);
  1197.                   if(anjian4==0) aj4=1,ms2=0;
  1198.           }
  1199.           if(anjian4==1&&aj4==1)
  1200.                 {
  1201.                         if(nao2_fen==0) nao2_fen=60;
  1202.                         nao2_fen--;
  1203.                         changan=0;
  1204.                         aj4=0;//按键1按下松开,小时--
  1205.                 }
  1206.                 if(aj4==1&&ms2>=700) changan=1,ms2=0;//检测长按时间0.5s
  1207.                 if(aj4==1&&changan==1&&ms2>=100)//快减
  1208.                 {
  1209.                         nao2_fen--;
  1210.                         if(nao2_fen<0) nao2_fen=59;
  1211.                         ms2=0;
  1212.                 }
  1213.                 if(anjian1==0&&aj1==0)//检测按键1
  1214.                 {
  1215.                         delay(5);
  1216.                         if(anjian1==0) aj1=1;
  1217.                 }
  1218.                 if(anjian1==1&&aj1==1)
  1219.                 {
  1220.                         aj1=0;
  1221.                         cd=4;
  1222.                   IapErase(0x1000);
  1223.                   IapProgram(0x1000, nao2_fen);//写小时值
  1224.                 }
  1225.                 if(anjian2==0&&aj2==0)//检测按键2
  1226.                 {
  1227.                         delay(5);
  1228.                         if(anjian2==0) aj2=1;
  1229.                 }
  1230.                 if(anjian2==1&&aj2==1)
  1231.                 {
  1232.                         aj2=0;
  1233.                         cd=20;//去菜单20
  1234.                   IapErase(0x1000);
  1235.                   IapProgram(0x1000, nao2_fen);//写小时值
  1236.                 }
  1237.         }
  1238. }

















复制代码

串口驱动:

  1. #include <STC8.H>
  2. #include <uart.H>
  3. #include "intrins.h"

  4. #define FOSC            11059200UL
  5. #define BRT             (65536 - FOSC / 115200 / 4)

  6. bit busy;
  7. //extern uchar tiaozheng[];
  8. char a=0;
  9. uchar huancun[15]={0};

  10. /*Z-------------A*/ //传送时间数据
  11. /*Z----------B*/ //传送闹钟数据
  12. /*Z----------C*/ //请求传送温度数据

  13. /***********************************************************************************************************
  14. * 函数名称: UartIsr()
  15. * 输入参数: void
  16. * 输出参数: void
  17. *
  18. * 功    能: 串口1中断(第4号中断)
  19. *
  20. * 备    注:将数据缓存在 huancun[]数组中
  21. *
  22. * 作    者: 范
  23. *
  24. * 完成时间: 2019.12.25
  25. ************************************************************************************************************/

  26. void UartIsr() interrupt 4
  27. {
  28.     if (TI)
  29.     {
  30.         TI = 0;
  31.         busy = 0;
  32.     }
  33.     if (RI)
  34.     {
  35.         RI = 0;
  36.                         switch(SBUF)
  37.                         {
  38.                                 case 'Z': a=0;//时间数据传送开始标志
  39.                                 break;
  40.                                 case 'A': huancun[14]=1;//时间数据更新标志
  41.                                 break;
  42.                                 case 'B': huancun[14]=2;//闹钟数据更新标志
  43.                                 break;
  44.                                 case 'C': huancun[14]=3;//请求传送温度数据 标志
  45.                                 break;
  46.                                 case '0': huancun[a]=0,a++;
  47.                                 break;
  48.                                 case '1': huancun[a]=1,a++;
  49.                                 break;
  50.                                 case '2': huancun[a]=2,a++;
  51.                                 break;
  52.                                 case '3': huancun[a]=3,a++;
  53.                                 break;
  54.                                 case '4': huancun[a]=4,a++;
  55.                                 break;
  56.                                 case '5': huancun[a]=5,a++;
  57.                                 break;
  58.                                 case '6': huancun[a]=6,a++;
  59.                                 break;
  60.                                 case '7': huancun[a]=7,a++;
  61.                                 break;
  62.                                 case '8': huancun[a]=8,a++;
  63.                                 break;
  64.                                 case '9': huancun[a]=9,a++;
  65.                                 break;
  66.                                 default:break;
  67.                         }
  68.     }
  69. }

  70. /***********************************************************************************************************
  71. * 函数名称: UartInit()
  72. * 输入参数: void
  73. * 输出参数: void
  74. *
  75. * 功    能: 串口1初始化
  76. *
  77. * 备    注:用定时器2做波特率发生器
  78. *
  79. * 作    者: 范
  80. *
  81. * 完成时间: 2019.12.25
  82. ************************************************************************************************************/

  83. void UartInit()
  84. {
  85.     SCON = 0x50;
  86.     T2L = BRT;
  87.     T2H = BRT >> 8;
  88.     AUXR = 0x15;
  89.     busy = 0;
  90. }

  91. /***********************************************************************************************************
  92. * 函数名称: UartSend()
  93. * 输入参数: char
  94. * 输出参数: void
  95. *
  96. * 功    能: 串口1发送一个字符
  97. *
  98. * 备    注:无
  99. *
  100. * 作    者: 范
  101. *
  102. * 完成时间: 2019.12.25
  103. ************************************************************************************************************/

  104. void UartSend(char dat)
  105. {
  106.     while (busy);
  107.     busy = 1;
  108.     SBUF = dat;
  109. }

  110. /***********************************************************************************************************
  111. * 函数名称: UartSendStr()
  112. * 输入参数: char *p
  113. * 输出参数: void
  114. *
  115. * 功    能: 串口1发送一个字符串
  116. *
  117. * 备    注:无
  118. *
  119. * 作    者: 范
  120. *
  121. * 完成时间: 2019.12.25
  122. ************************************************************************************************************/

  123. void UartSendStr(char *p)
  124. {
  125.     while (*p)
  126.     {
  127.         UartSend(*p++);
  128.     }
  129. }


复制代码

主函数:
  1. #include <STC8.H>
  2. #include <caidan.H>//菜单
  3. #include <chushihua.H>//初始化
  4. #include <uart.H>
  5. #include <ds1302.H>
  6. #include "eeprom.h"

  7. extern uchar huancun[];//蓝牙接收缓存数据
  8. extern int nao_kaiguan,nao_shi,nao_fen,nao2_kaiguan,nao2_shi,nao2_fen;//eeprom数据
  9. extern int wendu;//温度信息
  10. uchar wenzhuan[5]={0,0,0,0,0};
  11. uchar i;
  12. uchar xiawu;//下午标志位

  13. /***********************************************************************************************************
  14. * 函数名称: main()
  15. * 输入参数: void
  16. * 输出参数: void
  17. *
  18. * 功    能: 主函数
  19. *
  20. * 备    注:程序的初始化、串口打印、串口接收手机端发来的数据、运行菜单程序
  21. *
  22. * 作    者: 范
  23. *
  24. * 完成时间: 2019.12.25
  25. ************************************************************************************************************/

  26. void main()
  27. {
  28.         itin();
  29.   UartSendStr("Uart Test !\r\n");

  30.         while(1)
  31.         {
  32.                 caidan();
  33.                 if(huancun[14]==1)//待时间更新数据
  34.                 {
  35.                         huancun[14]=0;//清标志位
  36.                         if(huancun[13]==1) xiawu=12;
  37.                         if(huancun[13]==0) xiawu=0;
  38.                         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]);//更新时间
  39.                         UartSendStr("时间信息已校准\r\n");
  40.                 }
  41.     if(huancun[14]==2)//待闹钟更新数据
  42.                 {
  43.                         huancun[14]=0;//清标志位
  44.                         nao_kaiguan=huancun[0];
  45.                         nao_shi=huancun[1]*10+huancun[2];
  46.                         nao_fen=huancun[3]*10+huancun[4];
  47.                         nao2_kaiguan=huancun[5];
  48.                         nao2_shi=huancun[6]*10+huancun[7];
  49.                         nao2_fen=huancun[8]*10+huancun[9];
  50.                         IapErase(0x0200);
  51.                         IapProgram(0x0200, nao_kaiguan);//写闹钟1开关默认值
  52.                         IapErase(0x0400);
  53.                         IapProgram(0x0400, nao_shi);//写闹钟1小时默认值
  54.                         IapErase(0x0600);
  55.                         IapProgram(0x0600, nao_fen);//写闹钟1分钟默认值
  56.                         IapErase(0x0c00);
  57.                         IapProgram(0x0c00, nao2_kaiguan);//写闹钟2分钟默认值
  58.                         IapErase(0x0e00);
  59.                         IapProgram(0x0e00, nao2_shi);//写闹钟2分钟默认值
  60.                         IapErase(0x1000);
  61.                         IapProgram(0x1000, nao2_fen);//写闹钟2亮度默认值
  62.                         UartSendStr("闹钟信息已更改\r\n");
  63.                 }
  64.                 if(huancun[14]==3)//请求传送温度数据 标志
  65.                 {
  66.                         huancun[14]=0;//清标志位
  67.                         wenzhuan[0]=wendu%1000/100;
  68.                         if(wendu<10000) wenzhuan[0]=wendu%1000/100,wenzhuan[1]=wendu%100/10,wenzhuan[2]=wendu%10,wenzhuan[3]=0;
  69.                   if(wendu>10000) wenzhuan[0]=wendu%1000/100,wenzhuan[1]=wendu%100/10,wenzhuan[2]=wendu%10,wenzhuan[3]=1;
  70.                         for(i=0;i<4;i++)
  71.                         {
  72.                                 switch(wenzhuan[i])
  73.                                 {
  74.                                         case 0 : UartSend('0');
  75.                                         break;
  76.                                         case 1 : UartSend('1');
  77.                                         break;
  78.                                         case 2 : UartSend('2');
  79.                                         break;
  80.                                         case 3 : UartSend('3');
  81.                                         break;
  82.                                         case 4 : UartSend('4');
  83.                                         break;
  84.                                         case 5 : UartSend('5');
  85.                                         break;
  86.                                         case 6 : UartSend('6');
  87.                                         break;
  88.                                         case 7 : UartSend('7');
  89.                                         break;
  90.                                         case 8 : UartSend('8');
  91.                                         break;
  92.                                         case 9 : UartSend('9');
  93.                                         break;
  94.                                         default:break;
  95.                                 }
  96.                         }
  97.                 }
  98.         }
  99. }
复制代码


由于代码较多,完整的代码、原理图、pcb图、手机app等 可以从附件中查找
123.zip (17.73 MB, 下载次数: 53)





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:352815 发表于 2020-3-6 19:37 | 只看该作者
带测试效果,制作中
回复

使用道具 举报

板凳
ID:352815 发表于 2020-3-9 14:47 | 只看该作者
请问蓝牙8针插座如何连接?有木有具体引脚及蓝牙模块具体型号?网上好多是6脚的。感谢
回复

使用道具 举报

地板
ID:479740 发表于 2020-3-30 22:20 | 只看该作者
tanpride 发表于 2020-3-9 14:47
请问蓝牙8针插座如何连接?有木有具体引脚及蓝牙模块具体型号?网上好多是6脚的。感谢

HC06
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表