Algo asi?
Bienvenida()
1 - Menu
2 - Volcar datos PC
1-1 Variable1
1-2 Variable2
1-3 Variable3
1-4 Variable4
Cada variable tiene lo mismo
1-x-1 Obtener datos ( y luego vuelve al menu de las variables )
1-x-2 Menu
int j=0,nivel_menu=0,variable;
Bienvenida(); // O Mostrar_menu_inicial();
while(1)
{
k=kbd_getc();
if (k!=0 & j!=k) //Compruebo que se presiono algo Y no sea la misma tecla que la anterior ves,
{
switch(nivel_menu)
{
case 0:
switch(k) //Menu principal
{
case '1':
Mostrar_menu_de_variables();
nivel_menu=1;
break;
case '2':
Enviar_datos();
break:
default:
break;
}
break;
case 1: //Menu de variables, aca muesrto todas las variables para que seleccione una
switch(k)
{
case '1':
Mostrar_Menu_Var();
variable=1;
nivel_menu=2;
break;
case '2':
Mostrar_Menu_Var();
variable=2;
nivel_menu=2;
break;
case '3':
Mostrar_Menu_Var();
variable=3;
nivel_menu=2;
break;
case '4':
Mostrar_Menu_Var();
variable=4;
nivel_menu=2;
break;
case '#':
Mostrar_menu_inicial();
nivel_menu=0;
break;
default:
break;
}
break;
case 2: // Menu de cada variable, todas tienen 2 opciones, obtener datos y salir al menu anterior
switch(k)
{
case '1':
Obtener_datos(variable); // Segun sea el valor del argumento va a tomar un valor u otro
nivel_menu=1; // Indica que vuelva al menu anterior( los botones)
Mostrar_menu_de_variables();
break;
case '#':
Mostrar_menu_de_variables(); // Se muestra el menu anterior y se vuelve a los botones del anterior tmb
nivel_menu=1;
break;
default:
break;
}
break;
default: // Caso unico que por algun problema se llegue este punto, poniendo a 0 y el nivel y mostrando el mnu inicial
Mostrar_menu_inicial();
nivel_menu=0;
break;
}
}
j=k; //Para que no entre de nuevo si se mantiene presionado la tecla
}
Queda realizar las funciones que escriben en el LCD como
Mostrar_menu_inicial(); ( enviar datos y menu)
Mostrar_menu_de_variables(); ( var1 var2 var3 y var4)
Mostrar_Menu_Var(); ( obtener datos y menu )
Y la que obtiene los datos:
Obtener_datos(variable);
Segun "variable" va a actualizar una u otra, adentro de eso un switch...case con opciones de 1 a 4 y sale.
El codigo este se podria resumir aun mas, si es que esas opciones ya van a ser fijas y no pensas en agrandarla o modificarlas, como por ejemplo que cada variable tenga su propio menu.
No segui tu codigo por que esta incompleto, en tu afan de mostrar solo algunas partes por ejemplo no se que es MENU(), Pero por lo visto tenes problemas y que se encuentran en los while(true); lo que te encierra el programa ahi y no sale mas
Entonces la unica forma de salir de ahi es haciendo un break al while, pero el break del '#' es del switch..case , lo cual no estas saliendo apra nada,
si MENU()
es solamente mostrar las "opciones" y no tomar datos, esto quiere decir que vas a estar atrapado en ese while(true).
una forma "simple" de solucionarlo seria crear una variable para ese punto nomas e indicarle que debe salir de ahi
void MENU_NCOMB(){
char k,j=1;
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(lcd_putc
, "1.OBTENER DATOS"); lcd_gotoxy(1,2);
printf(lcd_putc
, "#.VOLVER AL MENU"); while (j){
k=kbd_getc();
if (k!=0)
switch(k){
case '1':
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(lcd_putc
,"OBTENIENDO"); lcd_gotoxy(1,2);
delay_ms(100);
NIVEL_COMBUSTIBLE();
break;
case '#':
MENU();
j=0;
break;
}
}
}
void SELECCIONAR(){
char z,j=1;
WHILE(j){
z=kbd_getc();
if (z!=0)
switch(z){
case '1':
MENU_TEMP();
break;
case '2':
MENU_NCOMB();
break;
case '3':
MENU_VEL();
break;
case '4':
MENU_RPM();
break;
case '#':
MENU_INICIAL();
j=0;
break;
}
}
}
Ahora
si MENU() tambien toma opciones (es decir tiene un while tambien) estarias con un problema un poco mas grande todavia. Ya que si tiene un while(true) dentro va a ocurrir esto:
Menu_inicial -> menu variables -> menu_var -> menu vriables -> menu var -> etc etc etc
Como esta dentro de un while() C espera que el programa regrese y empieza a guardar las direcciones de retorno, llegando a un punto de saturar el stack de hardware.
----
Otra cosa mas que cambie fue sacarle los "kbd_init()" dentro de esas funciones, esa funcion solo debe ser llamada al comienzo del programa y nunca mas, ya que esa funcion es para setear los puertos del micro, una ves seteados no deberian tocarse.