2014-03-07 81 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