Buenos días, traigo una duda para la realización de un menú (SIN KEYPAD) con una pantalla LCD 20x4, más que una duda sería si se podría realizar lo mismo de manera más corta utilizando estructuras o algo similar. La idea es realizar un menú en el cual en pantalla muestra una opción en cada esquina y en cada esquina un botón, es decir 4 botones, y dependiendo que botón se pulse entra en un menú u otro.
Por ejemplo, primera pantalla: ---------------------------------------
boton1 | cafe | boton3
| |
| |
boton2 | te | boton4
Si pulso el botón1 entra en el menú cafe, y si pulso el boton2 entra en menu te. Bien ahora si quiero menú café:
boton1 | solo nube| boton3
| |
| |
boton2 | mitad atras | boton4
Ahora si pulso el botón 1 entra en menú solo y asi sucesivamente hasta que se llegue a la función final. Creo que más o menos se entiende la idea.
Yo lo he realizado de la siguiente manera:
#include <Wire.h>
#include <LiquidCrystal_I2C_AvrI2C.h>
LiquidCrystal_I2C_AvrI2C lcd(0x27, 20, 4);
byte boton1 = 3;
byte boton2 = 2;
byte boton3 = 9;
byte boton4 = 10;
byte estado = 1;
void setup() {
lcd.begin();
lcd.backlight();
pinMode(boton1, INPUT);
pinMode(boton2, INPUT);
pinMode(boton3, INPUT);
pinMode(boton4, INPUT);
digitalWrite(boton1, HIGH);
digitalWrite(boton2, HIGH);
digitalWrite(boton3, HIGH);
digitalWrite(boton4, HIGH);
}
void loop() {
if (estado == 1) {
do {
LCDmenu0();
} while (estado == 1); lcd.clear();
}
if (estado == 2) {
do {
LCDmenu1();
} while (estado == 2);
lcd.clear();
}
if (estado == 3) {
do {
LCDmenu2();
} while (estado == 3);
lcd.clear();
}
if (estado == 4) {
do {
//LCDmenu4();
} while (estado == 4);
lcd.clear();
}
if (estado == 5) {
do {
//LCDmenu5();
} while (estado == 5);
lcd.clear();
}
if (estado == 6) {
do {
//LCDmenu6();
} while (estado == 6);
lcd.clear();
}
if (estado == 7) {
do {
// LCDmenu7();
} while (estado == 7);
lcd.clear();
}
if (estado == 8) {
do {
//LCDmenu8();
} while (estado == 8);
lcd.clear();
}
if (estado == 9) {
do {
//LCDmenu9();
} while (estado == 9);
lcd.clear();
}
}
void LCDmenu0()
{
lcd.setCursor(0, 0);
lcd.print("cafe");
lcd.setCursor(0, 3);
lcd.print("te");
if (digitalRead(boton1) == HIGH)
{
estado = 2;
lcd.clear();
}
if (digitalRead(boton2) == HIGH)
{
estado= 3;
lcd.clear();
}
}
void LCDmenu1()
{
lcd.setCursor(0, 0); lcd.print("solo");
lcd.setCursor(0, 3); lcd.print("mitad");
lcd.setCursor(9, 0); lcd.print("nube");
lcd.setCursor(15, 3); lcd.print("ATRAS");
delay(500);
if (digitalRead(boton1) == HIGH)
{
estado = 4;
}
if (digitalRead(boton2) == HIGH)
{
estado = 5;
}
if (digitalRead(boton3) == HIGH)
{
estado = 6;
}
if (digitalRead(boton4) == HIGH)
{
estado = 1;
}
}
void LCDmenu2()
{
lcd.setCursor(0, 0); lcd.print("negro");
lcd.setCursor(0, 3); lcd.print("rojo");
lcd.setCursor(9, 0); lcd.print("tila");
lcd.setCursor(15, 3); lcd.print("ATRAS");
delay(500);
if (digitalRead(boton1) == HIGH)
{
estado = 7;
}
if (digitalRead(boton2) == HIGH)
{
estado = 8;
}
if (digitalRead(boton3) == HIGH)
{
estado = 9;
}
if (digitalRead(boton4) == HIGH)
{
estado = 1;
}
}
Esto en principio hace lo que yo quiero, pero me da la espina que hay alguna forma de optimizarlo. A ver si puede ayudarme alguien con más experiencia. ![]()