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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1543|回復: 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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

地板
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:07 | 只看該作者
是不是應該改成& 和|。。。
回復

使用道具 舉報

沙發
ID:647620 發表于 2019-12-15 16:05 | 只看該作者
還有閏年判斷部分  同時用&&和|| 會短路嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美一区二区三区日本久久久 | 日韩在线中文字幕 | 日本黄色免费视频 | 日本在线网址 | 91资源在线| 99热精品在线观看 | 国产yw851.c免费观看网站 | 国产欧美一区二区三区日本久久久 | 91精品国产综合久久久久久丝袜 | 久久免费视频观看 | 一区二区三区视频免费观看 | 91色视频在线 | 精品久久久久国产免费第一页 | 午夜在线电影网 | 一级片av | 久久激情网 | 亚洲成人精品免费 | 免费的色网站 | 欧美多人在线 | 中文字幕第一页在线 | 久久精品亚洲成在人线av网址 | 日韩电影免费在线观看中文字幕 | 国产一二三区精品视频 | 免费在线成人网 | 国产黄色精品在线观看 | 日韩免费 | 成人久久久| 色免费视频 | av免费看片 | 国产在线精品免费 | 成人欧美一区二区三区黑人孕妇 | 亚洲精品一区二区另类图片 | 99久热| 丝袜天堂| 国产午夜视频 | 国产精品久久久久久久久久 | 亚洲精品一区二区冲田杏梨 | 日韩国产欧美视频 | 9久久| 日韩精品一区二区三区 | 欧美美女爱爱视频 |