Buenas:
Como muestra en la imagen, no se mueve la flecha indicadora para seleccionar menús y submenús y quiero saber el motivo.
¿Qué hago mal?
Es verdad que estoy desarrollando el menú con submenú completo, por ahora voy por partes.

Si pulsas el botón OK / Enter entra en una lista de submenús, solo funciona el "Nombre Relés". Debería moverse la flecha indicadora cuando pulsas el pulsador Arriba y Abajo. También es funcional introducir nombre de cada relés.
También dejo el código hecho en C# hasta donde he llegado, funciona introducir nombre de los relés y quede guardado en un archivo de texto tipo .txt.
LCD_Menu_y_submenu_03.ino
	
	
	
		
MenuPrincipal.h
	
	
	
		
Gracias por todo.
				
			Como muestra en la imagen, no se mueve la flecha indicadora para seleccionar menús y submenús y quiero saber el motivo.
¿Qué hago mal?
Es verdad que estoy desarrollando el menú con submenú completo, por ahora voy por partes.

Si pulsas el botón OK / Enter entra en una lista de submenús, solo funciona el "Nombre Relés". Debería moverse la flecha indicadora cuando pulsas el pulsador Arriba y Abajo. También es funcional introducir nombre de cada relés.
También dejo el código hecho en C# hasta donde he llegado, funciona introducir nombre de los relés y quede guardado en un archivo de texto tipo .txt.
LCD_Menu_y_submenu_03.ino
		C++:
	
	// Include el código de la librería.
