Hola Gedeon, bienvenido al C, que hará que programar sea como un paseo por el parque, en comparación con su contraparte en ensamblador.
Yo te puedo dar unos tips para estructurar un menú. Lo que yo hago para estructurar un menú, por ejemplo en un LCD alfanumérico es manejar niveles, el nivel 0 será tu menú principal, en el cuál se dará a escoger al usuario entre los niveles 1, 2 y 3, por ejemplo; en el nivel 1 se puede dar a escoger entre los subniveles 1-1, 1-2 y 1-3, los mismo para el 2 y el 3, asi, dependiendo de cuantos submenus tengas; además yo lo que hago es manejar la parte gráfica y la parte de toma de desiciones por separado, como por ejemplo:
void error_message() // Mesaje de error
{
printf(lcd_putc,"\f<<<<<<<ERROR>>>>>>>>\n\n");
printf(lcd_putc,"Seleccion incorrecta");
delay_ms(500);
}
/* Construcción del menú en LCD 20x4
En esta parte solamente se realiza la escritura en el LCD, dependiendo del
nivel que dicte la parte de control, esta es la parte gráfica.
*/
if(flag_lcd==1) // Si la bandera de escritura en LCD está seteada
{
flag_lcd=0; // Resetea la bandera de escritura para escribir solo una vez
switch(menu_level) // Determina en qué nivel del menú se encuentra
{
case 0: // Menú principal (Nivel 0)
printf(lcd_putc,"\f<<<<<<<<MENU>>>>>>>>\n");
printf(lcd_putc,"1 - PRENDER LEDs\n");
printf(lcd_putc,"2 - APAGAR LEDs\n");
printf(lcd_putc,"3 - TOGGLING LEDs");
break;
case 1: // Menú prender LEDs (Nivel 1)
printf(lcd_putc,"\f<<<<PRENDER LEDs>>>>\n");
printf(lcd_putc,"1 - LED B0 = %s\n",LED_B0_state);
printf(lcd_putc,"2 - LED B1 = %s\n",LED_B1_state);
printf(lcd_putc,"3 - LED B2 = %s",LED_B2_state);
break;
case 2: // Menú apagar LEDs (Nivel 2)
printf(lcd_putc,"\f<<<<APAGAR LEDs>>>>>\n");
printf(lcd_putc,"1 - LED B0 = %s\n",LED_B0_state);
printf(lcd_putc,"2 - LED B1 = %s\n",LED_B1_state);
printf(lcd_putc,"3 - LED B2 = %s",LED_B2_state);
break;
case 3: // Menú toggling LEDs (Nivel 3)
printf(lcd_putc,"\f<<<TOGGLING LEDs>>>>\n");
printf(lcd_putc,"1 - LED B0 = %s\n",LED_B0_state);
printf(lcd_putc,"2 - LED B1 = %s\n",LED_B1_state);
printf(lcd_putc,"3 - LED B2 = %s",LED_B2_state);
break;
}
}
/* Control del menú
Esta parte controla lo que se muestra en el menú, dependiendo del nivel en
el que se esté, se determinan los parámetros que se escogen
*/
if(flag_receive_data==1) // Si la bandera de dato entrante se seteo...
{
flag_receive_data=0; // Resetea la bandera de dato entrante
flag_lcd=1; // Setea bandera de escribir en LCD
switch(menu_level) // Determina el nivel del menú y sus opciones
{
case 0: // Menu raíz escogido - nivel 0
switch(data) // Determina que opción del nivel 0 se escogió
{
case '1': // Prender LEDs
menu_level=1;
break;
case '2': // Apagar LEDs
menu_level=2;
break;
case '3': // Toggling LEDs
menu_level=3;
break;
default: // Ninguna opción válida
error_message();
}
break;
case 1: // Prender LEDs - nivel 1
switch(data) // Determina que opción del nivel 1 se escogió
{
case '1':
output_high(PIN_B0);
break;
case '2':
output_high(PIN_B1);
break;
case '3':
output_high(PIN_B2);
break;
case 'b': case 'B': case ESC: case BAC: // Regresar al menú raíz
menu_level=0;
break;
default: // Ninguna opción válida
error_message();
}
break;
case 2: // Apagar LEDs - nivel 2
switch(data) // Determina que opción del nivel 1 se escogió
{
case '1':
output_low(PIN_B0);
break;
case '2':
output_low(PIN_B1);
break;
case '3':
output_low(PIN_B2);
break;
case 'b': case 'B': case ESC: case BAC: // Regresar al menú raíz
menu_level=0;
break;
default: // Ninguna opción válida
error_message();
}
break;
case 3: // Toggling LEDs - nivel 3
switch(data) // Determina que opción del nivel 3 se escogió
{
case '1':
output_toggle(PIN_B0);
break;
case '2':
output_toggle(PIN_B1);
break;
case '3':
output_toggle(PIN_B2);
break;
case 'b': case 'B': case ESC: case BAC: // Regresar al menú raíz
menu_level=0;
break;
default: // Ninguna opción válida
error_message();
}
break;
}
}
El ejemplo que te puse es de un menú que da a escoger entre prender, apagar o cambiar de estado 3 LEDs, y para regresar al menú principal se puede presionar ESC, BACKSPACE, 'b' o 'B'. Si el usuario escoge una opción no válida, entonces se muestra un mensaje de error en el LCD por 500ms y se vuelve a mostrar el menú donde estaba.
Espero que te puedas dar mejor una idea con esta info. Para que te podamos orientar más, creo que debes explicar más detalladamente en que área específica te atoras. Saludos!