2014-03-07 82 views
0

我有簡單的代碼在這裏。我打電話給兩個功能顯示屏LCD和檢查鍵。默認屏幕應顯示日期和時間。如果向上箭頭按下去特定窗口並顯示日期和時間。同樣向下按鍵。顯示菜單應該遞減。保持在以前的狀態,除非按下按鈕

問題:日期和時間顯示正確。一旦啓動鍵按下菜單被改變,但只要進入菜單,直接跳回到日期和時間.. 聲明枚舉值:

typedef enum { 
    DATE_TIME, 
    COORDINATE, 
    WINDSPEED, 
    POSITIONTRACK, 
    DISPAY_PARAMETER, 
    SET_PARAMETER, 
    DISPLAY_TYPE_MAX 
} 
DISPLAY_SCREEN_TYPE; 
//DISPLAY_SCREEN_TYPE display_screen_type=DATE_TIME; 

的按鈕功能宣言

#define btnRIGHT 0  // Okay 
#define btnUP  1  // inc 
#define btnDOWN 2  // dec 
#define btnLEFT 3  // Select 
#define btnSELECT 4  // Menu 
#define btnNONE 5 

功能:

void loop() 
{ 
    Display_LCD(); 
    Chk_key(); 
} 
void Display_LCD() 
{ 
    switch(display_screen_type) 
    { 
    case DATE_TIME: 
    digitalClockDisplay(); 
    break;  
    case COORDINATE: 
    Display_coordinate(); 
    break; 
    case WINDSPEED: 
    Display_Wind(); 
    break; 
    case POSITIONTRACK: 
    Display_angle(); 
    break; 
    case DISPAY_PARAMETER: 
    Display_fun(); 
    break; 
    case SET_PARAMETER: 
    Set_Fun(); 
    break; 
    case DISPLAY_TYPE_MAX: 
    break;  
    } 
    if(display_screen_type>DISPLAY_TYPE_MAX) 
    { 
    display_screen_type=DATE_TIME; 
    } 
} 
void Chk_key() 
{ 
    int button=read_LCD_buttons(); 
    switch(button) 
    { 
    case btnRIGHT: 
    Action_RIGHT(); 
    break; 
    case btnUP: 
    Action_UP(); 
    break;  
    case btnDOWN: 
    Action_DOWN(); 
    break; 
    case btnLEFT: 
    Action_LEFT(); 
    break; 
    case btnSELECT: 
    Action_SELECT(); 
    break; 
    } 
} 

void Action_UP() 
{ 
    switch(display_screen_type) 
    { 
    case DATE_TIME: 
    display_screen_type= COORDINATE; 
    Update_Display=1; 
    break; 
    case COORDINATE: 
    display_screen_type= WINDSPEED; 
    Update_Display=1; 
    break;  
    case WINDSPEED: 
    display_screen_type= POSITIONTRACK; 
    Update_Display=1; 
    break;   
    case POSITIONTRACK: 
    display_screen_type= DATE_TIME; 
    Update_Display=1; 
    break; 
    //default:display_screen_type= DATE_TIME; Update_Display=1;delay(500);break; 
    } 

} 

void Action_DOWN() 
{ 
    /* lcdClear(); 
    lcd.print("DOWN");*/ 

    switch(display_screen_type) 
    { 
    case DATE_TIME: 
    display_screen_type= POSITIONTRACK; 
    Update_Display=1; 
    break; 
    case COORDINATE: 
    display_screen_type= DATE_TIME; 
    Update_Display=1; 
    break;  
    case WINDSPEED: 
    display_screen_type= COORDINATE; 
    Update_Display=1; 
    break;   
    case POSITIONTRACK: 
    display_screen_type= WINDSPEED; 
    Update_Display=1; 
    break; 
    //default:display_screen_type= DATE_TIME; Update_Display=1;break; 
    } 
} 

修改代碼在這裏:

int display_screen_type=DATE_TIME; 


void loop() 
{ 
    Display_LCD(); 
    Chk_key(); 
} 

