Оставайтесь в прежнем состоянии, если не нажата кнопка

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 подобная Update_Display здесь, где она будет использоваться после того, как она установлена в 1. Также не требует switch_case для события down и up.
  • 0
    Первоначально использовал это, но я удалил. Я держал счетчик внутри функции ЖК-дисплея, если счетчик достиг значения обновления 5, иначе не обновлять экран. но я обнаружил, что мои дата и время не отображаются. отображается только тогда, когда счетчик достигает значения 5. Так что я прошел его. когда нажимается стрелка вверх, увеличивается display_screen_type / нажимается клавиша вниз уменьшает display_screen_type
Показать ещё 9 комментариев
Теги:
arduino
visual-studio-2010

1 ответ

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;
  }
  • 0
    но они являются перечисляемыми значениями. Вы можете увеличивать значения перечисления. так что выдает ошибку «Оператор ++ (int)» не объявлен для постфикса «++», вместо этого используется префиксный оператор
  • 0
    DISPLAY_SCREEN_TYPE - это ваше перечисление, и вам не обязательно использовать display_screen_type качестве enum, но вы можете принять его как int или попробовать его с --display_screen_type и ++display_screen_type
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню