Problem with SHIFT CASE in a LCD DISPLAY

ENGLISH:

Hello everyone, i’m doing a proyect in which i have a bidimensional array and i need to show, change or add there the numbers of the array ,entered via serial monitor in a LCD display 1602. Everything worked good since i developed the program from void seleccion over. The problem is that once i entered the value via serial monitor, every loop that contains a “switch case” doesn´t execute the switch case function, if you could help me with this i’ll be thankfull.
Note: function serial.peek registers the last value received from serial monitor

ITALIANO:

Ciao a tutti, sto facendo un progetto nel quale ho un array bidimensionale e ho bisogno di mostrare, aggiungere o corregere dei numeri al array che si ingressano attraverso il serial monitor e farli vedere in un display 1602. Tutto funzionava bene finché ho sviluppato il programma a partire dal void seleccion in poi. Il problema sta nel fatto che una volta ingrssato il valore attraverso il serial monitor, ogni loop che contiene la funzione “switch case” non esegue il switch, se mi potete aiutare grazie mille.
Nota: la funzione serial.peek registra l’ultimo valore ricevuto dal serial monitor.

ESPAÑOL:

Hola a todos, estoy desarrollando un proyecto en el cual tengo un arrray bidimiensional y necesito mostrar, corregir o agregar valores del array , ls cuales se ingresan a travez del monitor serial y se visualizan en un display 1602. Todo funcionaba bien hasta que desarrolle el programa desde el void seleccion en adelante. El problema es que una vez ingresado el valor con el monitor serial cada loop que contiene la funcion “switch case” no ejecuta la parte que contiene el switch, si me pueden ayudar un millon de gracias.
Nota: la funcion serial.peek graba el ultimo valor recibido por el monitor serial.

int cifra[3][10]={
{0,1,2,3,4,5,6,7,8,9},
{10,11,12,13,14,15,16,17,18,19},
{20,21,22,23,24,25,26,27,28,29}};

#include <LiquidCrystal.h>


LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int tecla =0;
int op=0;

void setup(){
    lcd.begin(16, 2);
  Serial.begin(9600);
   
}

void loop() {
  
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Welcome to");
  lcd.setCursor(0, 1);
  lcd.print("Arduino");
  delay(4000);
  menu:
  type();
  seleccion();
  goto menu;
}


void type(){
start:
while(Serial.read()<0){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Select:");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("g: G");
  lcd.setCursor(0,1);
  lcd.print("m: M   o: O");
  delay(2000);
tecla= (char)Serial.peek();}
switch(tecla){
 case 'g':
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("you selected:");
  lcd.setCursor(0,1);  
  lcd.print("G");
  break;
case 'm':
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("you selected");
  lcd.setCursor(0,1);
  lcd.print("M");
  break;
case 'o':
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("you selected:");
  lcd.setCursor(0,1);
  lcd.print("O");
  break;
default:
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Invalid value");
  delay(1500);
  goto start;}}
  
void seleccion(){
while(Serial.read()<0){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("what you ");
  lcd.setCursor(0,1);
  lcd.print("want to do?");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("g:enter");
  lcd.setCursor(0,1);
  lcd.print("new values");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("m: correcr");
  lcd.setCursor(0,1);
  lcd.print("entered values");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("o: show");
  lcd.setCursor(0,1);
  lcd.print("actual values");
  delay(2000);
  op= (char)Serial.peek();}
switch(op){ 
 case'g':
  lcd.print("you selected");
  lcd.setCursor(0,1);
  lcd.print("enter");
  ingresar();
  break;
case'm':   
  lcd.print("you selected");
  lcd.setCursor(0,1);
  lcd.print("change");
  cambiar();
  break;
case'o':
  lcd.print("you selected");
  lcd.setCursor(0,1);
  lcd.print("show");
  mostrar();
  break;
  default:
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("invalid value");}}


      
void ingresar(){
int x= convertir();
for (int i=9;i>0; i--){
  cifra[x][i]=cifra[x][i-1];}
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("enter a number"); 
   int i =Serial.read()- '0';
  lcd.setCursor(0,1);
  lcd.print(i);
   int d= Serial.read()-'0';
  lcd.setCursor(0,2);
  lcd.print(d);
  cifra[x][0]=(i*10)+d;}

void cambiar(){}

int convertir(){int y;
switch (tecla) {
case 'g': y=0;break;
case 'm': y=1;break;
case 'o': y=2;break;}
return y;}



void mostrar(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Numbers are:");
  delay(3000);
  lcd.clear();
  lcd.setCursor(0,0);
int x= convertir();
for(int i=0;i<4;i++){
    lcd.print(cifra[x][i]/10);
    lcd.print(cifra[x][i]%10);
    lcd.print("-");}
    lcd.print(cifra[x][4]/10);
    lcd.print(cifra[x][4]%10);
    lcd.setCursor(0,1);
for(int i=5;i<9;i++){
    lcd.print(cifra[x][i]/10);
    lcd.print(cifra[x][i]%10);
    lcd.print("-");}
    lcd.print(cifra[x][9]/10);
    lcd.print(cifra[x][9]%10);
  }
  menu:
  type();
  seleccion();
  goto menu;

Quit trying to run an infinite loop inside an infinite loop().

In fact, get rid of EVERY goto statement in your code. Learn C. Do not try to make C emulate Basic.

i tried replacing

 void loop(){
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Welcome to");
 lcd.setCursor(0, 1);
 lcd.print("Arduino");
 delay(4000);
 menu:
 type();
 seleccion();
 goto menu;
}

with

 void loop (){
int a=0;
if (a =0){  
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Welcome to");
 lcd.setCursor(0, 1);
 lcd.print("Arduino");
 delay(4000);
 a=1;}
 type();
 seleccion();
}

but it doesn’t work anyway. Another thing is that if i run the prgramm justa in the following way it works

int cifra[3][10]={
{0,1,2,3,4,5,6,7,8,9},
{10,11,12,13,14,15,16,17,18,19},
{20,21,22,23,24,25,26,27,28,29}};

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int tecla =0;
int op=0;

void setup(){ 
  lcd.begin(16, 2);
  Serial.begin(9600);
}

void loop() {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Welcome to");
  lcd.setCursor(0, 1);
  lcd.print("arduino");
  delay(4000);
  menu:
  charge();
  goto menu;
}


void charge(){
inicio:
while(Serial.read()<0){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("select:");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("g: G");
  lcd.setCursor(0,1);
  lcd.print("m: M  o: O");
  delay(2000);
tecla= (char)Serial.peek();}
switch(tecla){
 case 'g':
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("you select::");
  lcd.setCursor(0,1);  
  lcd.print("Gl");
  break;
case 'm':
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("you select:");
  lcd.setCursor(0,1);
  lcd.print("M");
  break;
case 'o':
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("you select:");
  lcd.setCursor(0,1);
  lcd.print("O");
  break;
default:
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("invalid value");
  delay(1500);
  goto inicio;}}
if (a =0){

Assigning the value of 0 to a in the body of an if statement is not right.

= != ==

Why not just move the one-time stuff to setup() and leave the every time stuff in loop(), without trying to force loop() to do stuff once?