我有簡單的代碼在這裏。我打電話給兩個功能顯示屏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'? –