我在这里有简单的代码。我正在调用两个功能显示液晶显示屏和检查键。默认情况下,屏幕应显示日期和时间。如果向上箭头按下去特定窗口并显示日期和时间。同样按下键。显示菜单应该递减。
问题:日期和时间正确显示。一旦按下按键菜单被更改,但只要进入菜单直接跳回到日期和时间.. 枚举值声明:
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 :(得分:0)
您的代码似乎需要进行大量改进才能比较display_screen_type
Display_LCD
功能?
只需将其保留为仅显示并在Action_UP
或Action_DOWN
对于递增/递减display_screen_type
,您必须将其设为类型int
int display_screen_type=DATE_TIME;
您的Action_UP
和Action_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;
}