大家好我正在尝试编写一个程序,我可以使用按钮开关(GPIO)设置日期和时间,所以基本上设置了它应该继续计算的时间,正常时间将使用核board-f746zg(os.mbed平台)但我还没有想到如何做到这一点我会非常感激如果任何人可以给我一个如何做的想法,即使它的小我会很感激。我在下面找到了这个代码,但我不知道它是如何工作的。
/*********************************************************************/
void set_clock()
{ unsigned char i;
unsigned char temp; //temp is used to hold a value specifying which digit we are changing
temp=1; //start with HOUR
i=1;
lcd_clear(); //clear display
lcd_goto(0x40); //go to second row
lcd_puts(mSet); //display user message
//must convert values to decimal for displaying since they are in Binary Coded Decimal format used in the RTC
rtc_hour=myBCD2DEC(rtc_hour);
rtc_min=myBCD2DEC(rtc_min);
rtc_month=myBCD2DEC(rtc_month);
rtc_date=myBCD2DEC(rtc_date);
rtc_year=myBCD2DEC(rtc_year);
rtc_day=myBCD2DEC(rtc_day);
update_time(); //display time/date on LCD
while(!Middle_Switch){}; //wait for button to be released
while(i){
if(!Middle_Switch){
++temp;
DelayMs(200);
while(!Middle_Switch){}; //wait for button to be released
};
switch(temp) {
case 1: //Hour
if (!Right_Switch){
++rtc_hour;
if(rtc_hour>23){rtc_hour=0;};
DelayMs(200); //delay to De-Bounce switch
}
else if (!Left_Switch){
if(rtc_hour==0){
rtc_hour=23;}
else{
--rtc_hour;
};
DelayMs(200);
};
break;
case 2: //Minutes
if (!Right_Switch){
++rtc_min;
if(rtc_min>59){rtc_min=0;};
DelayMs(200);
}
else if (!Left_Switch){
if(rtc_min==0){
rtc_min=59;}
else{
--rtc_min;
};
DelayMs(200);
};
break;
case 3: //Month
if (!Right_Switch){
++rtc_month;
if(rtc_month>12){rtc_month=1;};
DelayMs(200);
}
else if (!Left_Switch){
if(rtc_month==1){
rtc_month=12;}
else{
--rtc_month;
};
DelayMs(200);
};
break;
case 4: //Date
if (!Right_Switch){
++rtc_date;
if(rtc_date>31){rtc_date=1;};
DelayMs(200);
}
else if (!Left_Switch){
if(rtc_date==1){
rtc_date=31;}
else{
--rtc_date;
};
DelayMs(200);
};
break;
case 5: //year
if (!Right_Switch){
++rtc_year;
if(rtc_year>99){rtc_year=0;};
DelayMs(200);
}
else if (!Left_Switch){
if(rtc_year==0){
rtc_year=99;}
else{
--rtc_year;
};
DelayMs(200);
};
break;
case 6: //day of week (sunday = 1)
if (!Right_Switch){
++rtc_day;
if(rtc_day>7){rtc_day=1;};
DelayMs(200);
}
else if (!Left_Switch){
if(rtc_day==1){
rtc_day=7;}
else{
--rtc_day;
};
DelayMs(200);
};
break;
case 7:
//convert settings back to BCD
rtc_hour=myDEC2BCD(rtc_hour);
rtc_min=myDEC2BCD(rtc_min);
rtc_sec=0;
rtc_month=myDEC2BCD(rtc_month);
rtc_date=myDEC2BCD(rtc_date);
rtc_year=myDEC2BCD(rtc_year);
rtc_day=myDEC2BCD(rtc_day);
//save all settings back to registers
write_clk_regs();
i=0;
break;
};//end switch
update_time();
};//end while
}//end set clock
/*********************************************************************/
//Function used to display the date/time on 2x16 LCD//
void update_time()
{ lcd_goto(0x00);
sprintf(LCD_Buffer,"%2d:%2d %2d|%2d|%2d %d",rtc_hour,rtc_min,rtc_month,rtc_date,rtc_year,rtc_day);
lcd_puts(LCD_Buffer);
}
/*********************************************************************/