Hola amigos; gracias a los consejos que me habeis dado por fin he concluido un pequeño programa que consta de un menu con tres teclas:
-tecla ok(tok)
-tecla incremento(tmas)
-tecla decremento(tmns)
Una vez elegida la opción se vuelve al menu de inicio trancurrido un tiempo o pulsando tok.
Buenos os lo dejo, aunque sigo planteandome una pregunta:
¿Por qué funciona mal el LCD (los mensajes no salen en la posicion xy especificada) cuando coloco el código que va despues de IF(ENTRAMENU=1) lo coloco en la rutina de atencion a la interrupcion externa?
#include <18F2520.h>
#fuses NOWDT, 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
#bit t_mas =pb.1 // RB1
#bit t_mns =pb.2 // RB2
#byte intcon =0xFF2
#bit intf =intcon.1
//#byte intcon3 =0xFF0
//#bit intf1 =intcon3.0
#include <lcdult.h>
int1 entramenu;
static unsigned int8 test, i, tok, tmas, tmns;
void main()
{
entramenu=0;
i=0;
test=0;
port_b_pullups(true);
setup_adc_ports(NO_ANALOGS);
intf=0;
set_tris_b(0b00000111);
ext_int_edge(h_to_l);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
lcd_init();
delay_ms(100);
while(true)
{
lcd_gotoxy(1,1);
lcd_putc("Menu");
delay_ms(1000);
if(entramenu==1)
{
disable_interrupts(GLOBAL);
disable_interrupts(INT_EXT);
delay_ms(300);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Opcion1");
delay_ms(30);
lcd_gotoxy(1,2);
lcd_putc("Opcion2");
delay_ms(30),
lcd_gotoxy(1,3);
lcd_putc("Opcion3 ");
delay_ms(30);
lcd_gotoxy(1,4);
lcd_putc("OPCION:");
for(i=0;i!=255;i++) // 5 segundos para pulsar alguna tecla
{
delay_ms(20);
lcd_gotoxy(8,4);
printf(lcd_putc,"%u",test);
if (!t_ok){delay_ms(300); break;}
else if (!t_mas){i=0; delay_ms(300); test++; if(test>3){test=0;};}
else if (!t_mns){i=0; delay_ms(300); test--; if(test==255){test=3;};}
};
if(test==0)
{
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
lcd_putc("\f");
}
else if(test==1){
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Opcion1 Seleccionada");
delay_ms(2000);
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
test=0;
}
else if(test==2){
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Opcion2 Seleccionada");
delay_ms(2000);
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
test=0;
}
else if(test==3){
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Opcion3 Seleccionada");
delay_ms(2000);
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
test=0;
}
entramenu=0;
lcd_putc("\f");
}
}
}
#INT_EXT
menu()
{
entramenu=1;
}