Здесь у меня простой код. Я вызываю два функциональных дисплея 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;
}
}
ваш код, кажется, требует большого улучшения, прежде всего, почему вы сравниваете 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;
}
DISPLAY_SCREEN_TYPE
- это ваше перечисление, и вам не обязательно использовать display_screen_type
качестве enum, но вы можете принять его как int
или попробовать его с --display_screen_type
и ++display_screen_type
Update_Display
подобнаяUpdate_Display
здесь, где она будет использоваться после того, как она установлена в 1. Также не требуетswitch_case
для события down и up.