找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机按键控制灯程序的修改 求大神指点。

[复制链接]
跳转到指定楼层
楼主
ID:425443 发表于 2018-11-20 16:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想在自动模式下,1602显示屏在exception选项中的start界面中,按下INT1按钮则LAMP1和2灯亮,按OUT1按钮则LAMP3和LAMP4灯亮,也就是自动模式下有两种情况。请大神指点,应该在程序里哪个地方更改。
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar time_data[7];
  6. uchar code write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};       //数据的地址
  7. uchar code read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
  8. uchar code table1[]="C: 00|2000/00/00";
  9. uchar code table2[]="T: 00|00:00:00 0";
  10. uchar code table3[]="                ";    //清屏内容
  11. uchar code table4[]="  Set Real Time ";
  12. uchar code table5[]="  Set Open Time ";
  13. uchar code table6[]="   Start Time:  ";
  14. uchar code table7[]="    00:00:00    ";
  15. uchar code table8[]="    End Time:   ";
  16. uchar code table9[]="Date: 2000/00/00";
  17. uchar code table0[]="Time: 00:00:00 0";
  18. uchar code tableA[]="    Excaption   ";
  19. uchar code tableB[]="      START     ";
  20. bit Adjust;     //调节标志位,=1表示进入调节模式,=0是正常模式
  21. bit Auto_flg;    //自动模式标志位,=1表示手动模式,=0是自动模式
  22. sbit rs=P1^0;    //LCD1602
  23. sbit rw=P1^1;     //LCD1602
  24. sbit e=P1^2;    //LCD1602
  25. sbit sck=P2^5;    //时钟端口
  26. sbit io=P2^6;    //时钟端口
  27. sbit rst=P2^7;    //时钟端口
  28. sbit SELT =P1^6;   //选择键
  29. sbit ENTER=P1^7;   //确认键
  30. sbit UP   =P3^0;   //加键
  31. sbit DOWN =P3^1;   //减键
  32. sbit MODE =P3^2;   //切换按键接口
  33. sbit SWITCH=P3^3;   //手动开关
  34. sbit AUTO_LED=P1^3;   //自动模式灯接口
  35. sbit HAND_LED=P1^4;   //手动灯接口
  36. sbit LAMP1=P3^4;   //灯接口
  37. sbit LAMP2=P3^5;   //灯接口
  38. sbit LAMP3=P3^6;   //灯接口
  39. sbit LAMP4=P3^7;   //灯接口
  40. sbit LIGHT1=P2^0;   //光线检测端口
  41. sbit IN1=P2^2;
  42. sbit OUT1=P2^1;
  43. sbit DQ=P1^5;    //温度数据口
  44. uchar Select_num;   //选择按键按下次数
  45. uchar Enter_num;   //确认按键按下次数
  46. uchar Switch_num;   //手动开关按键按下次数
  47. float Year,Month,Day,Hour,Minute,Second;   //时间设置值
  48. uchar Week;  
  49. float Hour_H,Minute_H,Second_H;       //设置开始时间
  50. float Hour_L,Minute_L,Second_L;       //设置结束时间
  51. int Value1;           //人数
  52. uchar IN1_flag=0;
  53. uchar OUT1_flag=0;
  54. uint Count;           //T0定时器中断计数次数
  55. uchar Miao;
  56. int temperature;         //全局变量 温度
  57. void read_rtc();
  58. /**************************************************LCD1602显示*******************************************************************/
  59. void delay1(uint z)     //延时函数
  60. {
  61. uint x,y;
  62. for(x=z;x>0;x--)
  63.   for(y=10;y>0;y--);
  64. }
  65. void write_com(uchar com)    //写指令函数
  66. {
  67. rw=0;
  68. delay1(5);
  69. rs=0;
  70. delay1(5);
  71. e=1;
  72. delay1(5);
  73. P0=com;
  74. delay1(5);
  75. e=0;
  76. delay1(5);
  77. }
  78. void write_date(uchar date)   //写数据函数
  79. {         
  80. rw=0;
  81. delay1(5);
  82. rs=1;
  83. delay1(5);
  84. e=1;
  85. delay1(5);
  86. P0=date;
  87. delay1(5);
  88. e=0;
  89. delay1(5);
  90. }
  91. void init()          //初始化函数
  92. {
  93. uchar num;
  94. Year=17;
  95. Month=1;
  96. Day=1;
  97. Hour=15;
  98. Minute=30;
  99. Second=50;
  100. Week=1;
  101. Hour_H=22;
  102. Minute_H=0;
  103. Second_H=0;
  104. Hour_L=18;
  105. Minute_L=0;
  106. Second_L=0;
  107. e=0;          // 时序表e初始为0
  108. write_com(0x38);          //设置16*2显示,5*7点阵,8位数据接口
  109. write_com(0x0c);    //设置光标
  110. write_com(0x06);    //光标自动加1,光标输入方式
  111. write_com(0x01);    //清屏
  112. write_com(0x80);    //设置初始显示位置
  113. for(num=0;num<16;num++)
  114. {
  115.   write_date(table1[num]);
  116.   delay1(5);
  117. }
  118. write_com(0x80+0x40);
  119. for(num=0;num<16;num++)
  120. {
  121.   write_date(table2[num]);
  122.   delay1(5);
  123. }      
  124. }
  125. void SetTime_dispaly(uchar add,uchar dat)  //第一个:参数的地址,第二个:参数的内容
  126. {
  127. uchar shi,ge;
  128. shi=dat/10;       //把十位提取出来
  129. ge=dat%10;       //把个位提取出来
  130. write_com(add);          //要写的地址
  131. write_date(0x30+shi);    //十位的内容   1602字符库
  132. write_date(0x30+ge);    //个位的内容   1602字符库
  133. }
  134. void Week_dispaly(uchar add,uchar dat) //第一个:参数的地址,第二个:参数的内容
  135. {
  136. write_com(add);      //要写的地址
  137. write_date(0x30+dat);    //十位的内容   1602字符库
  138. }
  139. void Date_dispaly(uchar add,uchar dat)  //第一个:参数的地址,第二个:参数的内容
  140. {
  141. uchar shi,ge;
  142. shi=dat/16;       //把十位提取出来
  143. ge=dat%16;       //把个位提取出来
  144. write_com(add+3);         //要写的地址
  145. write_date(0x30+shi);    //十位的内容   1602字符库
  146. write_date(0x30+ge);    //个位的内容   1602字符库      
  147. }
  148. void LCD_Clean(uchar i)     //液晶屏清除显示
  149. {
  150. uchar num;
  151. if(i==1)
  152. {
  153.   write_com(0x80);    //设置初始显示位置
  154.   for(num=0;num<16;num++)   //显示第一行内容
  155.   {
  156.    write_date(table3[num]);
  157.    delay1(1);
  158.   }
  159. }
  160. if(i==2)
  161. {
  162.   write_com(0x80+0x40);
  163.   for(num=0;num<16;num++)   //显示第二行内容
  164.   {
  165.    write_date(table3[num]);
  166.    delay1(1);
  167.   }
  168. }
  169. }
  170. void LCD_Display_String(unsigned char line,unsigned char *string)
  171. {           //液晶屏显示内容,把要显示的内容写到对应的位置
  172. unsigned char i;
  173. unsigned char address=0;
  174. if(line==1)
  175. {
  176.   address=0x80;      //0X80是第1行的第1个位置  ,0x81第2位
  177. }
  178. else if(line==2)
  179. {
  180.   address=0x80+0x40;     //0X80+0x40是第2行的第1个位置  ,0X80+0x40+1是第2行第2位
  181. }

  182. for(i=0;i<16;i++)
  183. {
  184.   write_com(address);
  185.   write_date(string[i]);
  186.   address++;
  187. }
  188. }
  189. /**********************************DS1302时钟***************************************/
  190. void Time_Display(void)
  191. {
  192. read_rtc();
  193. Date_dispaly(0x80+0x40+9,time_data[6]);  //显示秒
  194. Date_dispaly(0x80+0x40+6,time_data[5]);  //显示分
  195. Date_dispaly(0x80+0x40+3,time_data[4]);  //显示时
  196. Date_dispaly(0x80+11,time_data[3]);   //显示日
  197. Date_dispaly(0x80+8,time_data[2]);   //显示月
  198. Week_dispaly(0x80+0x40+15,time_data[1]); //显示周
  199. Date_dispaly(0x80+5,time_data[0]);   //显示年
  200.         // Year/10*16+Year%10
  201. Hour=time_data[4]/16*10+time_data[4]%16;;
  202. Minute=time_data[5]/16*10+time_data[5]%16;;
  203. Second=time_data[6]/16*10+time_data[6]%16;;
  204. }

  205. void write_ds1302_byte(uchar dat)
  206. {
  207. uchar i;
  208. for(i=0;i<8;i++)
  209. {
  210.   sck=0;
  211.   io=dat&0x01;        //准备数据,从最低位开始
  212.   dat=dat>>1;
  213.   sck=1;
  214. }
  215. }
  216. void write_ds1302(uchar add,uchar dat)
  217. {
  218. rst=0;
  219. _nop_();        //CPU原地踏步
  220. sck=0;
  221. _nop_();
  222. rst=1;
  223. _nop_();
  224. write_ds1302_byte(add);      //传地址
  225. write_ds1302_byte(dat);      //传数据
  226. rst=0;           //不受其他影响
  227. _nop_();
  228. io=1;         //释放
  229. sck=1;
  230. }
  231. uchar read_ds1302(uchar add)
  232. {
  233. uchar i,value;
  234. rst=0;
  235. _nop_();  //CPU原地踏步
  236. sck=0;
  237. _nop_();
  238. rst=1;
  239. _nop_();
  240. write_ds1302_byte(add);
  241. for(i=0;i<8;i++)
  242. {
  243.   value=value>>1;
  244.   sck=0;
  245.   if(io)
  246.   value=value|0x80;
  247.   sck=1;
  248. }
  249. rst=0;
  250. _nop_();
  251. sck=0;
  252. _nop_();
  253. sck=1;
  254. io=1;
  255. return value;
  256. }
  257. void set_rtc()             //设置时间
  258. {
  259. uchar i,j;
  260. for(i=0;i<7;i++)    //转换BCD码
  261. {
  262.   j=time_data[i]/10;
  263.   time_data[i]=time_data[i]%10;
  264.   time_data[i]=time_data[i]+j*16;
  265. }
  266. write_ds1302(0x8e,0x00);   //去除写保护
  267. for(i=0;i<7;i++)
  268. {
  269.   write_ds1302(write_add[i],time_data[i]);
  270. }
  271. write_ds1302(0x8e,0x80);      //加写保护
  272. }
  273. void read_rtc()
  274. {
  275. uchar i;
  276. for(i=0;i<7;i++)
  277. {
  278.   time_data[i]=read_ds1302(read_add[i]); //最终读出来的数 16进制
  279. }
  280. }
  281. /*************************************************按键****************************************************************/
  282. void Keyscan(void)
  283. {
  284. if(SELT==0)
  285. {
  286.   delay1(2);
  287.   if(SELT==0)
  288.   {
  289.    while(!SELT);
  290.    Select_num++;     //选择键按下一次
  291.    Adjust=1;      //进入调节模式   
  292.   }
  293.   if(Select_num==1)
  294.   {
  295.    LCD_Clean(1);
  296.    LCD_Clean(2);
  297.    LCD_Display_String(1,table4);
  298.    LCD_Display_String(2,table5);
  299.    write_com(0x80+0);    //写 >>
  300.    write_date(0x3e);
  301.    write_com(0x80+1);    //写 >>
  302.    write_date(0x3e);
  303.    Enter_num=0;
  304.   }
  305.   if(Select_num==2)
  306.   {
  307.    LCD_Clean(1);
  308.    LCD_Clean(2);
  309.    LCD_Display_String(1,table4);
  310.    LCD_Display_String(2,table5);
  311.    write_com(0x80+0x40+0);    //写 >>
  312.    write_date(0x3e);
  313.    write_com(0x80+0x40+1);    //写 >>
  314.    write_date(0x3e);
  315.    Enter_num=0;
  316.   }
  317.   if(Select_num==3)
  318.   {
  319.       LCD_Clean(1);
  320.    LCD_Clean(2);
  321.    LCD_Display_String(1,tableA);
  322.    write_com(0x80+0);
  323.    write_date(0x3e);
  324.    write_com(0x80+1);
  325.    write_date(0x3e);
  326.   }
  327.   if(Select_num==4)
  328.   {
  329.    LCD_Clean(1);
  330.    LCD_Clean(2);
  331.    LCD_Display_String(1,table1);
  332.    LCD_Display_String(2,table2);
  333.    Select_num=0;
  334.    Enter_num=0;     
  335.    Adjust=0;
  336.   }
  337.   write_com(0x0c);         //光标不再闪烁
  338.   Enter_num=0;
  339. }

  340. if(ENTER==0)
  341. {
  342.   delay1(2);
  343.   if(ENTER==0)
  344.   {
  345.    while(!ENTER);
  346.    Enter_num++;
  347.   }
  348.   if(Select_num==1)     //设置实时时间
  349.   {
  350.    if(Enter_num==1)
  351.    {
  352.     LCD_Clean(1);
  353.     LCD_Clean(2);
  354.     LCD_Display_String(1,table9);
  355.     LCD_Display_String(2,table0);
  356.     SetTime_dispaly(0x80+8,Year);
  357.     SetTime_dispaly(0x80+11,Month);
  358.     SetTime_dispaly(0x80+14,Day);
  359.     SetTime_dispaly(0x80+0x40+6,Hour);
  360.     SetTime_dispaly(0x80+0x40+9,Minute);
  361.     SetTime_dispaly(0x80+0x40+12,Second);
  362.     Week_dispaly(0x80+0x40+15,Week);
  363.     write_com(0x80+8);   //光标闪烁地址,停留在年的位置上     
  364.     write_com(0x0f);   //光标闪烁
  365.    }
  366.    if(Enter_num==2)
  367.    {
  368.     write_com(0x80+11);   //光标闪烁地址,停留在月的位置上     
  369.     write_com(0x0f);   //光标闪烁
  370.    }
  371.    if(Enter_num==3)
  372.    {
  373.     write_com(0x80+14);   //光标闪烁地址,停留在日的位置上     
  374.     write_com(0x0f);   //光标闪烁
  375.    }
  376.    if(Enter_num==4)
  377.    {
  378.     write_com(0x80+0x40+6);  //光标闪烁地址,停留在时的位置上     
  379.     write_com(0x0f);   //光标闪烁
  380.    }
  381.    if(Enter_num==5)
  382.    {
  383.     write_com(0x80+0x40+9);  //光标闪烁地址,停留在分的位置上     
  384.     write_com(0x0f);   //光标闪烁
  385.    }
  386.    if(Enter_num==6)
  387.    {
  388.     write_com(0x80+0x40+12); //光标闪烁地址,停留在秒的位置上     
  389.     write_com(0x0f);   //光标闪烁
  390.    }
  391.    if(Enter_num==7)
  392.    {
  393.     write_com(0x80+0x40+15); //光标闪烁地址,停留在星期的位置上     
  394.     write_com(0x0f);   //光标闪烁
  395.    }
  396.    if(Enter_num==8)
  397.    {
  398.     Enter_num=0;
  399.     write_com(0x0c);   //光标不再闪烁
  400.     LCD_Clean(1);
  401.     LCD_Clean(2);
  402.     LCD_Display_String(1,table1);
  403.     LCD_Display_String(2,table2);
  404.     time_data[0]=Year;///10*16+Year%10;
  405.     time_data[1]=Week;///10*16+Week%10;
  406.     time_data[2]=Month;///10*16+Month%10;
  407.     time_data[3]=Day;///10*16+Day%10;
  408.     time_data[4]=Hour;///10*16+Hour%10;
  409.     time_data[5]=Minute;///10*16+Minute%10;
  410.     time_data[6]=Second;///10*16+Second%10;
  411.     set_rtc();      //设置时间
  412.     Select_num=0;
  413.     Adjust=0;
  414.    }
  415.   }
  416.   if(Select_num==2)     //设置开关锁时间
  417.   {
  418.    if(Enter_num==1)
  419.    {
  420.     LCD_Clean(1);
  421.     LCD_Clean(2);
  422.     LCD_Display_String(1,table6);
  423.     LCD_Display_String(2,table7);
  424.     SetTime_dispaly(0x80+0x40+4,Hour_L);
  425.     SetTime_dispaly(0x80+0x40+7,Minute_L);
  426.     SetTime_dispaly(0x80+0x40+10,Second_L);
  427.     write_com(0x80+0x40+4);  //光标闪烁地址,停留在时的位置上     
  428.     write_com(0x0f);   //光标闪烁
  429.    }
  430.    if(Enter_num==2)
  431.    {
  432.     write_com(0x80+0x40+7);  //光标闪烁地址,停留在分的位置上     
  433.     write_com(0x0f);   //光标闪烁
  434.    }
  435.    if(Enter_num==3)
  436.    {
  437.     write_com(0x80+0x40+10); //光标闪烁地址,停留在秒的位置上     
  438.     write_com(0x0f);   //光标闪烁
  439.    }
  440.    if(Enter_num==4)
  441.    {
  442.     write_com(0x0c);   //光标不再闪烁
  443.     LCD_Clean(1);
  444.     LCD_Clean(2);
  445.     LCD_Display_String(1,table8);
  446.     LCD_Display_String(2,table7);
  447.     SetTime_dispaly(0x80+0x40+4,Hour_H);
  448.     SetTime_dispaly(0x80+0x40+7,Minute_H);
  449.     SetTime_dispaly(0x80+0x40+10,Second_H);
  450.     write_com(0x80+0x40+4);  //光标闪烁地址,停留在时的位置上     
  451.     write_com(0x0f);   //光标闪烁
  452.    }
  453.    if(Enter_num==5)
  454.    {
  455.     write_com(0x80+0x40+7);  //光标闪烁地址,停留在分的位置上     
  456.     write_com(0x0f);   //光标闪烁
  457.    }
  458.    if(Enter_num==6)
  459.    {
  460.     write_com(0x80+0x40+10); //光标闪烁地址,停留在秒的位置上     
  461.     write_com(0x0f);   //光标闪烁
  462.    }  
  463.    if(Enter_num==7)
  464.    {
  465.     Enter_num=0;
  466.     write_com(0x0c);   //光标不再闪烁
  467.     LCD_Clean(1);
  468.     LCD_Clean(2);
  469.     LCD_Display_String(1,table1);
  470.     LCD_Display_String(2,table2);
  471.     Select_num=0;
  472.     Adjust=0;
  473.    }
  474.   }
  475.     if(Select_num==3)
  476.    {
  477.     if(Enter_num==1)
  478.     {
  479.      LCD_Clean(1);
  480.      LCD_Clean(2);
  481.      LCD_Display_String(1,tableB);
  482.      }
  483.     if(Enter_num==2)
  484.     {
  485.      Enter_num=0;
  486.      LCD_Clean(1);
  487.      LCD_Clean(2);
  488.      LCD_Display_String(1,table1);
  489.      LCD_Display_String(2,table2);
  490.      Select_num=0;
  491.      Adjust=0;
  492.      }
  493.     }
  494. }
  495. if(UP==0)
  496. {
  497.   delay1(2);
  498.   if(UP==0)
  499.   {
  500.    while(!UP);
  501.    if(Select_num==1)
  502.    {
  503.     if(Enter_num==1)
  504.     {
  505.      Year++;
  506.      if(Year>99)
  507.      Year=0;
  508.      SetTime_dispaly(0x80+8,Year);
  509.      write_com(0x80+8);        
  510.      write_com(0x0f);   
  511.     }
  512.     if(Enter_num==2)
  513.     {
  514.      Month++;
  515.      if(Month>12)
  516.      Month=1;
  517.      SetTime_dispaly(0x80+11,Month);
  518.      write_com(0x80+11);        
  519.      write_com(0x0f);         
  520.     }
  521.     if(Enter_num==3)
  522.     {
  523.      Day++;
  524.      if(Day>31)
  525.      Day=1;
  526.      SetTime_dispaly(0x80+14,Day);
  527.      write_com(0x80+14);        
  528.      write_com(0x0f);
  529.     }
  530.     if(Enter_num==4)
  531.     {
  532.      Hour++;
  533.      if(Hour>23)
  534.      Hour=0;
  535.      SetTime_dispaly(0x80+0x40+6,Hour);
  536.      write_com(0x80+0x40+6);        
  537.      write_com(0x0f);
  538.     }
  539.     if(Enter_num==5)
  540.     {
  541.      Minute++;
  542.      if(Minute>59)
  543.      Minute=0;
  544.      SetTime_dispaly(0x80+0x40+9,Minute);
  545.      write_com(0x80+0x40+9);        
  546.      write_com(0x0f);
  547.     }
  548.     if(Enter_num==6)
  549.     {
  550.      Second++;
  551.      if(Second>59)
  552.      Second=0;
  553.      SetTime_dispaly(0x80+0x40+12,Second);
  554.      write_com(0x80+0x40+12);        
  555.      write_com(0x0f);
  556.     }
  557.     if(Enter_num==7)
  558.     {
  559.      Week++;
  560.      if(Week>7)
  561.      Week=1;
  562.      Week_dispaly(0x80+0x40+15,Week);
  563.      write_com(0x80+0x40+15);        
  564.      write_com(0x0f);
  565.     }
  566.    }
  567.    if(Select_num==2)
  568.    {   
  569.     if(Enter_num==1)
  570.     {
  571.      Hour_L++;
  572.      if(Hour_L>23)
  573.      Hour_L=0;
  574.      SetTime_dispaly(0x80+0x40+4,Hour_L);
  575.      write_com(0x80+0x40+4);        
  576.      write_com(0x0f);
  577.     }
  578.     if(Enter_num==2)
  579.     {
  580.      Minute_L++;
  581.      if(Minute_L>59)
  582.      Minute_L=0;
  583.      SetTime_dispaly(0x80+0x40+7,Minute_L);
  584.      write_com(0x80+0x40+7);        
  585.      write_com(0x0f);
  586.     }
  587.      
  588.     if(Enter_num==3)
  589.     {
  590.      Second_L++;
  591.      if(Second_L>59)
  592.      Second_L=0;
  593.      SetTime_dispaly(0x80+0x40+10,Second_L);
  594.      write_com(0x80+0x40+10);        
  595.      write_com(0x0f);
  596.     }
  597.     if(Enter_num==4)
  598.     {
  599.      Hour_H++;
  600.      if(Hour_H>23)
  601.      Hour_H=0;
  602.      SetTime_dispaly(0x80+0x40+4,Hour_H);
  603.      write_com(0x80+0x40+4);        
  604.      write_com(0x0f);
  605.     }
  606.     if(Enter_num==5)
  607.     {
  608.      Minute_H++;
  609.      if(Minute_H>59)
  610.      Minute_H=0;
  611.      SetTime_dispaly(0x80+0x40+7,Minute_H);
  612.      write_com(0x80+0x40+7);        
  613.      write_com(0x0f);
  614.     }
  615.      
  616.     if(Enter_num==6)
  617.     {
  618.      Second_H++;
  619.      if(Second_H>59)
  620.      Second_H=0;
  621.      SetTime_dispaly(0x80+0x40+10,Second_H);
  622.      write_com(0x80+0x40+10);        
  623.      write_com(0x0f);
  624.     }   
  625.    }
  626.   }
  627. }
  628. if(DOWN==0)
  629. {
  630.   delay1(2);
  631.   if(DOWN==0)
  632.   {
  633.    while(!DOWN);
  634.    if(Select_num==1)
  635.    {
  636.     if(Enter_num==1)
  637.     {
  638.      Year--;
  639.      if(Year<0)
  640.      Year=99;
  641.      SetTime_dispaly(0x80+8,Year);
  642.      write_com(0x80+8);        
  643.      write_com(0x0f);
  644.     }
  645.     if(Enter_num==2)
  646.     {
  647.      Month--;
  648.      if(Month<1)
  649.      Month=12;
  650.      SetTime_dispaly(0x80+11,Month);
  651.      write_com(0x80+11);        
  652.      write_com(0x0f);
  653.     }
  654.     if(Enter_num==3)
  655.     {
  656.      Day--;
  657.      if(Day<1)
  658.      Day=31;
  659.      SetTime_dispaly(0x80+14,Day);
  660.      write_com(0x80+14);        
  661.      write_com(0x0f);
  662.     }
  663.     if(Enter_num==4)
  664.     {
  665.      Hour--;
  666.      if(Hour<0)
  667.      Hour=23;
  668.      SetTime_dispaly(0x80+0x40+6,Hour);
  669.      write_com(0x80+0x40+6);        
  670.      write_com(0x0f);
  671.     }
  672.     if(Enter_num==5)
  673.     {
  674.      Minute--;
  675.      if(Minute<0)
  676.      Minute=59;
  677.      SetTime_dispaly(0x80+0x40+9,Minute);
  678.      write_com(0x80+0x40+9);        
  679.      write_com(0x0f);
  680.     }
  681.     if(Enter_num==6)
  682.     {
  683.      Second--;
  684.      if(Second<0)
  685.      Second=59;
  686.      SetTime_dispaly(0x80+0x40+12,Second);
  687.      write_com(0x80+0x40+12);        
  688.      write_com(0x0f);
  689.     }
  690.     if(Enter_num==7)
  691.     {
  692.      Week--;
  693.      if(Week<1)
  694.      Week=7;
  695.      Week_dispaly(0x80+0x40+15,Week);
  696.      write_com(0x80+0x40+15);        
  697.      write_com(0x0f);
  698.     }  
  699.    }
  700.    if(Select_num==2)
  701.    {
  702.     if(Enter_num==1)
  703.     {
  704.      Hour_L--;
  705.      if(Hour_L<0)
  706.      Hour_L=23;
  707.      SetTime_dispaly(0x80+0x40+4,Hour_L);
  708.      write_com(0x80+0x40+4);        
  709.      write_com(0x0f);
  710.     }
  711.     if(Enter_num==2)
  712.     {
  713.      Minute_L--;
  714.      if(Minute_L<0)
  715.      Minute_L=59;
  716.      SetTime_dispaly(0x80+0x40+7,Minute_L);
  717.      write_com(0x80+0x40+7);        
  718.      write_com(0x0f);
  719.     }
  720.     if(Enter_num==3)
  721.     {
  722.      Second_L--;
  723.      if(Second_L<0)
  724.      Second_L=59;
  725.      SetTime_dispaly(0x80+0x40+10,Second_L);
  726.      write_com(0x80+0x40+10);        
  727.      write_com(0x0f);
  728.     }
  729.      
  730.     if(Enter_num==4)
  731.     {
  732.      Hour_H--;
  733.      if(Hour_H<0)
  734.      Hour_H=23;
  735.      SetTime_dispaly(0x80+0x40+4,Hour_H);
  736.      write_com(0x80+0x40+4);        
  737.      write_com(0x0f);
  738.     }
  739.     if(Enter_num==5)
  740.     {
  741.      Minute_H--;
  742.      if(Minute_H<0)
  743.      Minute_H=59;
  744.      SetTime_dispaly(0x80+0x40+7,Minute_H);
  745.      write_com(0x80+0x40+7);        
  746.      write_com(0x0f);
  747.     }
  748.     if(Enter_num==6)
  749.     {
  750.      Second_H--;
  751.      if(Second_H<0)
  752.      Second_H=59;
  753.      SetTime_dispaly(0x80+0x40+10,Second_H);
  754.      write_com(0x80+0x40+10);        
  755.      write_com(0x0f);
  756.     }
  757.    }
  758.   }
  759. }
  760. if(MODE==0)       //切换按键按下
  761. {
  762.   delay1(2);       //消抖
  763.   if(MODE==0)
  764.   {
  765.    while(!MODE);     //按键释放
  766.    Auto_flg=~Auto_flg;    //模式切换
  767.    if(Auto_flg==0)     //自动模式
  768.    {
  769.     AUTO_LED=0;     //自动灯亮
  770.     HAND_LED=1;
  771.    }
  772.    if(Auto_flg==1)     //手动模式
  773.    {
  774.     AUTO_LED=1;     
  775.     HAND_LED=0;     //手动灯亮
  776.     LAMP1=1;     //关灯
  777.     LAMP2=1;
  778.     LAMP3=1;
  779.     LAMP4=1;
  780.    }
  781.   }
  782. }
  783. if(Auto_flg==1)       //手动模式
  784. {
  785.   if(SWITCH==0)      //灯开关按键按下
  786.   {
  787.    delay1(2);      //消抖
  788.    if(SWITCH==0)
  789.    {
  790.     while(!SWITCH);    //按键释放
  791.     Switch_num++;    //按下次数增加
  792.     if(Switch_num==1)   //按下一次,开一盏灯
  793.     {
  794.      LAMP1=0;
  795.      LAMP2=1;
  796.      LAMP3=1;
  797.      LAMP4=1;
  798.     }
  799.     if(Switch_num==2)   //按下二次,开二盏灯
  800.     {
  801.      LAMP1=0;
  802.      LAMP2=0;
  803.      LAMP3=1;
  804.      LAMP4=1;
  805.     }
  806.     if(Switch_num==3)   //按下3次,开3盏灯
  807.     {
  808.      LAMP1=0;
  809.      LAMP2=0;
  810.      LAMP3=0;
  811.      LAMP4=1;
  812.     }
  813.     if(Switch_num==4)   //按下4次,开4盏灯
  814.     {
  815.      LAMP1=0;
  816.      LAMP2=0;
  817.      LAMP3=0;
  818.      LAMP4=0;
  819.     }
  820.     if(Switch_num==5)   //按下5次,开0盏灯
  821.     {
  822.      LAMP1=1;
  823.      LAMP2=1;
  824.      LAMP3=1;
  825.      LAMP4=1;
  826.      Switch_num=0;   //次数清除
  827.     }
  828.    }
  829.   }
  830. }
  831. }
  832. void Open(void)
  833. {
  834. float Now;
  835. float Set_L,Set_H;
  836. Now=Hour+Minute/60+Second/3600;        //把实时时间化成小时为单位
  837. Set_L=Hour_L+Minute_L/60+Second_L/3600;      //把设置下限时间化成小时为单位
  838. Set_H=Hour_H+Minute_H/60+Second_H/3600;      //把设置上限时间化成小时为单位
  839. if(Auto_flg==0)          //自动模式
  840. {
  841.   if((Now>=Set_L)&(Now<=Set_H))       //实时时间在上下限时间范围内
  842.   {
  843.    if(LIGHT1==0)           //光线不足
  844.    {
  845.     if(Value1==0)
  846.     {
  847.      LAMP1=1;       //全灭
  848.      LAMP2=1;
  849.      LAMP3=1;
  850.      LAMP4=1;
  851.     }
  852.     if((Value1>0)&(Value1<10))
  853.     {
  854.      LAMP1=0;       //亮一个灯
  855.      LAMP2=1;
  856.      LAMP3=1;
  857.      LAMP4=1;
  858.     }
  859.     if((Value1>=10)&(Value1<20))
  860.     {
  861.      LAMP1=0;       //亮二个灯
  862.      LAMP2=0;
  863.      LAMP3=1;
  864.      LAMP4=1;
  865.     }
  866.     if((Value1>=20)&(Value1<30))
  867.     {
  868.      LAMP1=0;       //亮三个灯
  869.      LAMP2=0;
  870.      LAMP3=0;
  871.      LAMP4=1;
  872.     }
  873.     if(Value1>=30)
  874.     {
  875.      LAMP1=0;       //亮四个灯
  876.      LAMP2=0;
  877.      LAMP3=0;
  878.      LAMP4=0;
  879.     }
  880.    }
  881.    if(LIGHT1==1)           //光线强烈
  882.    {
  883.     LAMP1=1;        //全灭
  884.     LAMP2=1;
  885.     LAMP3=1;
  886.     LAMP4=1;
  887.    }
  888.   }

  889.   if((Now<Set_L)|(Now>Set_H))        //实时时间不在范围内
  890.   {
  891.    LAMP1=1;         //全灭
  892.    LAMP2=1;
  893.    LAMP3=1;
  894.    LAMP4=1;
  895.   }
  896.    if((Now>=Set_L)&(Now<=Set_H))
  897.    {
  898.    if(LIGHT1==0)
  899.    {
  900.     if(IN1==0)
  901.     {
  902.      LAMP1=0;
  903.   LAMP2=0;
  904.   }
  905.     if(OUT1==0)
  906.     {
  907.      LAMP3=0;
  908.   LAMP4=0;
  909.   }
  910. }
  911. }
  912.      }
  913.      }
复制代码

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

使用道具 举报

沙发
ID:94031 发表于 2018-11-20 18:01 | 只看该作者
此帖仅作者可见

使用道具 举报

板凳
ID:425443 发表于 2018-11-20 20:38 | 只看该作者
此帖仅作者可见

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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