找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1103|回复: 5
收起左侧

求师傅指教。MCU闰年判断问题 ,是我用的if else太多了吗?

[复制链接]
ID:647620 发表于 2019-12-15 15:16 | 显示全部楼层 |阅读模式
最近用到DS1302。写入日期的函数弄成了下面的样子,Key1 Key2 是数值加减 Key3 是退出  ,可是测试中没有按Key3总会不定时的意外退出。。
求老师们帮我看看怎么修改才能更稳定更简洁,问题的原因在哪里呢?
  1. void SetDate()   
  2. {
  3.           OLED_CLLine(0);
  4.           Date  = ( ((time_buf[3]>>4)*10)+ (time_buf[3]&0x0F) )   ;
  5.       while(1)
  6.           {
  7.                   KEY_1 = 1;
  8.                         if (KEY_1==0)
  9.                         {
  10.                              keybuffer++;
  11.                                  if( keybuffer==keydelay )
  12.                                          {
  13.                                                             keybuffer=0;
  14.                                                                   if ( (Month==1)||(Month==3)||(Month==5)||(Month==7)||(Month==8)||(Month==10)||(Month==12) )         //如果是大月
  15.                                                                           {if(Date<31)Date++;break;}
  16.                                             else if ( (Month==4)||(Month==6)||(Month==9)||(Month==11) )                   //如果是小月
  17.                                                                           {if(Date<30)Date++;break;}
  18.                                     else if  (((Year%4==0)&&(Year%100!=0))||( Year%400==0 ))                         //如果是闰年二月
  19.                                                                      {if(Date<29)Date++;break;}
  20.                                                             else                                                                                                                             //如果是平二月
  21.                                                               {if(Date<28)Date++;}                                         
  22.                                          }
  23.                         }
  24.                         KEY_2 = 1;        
  25.                     if (KEY_2==0)        
  26.                         {
  27.                              keybuffer++;
  28.                                  if( keybuffer==keydelay )
  29.                                          {
  30.                                                  keybuffer=0;
  31.                                                  EA = 0 ;
  32.                                                  if (Date>1)Date--;
  33.                                                  else
  34.                                                                   if ( (Month==1)||(Month==3)||(Month==5)||(Month==7)||(Month==8)||(Month==10)||(Month==12) )         //如果是大月
  35.                                                                          Date = 31;
  36.                                             else if ( (Month==4)||(Month==6)||(Month==9)||(Month==11) )                   //小月
  37.                                                                           Date = 30;
  38.                                     else if  (((Year%4==0)&&(Year%100!=0))||( Year%400==0 ))                   //闰二月
  39.                                                                        Date = 29;
  40.                                                             else   
  41.                                                                Date = 28;                                                                                              //平二月
  42.                                          }                          
  43.                          }
  44.                         OLED_P16x16Ch(0, 0, 37);     //显示部分。。。
  45.                         OLED_P16x16Ch(16, 0, 38);
  46.                         OLED_P16x16Ch(32, 0, 46);
  47.                         OLED_P16x16Ch(48, 0, 43);
  48.                         OLED_P16x16Ch(64, 0, 46);
  49.                         OLED_P16x16Ch(80, 0, 19);
  50.                         OLED_P16x16Ch(96, 0, (Date/10));
  51.                         OLED_P16x16Ch(112, 0, (Date%10));
  52.                         OLED_Refresh();
  53.                         Check_Dry();
  54.                     Check_Open();
  55.                     /*********************/
  56.                          KEY_3 = 1;                             //退出键
  57.                         if (KEY_3==0)
  58.                         {
  59.                            keybuffer++;                           
  60.                               if (keybuffer==keydelay)           // keydelay大小控制连按速度
  61.                                     {
  62.                                                 keybuffer=0;        
  63. //                                                EA = 0 ;
  64. <div>                                                time_buf[3]= (  (  (Date/10)<<4  )|(Date%10)  );             //日期值装入缓存</div><div>                                                       //(本来想用上下几行被注释掉的代码只对ds1302写日期,可是不知到为什么不行、、)
  65. </div>ds1302_write_time();                                     //xie
  66. //                                                ds1302_write_byte(ds1302_control_add,0x00);                        //???д????
  67. //                            ds1302_write_byte(ds1302_sec_add,0x80);                                //??????
  68. //                                                ds1302_write_byte(ds1302_min_add,time_buf[3]);                 //??   DS1302  д ??
  69. //                                                ds1302_write_byte(ds1302_sec_add,0x00);                        //?????
  70. //                                                ds1302_write_byte(ds1302_control_add,0x80);                        //??д????
  71. //                                                EA = 1 ;
  72.                                                 OLED_CLLine(0);OLED_CLLine(1);
  73.                                                 OLED_P16x16Str(40,0,Quit);                   //??????
  74.                                                 delay_ms(500);
  75.                                                 OLED_CLLine(0);OLED_CLLine(1);                                            
  76.                                                 return;  
  77.                                }               
  78.                         }
  79.           }
  80. }
复制代码





回复

使用道具 举报

ID:647620 发表于 2019-12-15 16:05 | 显示全部楼层
还有闰年判断部分  同时用&&和|| 会短路吗?
回复

使用道具 举报

ID:647620 发表于 2019-12-15 16:07 | 显示全部楼层
是不是应该改成& 和|。。。
回复

使用道具 举报

