标题:
求师傅指教。MCU闰年判断问题 ,是我用的if else太多了吗?
[打印本页]
作者:
Armweak
时间:
2019-12-15 15:16
标题:
求师傅指教。MCU闰年判断问题 ,是我用的if else太多了吗?
最近用到DS1302。写入日期的函数弄成了下面的样子,Key1 Key2 是数值加减 Key3 是退出 ,可是测试中没有按Key3总会不定时的意外退出。。
求老师们帮我看看怎么修改才能更稳定更简洁,问题的原因在哪里呢?
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;
}
}
}
}
复制代码
作者:
Armweak
时间:
2019-12-15 16:05
还有闰年判断部分 同时用&&和|| 会短路吗?
作者:
Armweak
时间:
2019-12-15 16:07
是不是应该改成& 和|。。。
作者:
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;
}
}
}
}
复制代码
作者:
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;
}
}
}
}
复制代码
作者:
没耐心
时间:
2019-12-26 15:49
好了吗,还有什么问题。&和&&的差别不大,&可用作位运算符,初次之外用&&时当第一个条件不成立时不会再判断后面的条件,&则会再运行。总的来说差别不大。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1