最近用到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;
- }
- }
- }
- }
復制代碼
|