標題: 求師傅指教。MCU閏年判斷問題 ,是我用的if else太多了嗎? [打印本頁]

作者: Armweak    時間: 2019-12-15 15:16
標題: 求師傅指教。MCU閏年判斷問題 ,是我用的if else太多了嗎?
最近用到DS1302。寫入日期的函數(shù)弄成了下面的樣子,Key1 Key2 是數(shù)值加減 Key3 是退出  ,可是測試中沒有按Key3總會不定時的意外退出。。
求老師們幫我看看怎么修改才能更穩(wěn)定更簡潔,問題的原因在哪里呢?
  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. }
復(fù)制代碼






作者: Armweak    時間: 2019-12-15 16:05
還有閏年判斷部分  同時用&&和|| 會短路嗎?
作者: Armweak    時間: 2019-12-15 16:07
是不是應(yīng)該改成& 和|。。。
作者: Armweak    時間: 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. }
復(fù)制代碼

作者: Armweak    時間: 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. }
復(fù)制代碼

作者: 沒耐心    時間: 2019-12-26 15:49
好了嗎,還有什么問題。&和&&的差別不大,&可用作位運算符,初次之外用&&時當?shù)谝粋條件不成立時不會再判斷后面的條件,&則會再運行?偟膩碚f差別不大。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1