我有简单的代码在这里。我打电话给两个功能显示屏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;
}
}
'Update_Display'变量就像在这里没有看到的那样,它将在设置为1之后使用。不需要'switch_case'用于down和up事件。 –
最初使用它,但我删除。如果计数器达到5更新值,我已经在显示器LCD功能内保持计数器,否则不更新屏幕。但我发现我的日期和时间不显示。只有当计数器达到值5时才显示。所以我通过了它。当向上箭头被按下增量时display_screen_type/down键被按下递减display_screen_type – RKNAYAK
另外,您将'display_screen_type'设置为'DISPLAY_TYPE_MAX'?或增加'display_screen_type'? –