#include <LiquidCrystal.h>
// Inicializa la librería con sus pines indicados.
// RS, RW, Enable, D4, D5, D6, D7.
//LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// Declarar a partir de aquí el lcd.
#include "MenuPrincipal.h"
// Pin 10 para saber que es luz de fondo.
//const byte LuzFondo = 10;
// Variables.
// Pulsador Arriba.
byte estadoActualArriba1 = 0;
byte estadoActualArriba2 = 0;
byte estadoUltimoArriba = 0;
int contadorArriba = 0;
// Pulsador Abajo.
byte estadoActualAbajo1 = 0;
byte estadoActualAbajo2 = 0;
byte estadoUltimoAbajo = 0;
int contadorAbajo = 0;
// Pulsador Izquierda.
byte estadoActualIzquierda1 = 0;
byte estadoActualIzquierda2 = 0;
byte estadoUltimoIzquierda = 0;
int contadorIzquierda = 0;
// Pulsador Derecha.
byte estadoActualDerecha1 = 0;
byte estadoActualDerecha2 = 0;
byte estadoUltimoDerecha = 0;
int contadorDerecha = 0;
// Pulsador Ok / Enter.
byte estadoActualEnter1 = 0;
byte estadoActualEnter2 = 0;
byte estadoUltimoEnter = 0;
int contadorEnter = 0;
void setup()
{
  Serial.begin(115200); // 115200
  // La pantalla es de 20 caracteres y 4 filas.
  lcd.begin(20, 4);
  // Indicar luz de fondo como salida.
  // pinMode(LuzFondo, OUTPUT);
  // Configuración de pines como salidas digitales.
  pinMode(13, OUTPUT);
  // Configuración de pines como entradas digitales.
  pinMode(A1, INPUT); // Arriba.
  pinMode(A2, INPUT); // Abajo.
  pinMode(A3, INPUT); // Izquierda.
  pinMode(A4, INPUT); // Derecha.
  pinMode(A5, INPUT); // Ok / Enter.
  lcd.clear();                          // Borra la pantalla y su posición superior izquierda.
  lcd.setCursor(0, 1);                  // Línea 2 del LCD.
  lcd.print(F(" Pantalla principal ")); // Muestra título en la LCD.
}
void loop()
{
  // Pulsador Arriba.
  estadoActualArriba1 = digitalRead(A1);
  delay(10);
  estadoActualArriba2 = digitalRead(A1);
  // Si los estados no son iguales, el sketch no hace gran cosa.
  if (estadoActualArriba1 == estadoActualArriba2)
  {
    // El código que sigue es idéntico al del anteerior ejemplo.
    if (estadoActualArriba1 != estadoUltimoArriba)
    {
      if (estadoActualArriba1 == HIGH)
      {
        contadorArriba = contadorArriba + 1;
        Serial.print (F("Esta es la pulsación ARRIBA nº: "));
        Serial.println(contadorArriba);
        lcd.setCursor(0, 0); // Línea 1 del LCD.
        lcd.print("Pulsado: ");
        lcd.print(contadorArriba);
      }
    }
  }
  estadoUltimoArriba = estadoActualArriba1;
  if (contadorArriba % 2 == 0)
  {
    digitalWrite(13, LOW);
  }
  else
  {
    digitalWrite(13, HIGH);
  }
  // Pulsador Abajo.
  estadoActualAbajo1 = digitalRead(A2);
  delay(10);
  estadoActualAbajo2 = digitalRead(A2);
  // Si los estados no son iguales, el sketch no hace gran cosa.
  if (estadoActualAbajo1 == estadoActualAbajo2)
  {
    // El código que sigue es idéntico al del anteerior ejemplo.
    if (estadoActualAbajo1 != estadoUltimoAbajo)
    {
      if (estadoActualAbajo1 == HIGH)
      {
        contadorAbajo = contadorAbajo + 1;
        Serial.print (F("Esta es la pulsación ABAJO nº: "));
        Serial.println(contadorAbajo);
      }
    }
  }
  estadoUltimoAbajo = estadoActualAbajo1;
  if (contadorAbajo % 2 == 0)
  {
    digitalWrite(13, LOW);
  }
  else
  {
    digitalWrite(13, HIGH);
  }
  // Pulsador Izquierda.
  estadoActualIzquierda1 = digitalRead(A3);
  delay(10);
  estadoActualIzquierda2 = digitalRead(A3);
  // Si los estados no son iguales, el sketch no hace gran cosa.
  if (estadoActualIzquierda1 == estadoActualIzquierda2)
  {
    // El código que sigue es idéntico al del anteerior ejemplo.
    if (estadoActualIzquierda1 != estadoUltimoIzquierda)
    {
      if (estadoActualIzquierda1 == HIGH)
      {
        contadorIzquierda = contadorIzquierda + 1;
        Serial.print (F("Esta es la pulsación IZQUIERDA nº: "));
        Serial.println(contadorIzquierda);
      }
    }
  }
  estadoUltimoIzquierda = estadoActualIzquierda1;
  if (contadorIzquierda % 2 == 0)
  {
    digitalWrite(13, LOW);
  }
  else
  {
    digitalWrite(13, HIGH);
  }
  // Pulsador Derecha.
  estadoActualDerecha1 = digitalRead(A4);
  delay(10);
  estadoActualDerecha2 = digitalRead(A4);
  // Si los estados no son iguales, el sketch no hace gran cosa.
  if (estadoActualDerecha1 == estadoActualDerecha2)
  {
    // El código que sigue es idéntico al del anteerior ejemplo.
    if (estadoActualDerecha1 != estadoUltimoDerecha)
    {
      if (estadoActualDerecha1 == HIGH)
      {
        contadorDerecha = contadorDerecha + 1;
        Serial.print (F("Esta es la pulsación DERECHA nº: "));
        Serial.println(contadorDerecha);
      }
    }
  }
  estadoUltimoDerecha = estadoActualDerecha1;
  if (contadorDerecha % 2 == 0)
  {
    digitalWrite(13, LOW);
  }
  else
  {
    digitalWrite(13, HIGH);
  }
  // Pulsador OK / Enter.
  estadoActualEnter1 = digitalRead(A5);
  delay(10);
  estadoActualEnter2 = digitalRead(A5);
  // Si los estados no son iguales, el sketch no hace gran cosa.
  if (estadoActualEnter1 == estadoActualEnter2)
  {
    // El código que sigue es idéntico al del anteerior ejemplo.
    if (estadoActualEnter1 != estadoUltimoEnter)
    {
      if (estadoActualEnter1 == HIGH)
      {
        contadorEnter = contadorEnter + 1;
        Serial.print (F("Esta es la pulsación OK / ENTER nº: "));
        Serial.println(contadorEnter);
      }
    }
  }
  estadoUltimoEnter = estadoActualEnter1;
  if (contadorEnter % 2 == 0)
  {
    digitalWrite(13, LOW);
    //Menu_Principal();
  }
  else
  {
    digitalWrite(13, HIGH);
    Menu_Principal();
  }
}MenuPrincipal.h
		C++:
	
	void Menu_Principal()
{
  // Contador de teclas y navegador.
  int opcion = 0;
  bool salir = false;
  const int seleccionMenu = 8;
  // Capturar tecla para luego validar.
  // Limpiar pantalla.
  lcd.clear();
  // Capturar pulsador para luego validar.
  byte tecla;
  byte teclaArriba = digitalRead(A1);
  byte teclaAbajo = digitalRead(A2);
  do
  {
    //******************************************************************
    // Dibujo el menú principal.
    String MENSAJES[] =
    {
      "** MENU PRINCIPAL **", // Posición 0.
      "  ESTADO PRINCIPAL  ", // 1
      "  NOMBRE RELES      ", // 2
      "  NOMBRE SENSORES   ", // 3
      "  ENTRADA ANALÓGICA ", // 4
      "  CONFIGURACION     ", // 5
      "  ACERCA DE...      ", // 6
      "  AYUDA             ", // 7
      "  EXTRA             ", // 8
      "  INICIO            ", // 9
      "                    ", // 10
      ">"                     // 11
    };
    switch (opcion)
    {
      case 0:
        lcd.setCursor(0, 0);     // Línea 1 del LCD.
        lcd.print(MENSAJES[0]);  // ** MENÚ PRINCIPAL **
        lcd.setCursor(0, 1);
        lcd.print(MENSAJES[1]);  // > ESTADO PRINCIPAL
        lcd.setCursor(0, 1);
        lcd.print(MENSAJES[11]); // >
        lcd.setCursor(0, 2);
        lcd.print(MENSAJES[2]);  //   NOMBRE RELÉS
        lcd.setCursor(0, 3);
        lcd.print(MENSAJES[3]);  //   NOMBRE SENSORES
        break;
      case 1:
        lcd.setCursor(0, 0);
        lcd.print(MENSAJES[0]);         // ** MENÚ PRINCIPAL **
        lcd.setCursor(0, 1);
        lcd.print(MENSAJES[1]);         //   ESTADO PRINCIPAL
        lcd.setCursor(0, 2);
        lcd.print(MENSAJES[2]);         // > NOMBRE RELÉS
        lcd.setCursor(0, 2);
        lcd.print(MENSAJES[11]);        // >
        lcd.setCursor(0, 3);
        lcd.print(MENSAJES[3]);         //   NOMBRE SENSORES
        break;
      case 2:
        lcd.setCursor(0, 0);
        lcd.print(MENSAJES[0]);         // ** MENÚ PRINCIPAL **
        lcd.setCursor(0, 1);
        lcd.print(MENSAJES[1]);         //   ESTADO PRINCIPAL
        lcd.setCursor(0, 2);
        lcd.print(MENSAJES[2]);         //   NOMBRE RELÉS
        lcd.setCursor(0, 3);
        lcd.print(MENSAJES[3]);         // > NOMBRE SENSORES
        lcd.setCursor(0, 3);
        lcd.print(MENSAJES[11]);        // >
        break;
      case 3:
        lcd.setCursor(0, 0);
        lcd.print(MENSAJES[0]);         // ** MENÚ PRINCIPAL **
        lcd.setCursor(0, 1);
        lcd.print(MENSAJES[4]);         // > ENTRADA ANALÓGICA
        lcd.setCursor(0, 1);
        lcd.print(MENSAJES[11]);        // >
        lcd.setCursor(0, 2);
        lcd.print(MENSAJES[5]);         //   CONFIGURACIÓN
        lcd.setCursor(0, 3);
        lcd.print(MENSAJES[6]);         //   ACERCA DE...
        break;
      case 4:
        lcd.setCursor(0, 0);
        lcd.print(MENSAJES[0]);         // ** MENÚ PRINCIPAL **
        lcd.setCursor(0, 1);
        lcd.print(MENSAJES[4]);         //   ENTRADA ANALÓGICA
        lcd.setCursor(0, 2);
        lcd.print(MENSAJES[5]);         // > CONFIGURACIÓN
        lcd.setCursor(0, 2);
        lcd.print(MENSAJES[11]);        // >
        lcd.setCursor(0, 3);
        lcd.print(MENSAJES[6]);         //   ACERCA DE...
        break;
      case 5:
        lcd.setCursor(0, 0);
        lcd.print(MENSAJES[0]);         // ** MENÚ PRINCIPAL **
        lcd.setCursor(0, 1);
        lcd.print(MENSAJES[4]);         //   ENTRADA ANALÓGICA
        lcd.setCursor(0, 2);
        lcd.print(MENSAJES[5]);         //   CONFIGURACIÓN
        lcd.setCursor(0, 3);
        lcd.print(MENSAJES[6]);         // > ACERCA DE...
        lcd.setCursor(0, 3);
        lcd.print(MENSAJES[11]);        // >
        break;
      case 6:
        lcd.setCursor(0, 0);
        lcd.print(MENSAJES[0]);         // ** MENÚ PRINCIPAL **
        lcd.setCursor(0, 1);
        lcd.print(MENSAJES[7]);         // > AYUDA
        lcd.setCursor(0, 1);
        lcd.print(MENSAJES[11]);        // >
        lcd.setCursor(0, 2);
        lcd.print(MENSAJES[8]);         //   EXTRA
        lcd.setCursor(0, 3);
        lcd.print(MENSAJES[9]);         //   INICIO
        break;
      case 7:
        lcd.setCursor(0, 0);
        lcd.print(MENSAJES[0]);         // ** MENÚ PRINCIPAL **
        lcd.setCursor(0, 1);
        lcd.print(MENSAJES[7]);         //   AYUDA
        lcd.setCursor(0, 2);
        lcd.print(MENSAJES[8]);         // > EXTRA
        lcd.setCursor(0, 2);
        lcd.print(MENSAJES[11]);        // >
        lcd.setCursor(0, 3);
        lcd.print(MENSAJES[9]);         //   INICIO
        break;
      case 8:
        lcd.setCursor(0, 0);
        lcd.print(MENSAJES[0]);         // ** MENÚ PRINCIPAL **
        lcd.setCursor(0, 1);
        lcd.print(MENSAJES[7]);         //   AYUDA
        lcd.setCursor(0, 2);
        lcd.print(MENSAJES[8]);         //   EXTRA
        lcd.setCursor(0, 3);
        lcd.print(MENSAJES[9]);         // > INICIO
        lcd.setCursor(0, 3);
        lcd.print(MENSAJES[11]);        // >
        break;
      default:
        Serial.print(F("Fuera de rango"));
        break;
    }
    // Fin de pintar el menú principal.
    //******************************************************************
    // Leer pulsador ingresada por el usuario.
    tecla = digitalRead(A5);
    // Validar el tipo de tecla.
    if (tecla == digitalRead(A5))
    {
      switch (opcion)
      {
        case 0:
          //
          break;
        case 1:
          //
          break;
        case 2:
          //OpcionC();
          break;
        case 3:
          //
          break;
        case 4:
          //
          break;
        case 5:
          //
          break;
        case 6:
          //
          break;
        case 7:
          //
          break;
        case 8:
          salir = true;
          break;
        default:
          lcd.print(F("Fuera de rango.     "));
          break;
      }
    }
    // Entonces si pulsas pulsador Abajo.
    //tecla = digitalRead(A2);
    else if (tecla == digitalRead(A2))
    {
      opcion++;
    }
    // Entonces si pulsas pulsador Arriba.
    //tecla = digitalRead(A1);
    else if (tecla == digitalRead(A1))
    {
      opcion--;
    }
    // Si está en la última opción, salta a la primera.
    if (opcion > seleccionMenu)
    {
      opcion = 0;
    }
    // Si está en la primera posición, salta a la última.
    if (opcion < 0)
    {
      opcion = seleccionMenu;
    }
    // Uso la tecla escape como salida.
  } while (salir == false);
}Gracias por todo.
 
   
				 
						 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		