除非按下按钮,否则保持以前的状态

Stay in previous state unless button pressed

本文关键字:状态 按钮      更新时间:2023-10-16

我在这里有简单的代码。我正在调用两个功能显示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_UPAction_DOWN

中显示和管理它

为增量/减少display_screen_type,您必须将其视为类型int

int display_screen_type=DATE_TIME;

您的Action_UPAction_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;
  }