使用按钮设置日期和时间

时间:2018-01-17 13:25:31

标签: c

大家好我正在尝试编写一个程序,我可以使用按钮开关(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);
}
/*********************************************************************/

0 个答案:

没有答案