Por si aún os sigue interesando, he vuelto a realizar el ejemplo con los menús que había hecho anteriormente. Bueno, no está tan "currado" como el otro que tenía, pero ilustra muy bien, el funcionamiento que yo os había comentado.
Antes de nada, comentar que quizás no es la mejor forma de hacer un codigo muy optimizado (por el uso de globales, etc...) pero yo recuerdo haberlo hecho así por que se me imponía la codicion de usar las interrupciones en el portb. También se puede optimizar más escribiendo solo el asterisco en lugar de todas los strings, pero como ejemplo sirve....
No está muy comentado, pero creo que se entiende muy bien.
Otra cosilla, los menus no es que tengan mucho sentido (jejej) solo es un ejemplo.....
Está compilado con la version 3.206 y ocupa un 12%rom y 9%ram, para un 16f876a, creo que con un 18 apenas ocuparía....
Si queréis también tengo el fichero para simularlo en Proteus, aunque no lo subo al almacen porque no tengo nivel para subirlo, si queréis os lo paso, aunque es un esquema muy sencillo (lcd, pic y 4 pulsadores).
****************************************************
Codigo:
#include <16F876A.h>
#use delay(clock=4000000)
#include <lcd_modificado_trelles.c>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD
#byte port_b=6
static int tecla;
////////////////////////////////////////////////////////////////////////////////
// Prototipos de las funciones
//
////////////////////////////////////////////////////////////////////////////////
void submenu(void);
void configuracion(void);
void visualizacion(void);
///////////////////////////////////////////////////////////////////////////////
// RUTINA DE INTERRUPCION POR TECLADO EN PINES RB4 A RB7
// DETECTAMOS TECLA PULSADA
///////////////////////////////////////////////////////////////////////////////
#INT_RB
void tecla_pulsada(void)
{
delay_ms(20); //esperamos para evitar rebotes
if(!(port_b^0xF0))
return; //si se produce al soltar la tecla salimos de la interrupcion
//asignacion de tecla pulsada
if((!input(PIN_B7)))
{
tecla=7; //tecla enter asignamos un numero cualquiera p.e.=7
return;
}
if((!input(PIN_B6)))
{
tecla=6; //tecla flecha abajo
return;
}
if((!input(PIN_B5)))
{
tecla=5; //tecla flecha arriba
return;
}
if((!input(PIN_B4)))
{
tecla=4; //tecla menu
return;
}
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//CUERPO PRINCIPAL DEL PROGRAMA:
//
////////////////////////////////////////////////////////////////////////////////
void main(void)
{
//habilitar interrupciones
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
port_b_pullups(TRUE); //pull-ups activadas en puerto B
lcd_init(); //inicializacion del lcd
while(1)
{
if(tecla==4) //si se pulsa la tecla 4, vamos a los menus
submenu();
lcd_putc("f");
lcd_putc("Esperando..."); //sino se pulsa, seguimos esperando....
delay_ms(800);
}
}
////////////////////////////////////////////////////////////////////////////////
// Tratamiento de los menus....
// Hubiera sido preferible usar la funcion lcd_getc() para detectar
// que opcion está seleccionada, pero ignoro porque no me funciono, en lugar
// de eso uso una variable llamada flagi
////////////////////////////////////////////////////////////////////////////////
void submenu(void)
{
int1 flagi=0;
tecla=0;
//imprimimos la pantalla inicial
lcd_gotoxy(1,1);
lcd_putc("* Configuracion");
lcd_gotoxy(1,2);
lcd_putc(" Visualización");
//escaneamos la pulsacion de las teclas...
while(TRUE)
{
if(tecla==6)
{
tecla=0;
flagi=1;
lcd_putc("f");
lcd_gotoxy(1,1);
lcd_putc(" Configuracion");
lcd_gotoxy(1,2);
lcd_putc("* Visualización");
}
if(tecla==5)
{
tecla=0;
flagi=0;
lcd_putc("f");
lcd_gotoxy(1,1);
lcd_putc("* Configuracion");
lcd_gotoxy(1,2);
lcd_putc(" Visualización");
}
if(tecla==7)
{
tecla=0;
if(flagi==0)
configuracion(); //segun la opcion seleccionada (flagi) accedemos a uno u otro submenu....
else
visualizacion();
}
if(tecla==4)
{
tecla=0; //si se pulsa de nuevo la tecla menu, se vuelve a la pantalla principal...
return;
}
};
}
////////////////////////////////////////////////////////////////////////////////
// Submenu de configuracion
//
///////////////////////////////////////////////////////////////////////////////
void configuracion(void)
{
tecla=0;
lcd_putc("f");
lcd_gotoxy(1,1);
lcd_putc("* Reloj");
lcd_gotoxy(1,2);
lcd_putc(" Sensor");
while(tecla!=4)
{
if(tecla==6)
{
tecla=0;
lcd_putc("f");
lcd_gotoxy(1,1);
lcd_putc(" Reloj");
lcd_gotoxy(1,2);
lcd_putc("* Sensor");
}
if(tecla==5)
{
tecla=0;
lcd_putc("f");
lcd_gotoxy(1,1);
lcd_putc("* Reloj");
lcd_gotoxy(1,2);
lcd_putc(" Sensor");
}
};
tecla=5; //tecla=5 se vuelve al menú superior.....
return;
}
void visualizacion(void)
{
tecla=0;
lcd_putc("f");
lcd_gotoxy(1,1);
lcd_putc("* Weee");
lcd_gotoxy(1,2);
lcd_putc(" Wooo");
while(tecla!=4)
{
if(tecla==6)
{
tecla=0;
lcd_putc("f");
lcd_gotoxy(1,1);
lcd_putc(" Weee");
lcd_gotoxy(1,2);
lcd_putc("* Wooo");
}
if(tecla==5)
{
tecla=0;
lcd_putc("f");
lcd_gotoxy(1,1);
lcd_putc("* Weee");
lcd_gotoxy(1,2);
lcd_putc(" Wooo");
}
};
tecla=5; //tecla=5 se vuelve al menú superior.....
return;
}
Saludos.