標題:
求師傅指教。MCU閏年判斷問題 ,是我用的if else太多了嗎?
[打印本頁]
作者:
Armweak
時間:
2019-12-15 15:16
標題:
求師傅指教。MCU閏年判斷問題 ,是我用的if else太多了嗎?
最近用到DS1302。寫入日期的函數(shù)弄成了下面的樣子,Key1 Key2 是數(shù)值加減 Key3 是退出 ,可是測試中沒有按Key3總會不定時的意外退出。。
求老師們幫我看看怎么修改才能更穩(wěn)定更簡潔,問題的原因在哪里呢?
void SetDate()
{
OLED_CLLine(0);
Date = ( ((time_buf[3]>>4)*10)+ (time_buf[3]&0x0F) ) ;
while(1)
{
KEY_1 = 1;
if (KEY_1==0)
{
keybuffer++;
if( keybuffer==keydelay )
{
keybuffer=0;
if ( (Month==1)||(Month==3)||(Month==5)||(Month==7)||(Month==8)||(Month==10)||(Month==12) ) //如果是大月
{if(Date<31)Date++;break;}
else if ( (Month==4)||(Month==6)||(Month==9)||(Month==11) ) //如果是小月
{if(Date<30)Date++;break;}
else if (((Year%4==0)&&(Year%100!=0))||( Year%400==0 )) //如果是閏年二月
{if(Date<29)Date++;break;}
else //如果是平二月
{if(Date<28)Date++;}
}
}
KEY_2 = 1;
if (KEY_2==0)
{
keybuffer++;
if( keybuffer==keydelay )
{
keybuffer=0;
EA = 0 ;
if (Date>1)Date--;
else
if ( (Month==1)||(Month==3)||(Month==5)||(Month==7)||(Month==8)||(Month==10)||(Month==12) ) //如果是大月
Date = 31;
else if ( (Month==4)||(Month==6)||(Month==9)||(Month==11) ) //小月
Date = 30;
else if (((Year%4==0)&&(Year%100!=0))||( Year%400==0 )) //閏二月
Date = 29;
else
Date = 28; //平二月
}
}
OLED_P16x16Ch(0, 0, 37); //顯示部分。。。
OLED_P16x16Ch(16, 0, 38);
OLED_P16x16Ch(32, 0, 46);
OLED_P16x16Ch(48, 0, 43);
OLED_P16x16Ch(64, 0, 46);
OLED_P16x16Ch(80, 0, 19);
OLED_P16x16Ch(96, 0, (Date/10));
OLED_P16x16Ch(112, 0, (Date%10));
OLED_Refresh();
Check_Dry();
Check_Open();
/*********************/
KEY_3 = 1; //退出鍵
if (KEY_3==0)
{
keybuffer++;
if (keybuffer==keydelay) // keydelay大小控制連按速度
{
keybuffer=0;
// EA = 0 ;
<div> time_buf[3]= ( ( (Date/10)<<4 )|(Date%10) ); //日期值裝入緩存</div><div> //(本來想用上下幾行被注釋掉的代碼只對ds1302寫日期,可是不知到為什么不行、、)
</div>ds1302_write_time(); //xie
// ds1302_write_byte(ds1302_control_add,0x00); //???д????
// ds1302_write_byte(ds1302_sec_add,0x80); //??????
// ds1302_write_byte(ds1302_min_add,time_buf[3]); //?? DS1302 д ??
// ds1302_write_byte(ds1302_sec_add,0x00); //?????
// ds1302_write_byte(ds1302_control_add,0x80); //??д????
// EA = 1 ;
OLED_CLLine(0);OLED_CLLine(1);
OLED_P16x16Str(40,0,Quit); //??????
delay_ms(500);
OLED_CLLine(0);OLED_CLLine(1);
return;
}
}
}
}
復(fù)制代碼
作者:
Armweak
時間:
2019-12-15 16:05
還有閏年判斷部分 同時用&&和|| 會短路嗎?
作者:
Armweak
時間:
2019-12-15 16:07
是不是應(yīng)該改成& 和|。。。
作者:
Armweak
時間:
2019-12-15 16:21
重寫了一個、、
void SetDate()
{
OLED_CLLine(0); //????
Date = ( ((time_buf[3]>>4)*10)+ (time_buf[3]&0x0F) ) ; //??????????????
if (( Year%400==0 )||((Year%4==0)&(Year%100!=0))) { DaysInMonth[1] = 29; } //?????????????29??
else DaysInMonth[1] = 28;
while(1)
{
KEY_1 = 1;
if (KEY_1==0)
{
keybuffer++;
if( keybuffer==keydelay )
{
keybuffer=0;
if(Date<DaysInMonth[Month-1])Date++;
else Date = 1;
}
}
KEY_2 = 1;
if (KEY_2==0)
{
keybuffer++;
if( keybuffer==keydelay )
{
keybuffer=0;
if (Date>1)Date--;
else
Date = DaysInMonth[Month-1];
}
}
OLED_P16x16Ch(0, 0, 37);
OLED_P16x16Ch(16, 0, 38);
OLED_P16x16Ch(32, 0, 46);
OLED_P16x16Ch(48, 0, 43);
OLED_P16x16Ch(64, 0, 46);
OLED_P16x16Ch(80, 0, 19);
OLED_P16x16Ch(96, 0, (Date/10));
OLED_P16x16Ch(112, 0, (Date%10));
OLED_Refresh();
Check_Dry();
Check_Open();
/*********************/
KEY_3 = 1;
if (KEY_3==0)
{
keybuffer++;
if (keybuffer==keydelay)
{
keybuffer=0;
time_buf[3]= ( ( (Date/10)<<4 )|(Date%10) ); //?? ??仺?? д ??
ds1302_write_time(); //??dS1302д???????
OLED_CLLine(0);OLED_CLLine(1);
OLED_P16x16Str(40,0,Quit); //??????
delay_ms(500);
OLED_CLLine(0);OLED_CLLine(1);
return;
}
}
}
}
復(fù)制代碼
作者:
Armweak
時間:
2019-12-15 16:22
重寫一個試試。。
void SetDate()
{
OLED_CLLine(0); //????
Date = ( ((time_buf[3]>>4)*10)+ (time_buf[3]&0x0F) ) ; //??????????????
if (( Year%400==0 )||((Year%4==0)&(Year%100!=0))) { DaysInMonth[1] = 29; } //?????????????29??
else DaysInMonth[1] = 28;
while(1)
{
KEY_1 = 1;
if (KEY_1==0)
{
keybuffer++;
if( keybuffer==keydelay )
{
keybuffer=0;
if(Date<DaysInMonth[Month-1])Date++;
else Date = 1;
}
}
KEY_2 = 1;
if (KEY_2==0)
{
keybuffer++;
if( keybuffer==keydelay )
{
keybuffer=0;
if (Date>1)Date--;
else
Date = DaysInMonth[Month-1];
}
}
OLED_P16x16Ch(0, 0, 37);
OLED_P16x16Ch(16, 0, 38);
OLED_P16x16Ch(32, 0, 46);
OLED_P16x16Ch(48, 0, 43);
OLED_P16x16Ch(64, 0, 46);
OLED_P16x16Ch(80, 0, 19);
OLED_P16x16Ch(96, 0, (Date/10));
OLED_P16x16Ch(112, 0, (Date%10));
OLED_Refresh();
Check_Dry();
Check_Open();
/*********************/
KEY_3 = 1;
if (KEY_3==0)
{
keybuffer++;
if (keybuffer==keydelay)
{
keybuffer=0;
time_buf[3]= ( ( (Date/10)<<4 )|(Date%10) ); //?? ??仺?? д ??
ds1302_write_time(); //??dS1302д???????
OLED_CLLine(0);OLED_CLLine(1);
OLED_P16x16Str(40,0,Quit); //??????
delay_ms(500);
OLED_CLLine(0);OLED_CLLine(1);
return;
}
}
}
}
復(fù)制代碼
作者:
沒耐心
時間:
2019-12-26 15:49
好了嗎,還有什么問題。&和&&的差別不大,&可用作位運算符,初次之外用&&時當?shù)谝粋條件不成立時不會再判斷后面的條件,&則會再運行?偟膩碚f差別不大。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1