Tree Menu with LCD and Keypad

Hi,
I´m trying to create a tree menu on the LCD display. The first menu is displayed without problems but the second one cannot be selected or displayed for some reason.
Thanks in advance for your help :smiley:

#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

const int ROW_NUM = 4;
const int COLUMN_NUM = 4;

char keys[ROW_NUM][COLUMN_NUM] = {
  {'1','2','3', 'A'},
  {'4','5','6', 'B'},
  {'7','8','9', 'C'},
  {'*','0','#', 'D'}
};

byte pin_rows[ROW_NUM] = {9, 8, 7, 6};
byte pin_column[COLUMN_NUM] = {5, 4, 3, 2};


int menu = 1;
int status = 0;


LiquidCrystal_I2C lcd(0x27, 20, 4);
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM);


void setup() {
  Serial.begin(9600);
  lcd.backlight();
  lcd.init();

}

void loop() {
  HomeMenu();

}

void HomeMenu(){
  if(status == 0){
    lcd.clear();
    lcd.print("A: MODE 1           ");
    lcd.setCursor(0,1);
    lcd.print("B: MODE 2           ");
    lcd.setCursor(0,2);
    lcd.print("C: MODE 3           ");
    lcd.setCursor(0,3);
    lcd.print("D: MODE 4           ");
    status = status+1;
  }
  char key = keypad.getKey();
  switch (key){
    //--Mode 1--//
    case 'A':
    Menu1();
    break;
    //--Mode 2--//
    case 'B':
    break;
    //--Mode 3--//
    case 'C':
    break;
    //--Mode 4--//
    case 'D':
    break;

    default:
    break;
  }
}

void Menu1(){
  if(status == 1){
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("       Menu 1       ");
    lcd.setCursor(0,2);
    lcd.print("A Option1 B Option2");
    lcd.setCursor(0,3);
    lcd.print("C Option3 D Option4 ");
    status = status+1;
  }
  char key = keypad.getKey();
  switch (key){
    //Option 1//
    case 'A':
    Menu2();
    break;
    //Option 2//
    case 'B':
    break;
    //Option 3//
    case 'C':
    break;
    //Option 4//
    case 'D':
    break;

    default:
    break;
  }
}

void Menu2(){
  if(status == 2){
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("       Menu 2       ");
    lcd.setCursor(0,2);
    lcd.print("A Option1  B Option2");
    lcd.setCursor(0,3);
    lcd.print("C Option3  D Option4");
    status = status+1;
  }
  char key = keypad.getKey();
  switch (key){

    case 'A':
    break;
    
    case 'B':
    break;
    
    case 'C':
    break;
    
    case 'D':
    break;

    default:
    break;
  }
}

Because you call char key = keypad.getKey(); multiple times for a single key press. Only the first call returns the key's value, the others returns 0

but even if I call the char key1, key2 and key3 it doesn't work. :confused:

Was able to solve it. My status loop got stuck in menu 1.

If anyone is interested, here is the working code:

#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

const int ROW_NUM = 4;
const int COLUMN_NUM = 4;

char keys[ROW_NUM][COLUMN_NUM] = {
  {'1','2','3', 'A'},
  {'4','5','6', 'B'},
  {'7','8','9', 'C'},
  {'*','0','#', 'D'}
};

byte pin_rows[ROW_NUM] = {9, 8, 7, 6};
byte pin_column[COLUMN_NUM] = {5, 4, 3, 2};

int status = 0;


LiquidCrystal_I2C lcd(0x27, 20, 4);
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM);


void setup() {
  Serial.begin(9600);
  lcd.backlight();
  lcd.init();

}

void loop() {
  HomeMenu();
  Menu1();
  Menu2();
  Menu3();

}

void HomeMenu(){
  if(status == 0){
    lcd.clear();
    lcd.print("A: MODE 1           ");
    lcd.setCursor(0,1);
    lcd.print("B: MODE 2           ");
    lcd.setCursor(0,2);
    lcd.print("C: MODE 3           ");
    lcd.setCursor(0,3);
    lcd.print("D: MODE 4           ");
    status = status+1;
  }

  if(status == 1){
    char keypressed = keypad.getKey();
    switch (keypressed){
      case 'A':
        status = status+1;
        break;
      case 'B':
        status = status+1;
        break;
      case 'C':
        status = status+1;
        break;
      case 'D':
        status = status+1;
        break;
    }
  }
}

void Menu1(){
  if(status == 2){
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("       Menu 1       ");
    lcd.setCursor(0,2);
    lcd.print("A:Option1 B:Option2 ");
    lcd.setCursor(0,3);
    lcd.print("C:Option3 D:Option4 ");
    status = status+1;
  }
  if(status == 3){
    char keypressed = keypad.getKey();
    switch (keypressed){
      case 'A':
        status = status+1;
        break;
      case 'B':
        status = status+1;
        break;
      case 'C':
        status = status+1;
        break;
      case 'D':
        status = status+1;
        break;
    }
  }
}

void Menu2(){
  if(status == 4){
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("       Menu 2       ");
    lcd.setCursor(0,2);
    lcd.print("A:Option1  B:Option2");
    lcd.setCursor(0,3);
    lcd.print("C:Option3  D:Option4");
    status = status+1;
  }
  if(status == 5){
    char keypressed = keypad.getKey();
    switch (keypressed){
      case 'A':
        status = status+1;
        break;
      case 'B':
        status = status+1;
        break;
      case 'C':
        status = status+1;
        break;
      case 'D':
        status = status+1;
        break;
    }
  }
}

void Menu3(){
  if(status == 6){
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("       Menu 3       ");
    lcd.setCursor(0,2);
    lcd.print("A:Option1  B:Option2");
    lcd.setCursor(0,3);
    lcd.print("C:Option3  D:Option4");
    status = status+1;
  }
  if(status == 7){
    char keypressed = keypad.getKey();
    switch (keypressed){
      case 'A':
        status = status+1;
        break;
      case 'B':
        status = status+1;
        break;
      case 'C':
        status = status+1;
        break;
      case 'D':
        status = status+1;
        break;
    }
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.