void Display_LCD() 
{ 
    switch(display_screen_type) 
    { 

    case DATE_TIME: 
    digitalClockDisplay(); 
    timedBeep(beep,1); 
    break; 
    case COORDINATE: 
    Display_coordinate(); 
    timedBeep(beep,1); 
    break;  
    case WINDSPEED: 
    Display_Wind(); 
    timedBeep(beep,1); 
    break; 
    case POSITIONTRACK: 
    Display_angle(); 
    timedBeep(beep,1); 
    break;  
    case DISPAY_PARAMETER: 
    Display_fun(); 
    timedBeep(beep,1); 
    break; 
    case SET_PARAMETER: 
    Set_Fun(); 
    timedBeep(beep,1); 
    break; 
    case GET_PASSWORD: 
    Get_Password(); 
    timedBeep(beep,1); 
    break; 
    } 
} 

void Action_UP() 
{ 

    if(display_screen_type >=POSITIONTRACK) 
    display_screen_type=DATE_TIME; 
    else 
    display_screen_type++; 
} 

void Action_DOWN() 
{ 
    if(display_screen_type <=DATE_TIME) 
    display_screen_type=POSITIONTRACK; 
    else 
    display_screen_type--; 
} 


void Chk_key() 
{ 
    int button=read_LCD_buttons(); 
    if(button!=prev_button) 
    { 
    prev_button = button; 
    } 

    switch(prev_button) 
    { 
    case btnRIGHT:// RIGHT/MENU BUTTON BEING SELECTED 
    Action_RIGHT(); 
    break; 
    case btnUP:// UP KEY/INCREMENT PRESSED 
    Action_UP(); 
    break; 
    case btnDOWN: // DOWN/DECREMENT KEY PRESSED 
    Action_DOWN(); 
    break; 
    case btnLEFT://LEFT/ESCAPE KEY PRESSED 
    Action_LEFT(); 
    break; 
    case btnSELECT://SELECT KEY PRESSED 
    Action_SELECT(); 
    break; 
    } 
} 
+0

'Update_Display'變量就像在這裏沒有看到的那樣,它將在設置爲1之後使用。不需要'switch_case'用於down和up事件。 –

+0

最初使用它,但我刪除。如果計數器達到5更新值,我已經在顯示器LCD功能內保持計數器,否則不更新屏幕。但我發現我的日期和時間不顯示。只有當計數器達到值5時才顯示。所以我通過了它。當向上箭頭被按下增量時display_screen_type/down鍵被按下遞減display_screen_type – RKNAYAK

+0

另外,您將'display_screen_type'設置爲'DISPLAY_TYPE_MAX'?或增加'display_screen_type'? –

回答

0

您的代碼似乎首先需要大量的改進它,爲什麼你在 Display_LCD功能比較display_screen_type? 剛剛離開它僅用於顯示和Action_UPAction_DOWN

對於增量進行管理/遞減display_screen_type你必須把它作爲類型int

int display_screen_type=DATE_TIME; 

Action_UPAction_DOWN應該是這樣的

void Action_UP() 
{ 
    if(display_screen_type >=DISPLAY_TYPE_MAX) 
     display_screen_type=DATE_TIME 
    else 
     display_screen_type++; 
} 

void Action_DOWN() 
{  
    if(display_screen_type <= DATE_TIME) 
     display_screen_type=SET_PARAMETER 
    else 
     display_screen_type--; 
} 

也在下面的條件不需要在Display_LCD所以刪除它。

if(display_screen_type>DISPLAY_TYPE_MAX) 
    { 
    display_screen_type=DATE_TIME; 
    } 
+0

但它們是** enum * *值。你可以增加枚舉值。所以它給出錯誤號'operator ++(int)'爲後綴'++'聲明,嘗試前綴運算符而不是 – RKNAYAK

+0

DISPLAY_SCREEN_TYPE是您的枚舉,並且您不需要將'display_screen_type'作爲枚舉, 'int'或者用'--display_screen_type'和'++ display_screen_type'來試試 –

+0

我試過這個,給出錯誤**不匹配'++ display_screen_type'中的'operator ++'**上面的情況我改變了** display_screen_type ++ * *到** ++ display_screen_type ** – RKNAYAK