ID:647620 发表于 2019-12-15 16:21 | 显示全部楼层
重写了一个、、
  1. void SetDate()
  2. {
  3.       OLED_CLLine(0);                                                                                           //????
  4.           Date  = ( ((time_buf[3]>>4)*10)+ (time_buf[3]&0x0F) )   ;          //??????????????
  5.           if (( Year%400==0 )||((Year%4==0)&(Year%100!=0)))  { DaysInMonth[1] = 29;  }        //?????????????29??
  6.           else   DaysInMonth[1] = 28;  

  7.           while(1)
  8.           {
  9.                   KEY_1 = 1;
  10.                         if (KEY_1==0)
  11.                         {
  12.                              keybuffer++;
  13.                                  if( keybuffer==keydelay )
  14.                                          {
  15.                                               keybuffer=0;
  16.                                                   if(Date<DaysInMonth[Month-1])Date++;  
  17.                                                   else           Date = 1;                        
  18.                                          }
  19.                         }
  20.                         KEY_2 = 1;       
  21.                     if (KEY_2==0)       
  22.                         {
  23.                              keybuffer++;
  24.                                  if( keybuffer==keydelay )
  25.                                          {
  26.                                                  keybuffer=0;
  27.                                                  if (Date>1)Date--;
  28.                                                  else
  29.                                                  Date = DaysInMonth[Month-1];
  30.                                          }                          
  31.                          }
  32.                         OLED_P16x16Ch(0, 0, 37);
  33.                         OLED_P16x16Ch(16, 0, 38);
  34.                         OLED_P16x16Ch(32, 0, 46);
  35.                         OLED_P16x16Ch(48, 0, 43);
  36.                         OLED_P16x16Ch(64, 0, 46);
  37.                         OLED_P16x16Ch(80, 0, 19);
  38.                         OLED_P16x16Ch(96, 0, (Date/10));
  39.                         OLED_P16x16Ch(112, 0, (Date%10));
  40.                         OLED_Refresh();
  41.                         Check_Dry();
  42.                     Check_Open();
  43.                     /*********************/
  44.                          KEY_3 = 1;
  45.                         if (KEY_3==0)
  46.                         {
  47.                            keybuffer++;                  
  48.                               if (keybuffer==keydelay)
  49.                                     {
  50.                                                 keybuffer=0;       
  51.                                                 time_buf[3]= (  (  (Date/10)<<4  )|(Date%10)  );             //??  ??仺??  д  ??
  52.                                                 ds1302_write_time();                                                     //??dS1302д???????
  53.                                                 OLED_CLLine(0);OLED_CLLine(1);
  54.                                                 OLED_P16x16Str(40,0,Quit);                   //??????
  55.                                                 delay_ms(500);
  56.                                                 OLED_CLLine(0);OLED_CLLine(1);                                            
  57.                                                 return;  
  58.                                }               
  59.                         }
  60.           }



  61. }
复制代码
回复

使用道具 举报

ID:647620 发表于 2019-12-15 16:22 | 显示全部楼层
重写一个试试。。
  1. void SetDate()
  2. {
  3.       OLED_CLLine(0);                                                                                           //????
  4.           Date  = ( ((time_buf[3]>>4)*10)+ (time_buf[3]&0x0F) )   ;          //??????????????
  5.           if (( Year%400==0 )||((Year%4==0)&(Year%100!=0)))  { DaysInMonth[1] = 29;  }        //?????????????29??
  6.           else   DaysInMonth[1] = 28;  

  7.           while(1)
  8.           {
  9.                   KEY_1 = 1;
  10.                         if (KEY_1==0)
  11.                         {
  12.                              keybuffer++;
  13.                                  if( keybuffer==keydelay )
  14.                                          {
  15.                                               keybuffer=0;
  16.                                                   if(Date<DaysInMonth[Month-1])Date++;  
  17.                                                   else           Date = 1;                        
  18.                                          }
  19.                         }
  20.                         KEY_2 = 1;       
  21.                     if (KEY_2==0)       
  22.                         {
  23.                              keybuffer++;
  24.                                  if( keybuffer==keydelay )
  25.                                          {
  26.                                                  keybuffer=0;
  27.                                                  if (Date>1)Date--;
  28.                                                  else
  29.                                                  Date = DaysInMonth[Month-1];
  30.                                          }                          
  31.                          }
  32.                         OLED_P16x16Ch(0, 0, 37);
  33.                         OLED_P16x16Ch(16, 0, 38);
  34.                         OLED_P16x16Ch(32, 0, 46);
  35.                         OLED_P16x16Ch(48, 0, 43);
  36.                         OLED_P16x16Ch(64, 0, 46);
  37.                         OLED_P16x16Ch(80, 0, 19);
  38.                         OLED_P16x16Ch(96, 0, (Date/10));
  39.                         OLED_P16x16Ch(112, 0, (Date%10));
  40.                         OLED_Refresh();
  41.                         Check_Dry();
  42.                     Check_Open();
  43.                     /*********************/
  44.                          KEY_3 = 1;
  45.                         if (KEY_3==0)
  46.                         {
  47.                            keybuffer++;                  
  48.                               if (keybuffer==keydelay)
  49.                                     {
  50.                                                 keybuffer=0;       
  51.                                                 time_buf[3]= (  (  (Date/10)<<4  )|(Date%10)  );             //??  ??仺??  д  ??
  52.                                                 ds1302_write_time();                                                     //??dS1302д???????
  53.                                                 OLED_CLLine(0);OLED_CLLine(1);
  54.                                                 OLED_P16x16Str(40,0,Quit);                   //??????
  55.                                                 delay_ms(500);
  56.                                                 OLED_CLLine(0);OLED_CLLine(1);                                            
  57.                                                 return;  
  58.                                }               
  59.                         }
  60.           }



  61. }
复制代码
回复

使用道具 举报

ID:351421 发表于 2019-12-26 15:49 | 显示全部楼层
好了吗,还有什么问题。&和&&的差别不大,&可用作位运算符,初次之外用&&时当第一个条件不成立时不会再判断后面的条件,&则会再运行。总的来说差别不大。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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