久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1443|回復: 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. }
復制代碼





分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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. }
復制代碼
回復

使用道具 舉報

5#
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. }
復制代碼
回復

使用道具 舉報

6#
ID:351421 發表于 2019-12-26 15:49 | 只看該作者
好了嗎,還有什么問題。&和&&的差別不大,&可用作位運算符,初次之外用&&時當第一個條件不成立時不會再判斷后面的條件,&則會再運行。總的來說差別不大。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品永久久久久久久www | 九九综合九九 | www.99热| 久久不卡 | 久久精品成人热国产成 | 成人在线精品视频 | 亚洲女人天堂网 | 中文字幕在线观看 | 精品视频一区二区 | 国产目拍亚洲精品99久久精品 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 | 久热精品在线 | 国产探花在线观看视频 | 国产成人精品免高潮在线观看 | 四色成人av永久网址 | 成人精品一区二区 | 国产成人一区二区三区电影 | 二区av | 亚洲精品视频网站在线观看 | 日韩一区二区在线视频 | 色视频在线观看 | 狠狠操天天干 | 欧美99| 在线观看免费高清av | 久久久久网站 | 成人av在线播放 | 精品国产久| 成人午夜影院 | 二区在线视频 | 亚洲免费精品一区 | 亚洲成人福利在线观看 | 九九热这里 | 欧美精品久久久 | 天天操人人干 | 国产精品久久久久久久久动漫 | 成人在线视频一区 | 成人无遮挡毛片免费看 | 国产高清视频在线播放 | 久久国产欧美日韩精品 | 伊人一区 | 性一爱一乱一交一视频 |