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

时间:2014-03-07 05:15:51

标签: c++ c visual-studio-2010 arduino

我在这里有简单的代码。我正在调用两个功能显示液晶显示屏和检查键。默认情况下,屏幕应显示日期和时间。如果向上箭头按下去特定窗口并显示日期和时间。同样按下键。显示菜单应该递减。

问题:日期和时间正确显示。一旦按下按键菜单被更改,但只要进入菜单直接跳回到日期和时间.. 枚举值声明:

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;   
  } 
}

1 个答案:

答案 0 :(得分:0)

您的代码似乎需要进行大量改进才能比较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;
  }