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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1469|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

求師傅指教。MCU閏年判斷問(wèn)題 ,是我用的if else太多了嗎?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:647620 發(fā)表于 2019-12-15 15:16 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
最近用到DS1302。寫入日期的函數(shù)弄成了下面的樣子,Key1 Key2 是數(shù)值加減 Key3 是退出  ,可是測(cè)試中沒(méi)有按Key3總會(huì)不定時(shí)的意外退出。。
求老師們幫我看看怎么修改才能更穩(wěn)定更簡(jiǎn)潔,問(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>                                                       //(本來(lái)想用上下幾行被注釋掉的代碼只對(duì)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ù)制代碼





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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

板凳
ID:647620 發(fā)表于 2019-12-15 16:07 | 只看該作者
是不是應(yīng)該改成& 和|。。。
回復(fù)

使用道具 舉報(bào)

地板
ID:647620 發(fā)表于 2019-12-15 16:21 | 只看該作者
重寫了一個(gè)、、
  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ù)制代碼
回復(fù)

使用道具 舉報(bào)

5#
ID:647620 發(fā)表于 2019-12-15 16:22 | 只看該作者
重寫一個(gè)試試。。
  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ù)制代碼
回復(fù)

使用道具 舉報(bào)

6#
ID:351421 發(fā)表于 2019-12-26 15:49 | 只看該作者
好了嗎,還有什么問(wèn)題。&和&&的差別不大,&可用作位運(yùn)算符,初次之外用&&時(shí)當(dāng)?shù)谝粋(gè)條件不成立時(shí)不會(huì)再判斷后面的條件,&則會(huì)再運(yùn)行。總的來(lái)說(shuō)差別不大。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美三级三级三级爽爽爽 | 国产在线视频三区 | 午夜视频在线观看一区二区 | 精品国产青草久久久久福利 | 97精品一区二区 | 国产成人在线观看免费 | 黄色毛片黄色毛片 | 欧美日韩在线免费 | 精品国产欧美一区二区 | 成人综合久久 | 亚洲aⅴ | 中文字幕在线观看视频网站 | 国产精品久久久久久久久久 | 欧美日韩欧美 | 国产高清一区二区 | 亚洲成人av在线播放 | 97国产超碰 | 亚洲日韩第一页 | 国产精品极品美女在线观看免费 | 伊人久久免费视频 | 国产精品久久国产精品 | 欧美日韩福利视频 | 国产日韩精品一区二区 | 国产亚洲黄色片 | 毛片一区 | 国产欧美视频一区 | 日韩精品视频在线观看一区二区三区 | 亚洲精品一区二区网址 | 精品国产1区2区3区 在线国产视频 | 岛国av免费观看 | 日本一区二区三区免费观看 | 国产资源视频 | 成人精品一区二区 | aaaa日韩| 日韩精品免费在线观看 | 欧美一区二区三区四区五区无卡码 | 欧美日韩中文字幕在线播放 | 欧美黄色一级毛片 | 一级片av| 亚洲三区视频 | 免费成人高清在线视频 |