Opa,
Tenta este aqui:
Menu.c
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// MENU CON 3 BOTONES (T.OK, T.MAS, T.MENOS) /////
///// /////
///// En este programa se muestra el funcionamiento de un menú controlable /////
///// mediante tres pulsadores, tecla ok, tecla mas, tecla menos;Se accede /////
///// al menú atraves de la interrupción en la pata RB0(T.OK), y se sale /////
///// de el seleccionando la opción 0, o habiendo transcurridos 5 segundos /////
///// sin pulsar ninguna tecla.Se acompaña de una simulación en Proteus /////
///// para mostrar su funcionamiento, en condiciones normales no haría /////
///// falta utilizar el WDT, pero si para su correcto funcionamiento en /////
///// Proteus /////
///// /////
///// por: Jaime Fernández-Caro Belmonte /////
///// /////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#include <18F2520.h>
#fuses WDT1024, XT, NOPROTECT, BROWNOUT, BORV45, NOPUT, NOCPD
#fuses NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOIESO, NOFCMEN, NOPBADEN
#fuses NOWRTC, NOWRTB, NOEBTR, NOEBTRB, NOCPB, NOLPT1OSC, MCLR, NOXINST
#use delay(clock=4000000)
#byte pb =0xF81
#bit t_ok =pb.0 // RB0, pin21
#bit t_mas =pb.1 // RB1, pin22
#bit t_mns =pb.2 // RB2, pin23
#byte intcon =0xFF2
#bit intf =intcon.1
#include <lcd420.h>
#include <menu.h>
void main()
{
port_b_pullups(true);
setup_adc_ports(NO_ANALOGS);
setup_wdt(WDT_ON);
lcd_init();
intf=0;
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(true)
{
restart_wdt();
lcd_gotoxy(1,1);
printf(lcd_putc,"Prueba Menu");
}
}
Menu.h
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///// MENU CON 3 BOTONES (T.OK, T.MAS, T.MENOS) /////
///// /////
///// En este programa se muestra el funcionamiento de un menú controlable /////
///// mediante tres pulsadores, tecla ok, tecla mas, tecla menos;Se accede /////
///// al menú atraves de la interrupción en la pata RB0(T.OK), y se sale /////
///// de el seleccionando la opción 0, o habiendo transcurridos 5 segundos /////
///// sin pulsar ninguna tecla.Se acompaña de una simulación en Proteus /////
///// para mostrar su funcionamiento, en condiciones normales no haría /////
///// falta utilizar el WDT, pero si para su correcto funcionamiento en /////
///// Proteus /////
///// /////
///// por: Jaime Fernández-Caro Belmonte /////
///// /////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void menu_uno(void);
void menu_dos(void);
void menu_tres(void);
static unsigned int8 testado, i, tok, tmas, tmns;
#INT_EXT
menu()
{
disable_interrupts(GLOBAL);
disable_interrupts(INT_EXT);
delay_ms(300);
testado=0;
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("1 Opcion Uno");
lcd_gotoxy(1,2);
lcd_putc("2 Opcion Dos");
lcd_gotoxy(1,3);
lcd_putc("3 Opcion Tres");
lcd_gotoxy(1,4);
lcd_putc("OPCION :");
for(i=0;i!=255;i++) // 5 segundos para pulsar alguna tecla
{
delay_ms(20);
restart_wdt();
lcd_gotoxy(11,4);
printf(lcd_putc,"%u",testado);
if (!t_ok){delay_ms(300); break;}
else if (!t_mas){i=0; delay_ms(300); testado++; if(testado>3){testado=0;};}
else if (!t_mns){i=0; delay_ms(300); testado--; if(testado==255){testado=3;};}
};
if(testado==0) // si la opcion seleccionada es la 0, salimos del menú
{
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
lcd_putc("\f");
break;
}
else if(testado==1){menu_uno(); lcd_putc("\f");}
else if(testado==2){menu_dos(); lcd_putc("\f");}
else if(testado==3){menu_tres(); lcd_putc("\f");}
}
////////////////////////////////////////////////////////////////////////////////
// Submenu 1
//
///////////////////////////////////////////////////////////////////////////////
void menu_uno(void)
{
restart_wdt();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Opcion1 Seleccionada");
delay_ms(2000);
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
}
////////////////////////////////////////////////////////////////////////////////
// Submenu 2
//
///////////////////////////////////////////////////////////////////////////////
void menu_dos(void)
{
restart_wdt();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Opcion2 Seleccionada");
delay_ms(2000);
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
}
////////////////////////////////////////////////////////////////////////////////
// Submenu 3
//
///////////////////////////////////////////////////////////////////////////////
void menu_tres(void)
{
restart_wdt();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Opcion3 Seleccionada");
delay_ms(2000);
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
}
Faça o projeto no MPLab e teste tambem no Proteus, e se servir é só correr pro abraço.
Valeu
