esta es la forma en la que implemente el menu en el rotor que construi. no se si estara suficientemente claro pero a lo mejor os ayuda. la idea es poder usar lo botones para varias cosas segun el momento. de esta manera me funciona bastante rapido y bien
#include "d:compartidamis cosaillasficheros_adjuntosotor.h"
#include <LCD.C>
#include "d:compartidamis cosaillasficheros_adjuntospaises.c"
#include <stdlib.h>
#include <input.c>
#include <24256.C>
//#rom 0x2019={"o","l","a"," ","d","e","r"}
//Definicion de variables
int1 como,como1,f_norte,f_menu,f_menu1,f_config,f_minimo,f_maximo,lcd_update,f_dcha,f_izda,aut;
int8 ultimo,menu,retardo,refresco,refresco1,refresco2,cmd,conf;
float norte,grados;
int16 dato,minimo,maximo,data;
EEPROM_ADDRESS puntero,puntero1;
//entradas
#define b_menu input(PIN_B0)
#define b_mas !input(PIN_B1)
#define b_menos !input(PIN_B2)
#define b_exit !input(PIN_B6)
#define b_dcha !input(PIN_B4)
#define b_izda !input(PIN_B5)
//salidas
#define rele_dcha PIN_C0
#define luz_dcha PIN_C5
#define rele_izda PIN_C1
#define luz_izda PIN_C2
//Direcciones de los datos guardados en la EEPROM
#define mem_norte 10
#define mem_retardo 11
#define mem_refresco 12
#define mem_maximo 13
#define mem_minimo 15
#include "d:compartidamis cosaillasficheros_adjuntosutinasrotor.c"
#include "d:compartidamis cosaillasficheros_adjuntospic_pc.c"
void main() {
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_32);
setup_spi(FALSE);
// setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
setup_timer_2(T2_DIV_BY_16,255,16);
setup_ccp1(CCP_OFF);
setup_ccp2(CCP_OFF);
delay_ms(300); //para esperar que se estabilize el sistema...
set_tris_c(0b10111111); //el puerto c son salidas menos RX
set_tris_b(0b00000000); //el puerto b son entradas
port_b_pullups (true);
lcd_init();
delay_ms(100);
lcd_putc("f hola lucas"

; //mensaje inicial
lcd_putc("
EA7CCA"

; //mensaje inicial 2ª linea
delay_ms(1000);
enable_interrupts(global);
// datos a cero
ultimo=0; // numero del ultimo mensaje en la 2ª linea
f_norte=0; //se esta ajustando el norte
f_minimo=0;
f_maximo=0;
f_config=0;
f_menu=0;//se esta en algun menu
f_menu1=0; //el boton menu se usa para volver a la pantalla principal
menu=0;//nº de menu en el que estoy
cmd=0;
aut=0;
//rescatar datos de la eeprom
norte =read_eeprom(mem_norte);//la diferencia con elnorte se rescata de la eeprom
retardo=read_eeprom(mem_retardo);
refresco=read_eeprom(mem_refresco);
maximo=read_eeprom(mem_maximo);
minimo=read_eeprom(mem_minimo);
delay_ms(10);
//mirar si el maximo-minimo es aceptable y notificarlo
if(!(maximo>minimo)){
lcd_putc("f Ajuste limites"

;
lcd_putc("
Maximo y Minimo"

;
pausa(retardo);
}
//enable_interrupts(INT_RDA);
lcd_datos();
// Enable pullups on all port B pins.
port_b_pullups(TRUE);
init_ext_eeprom();
enable_interrupts(int_rda);
//bucle principal
while (true){
/* if (cmd!=0) {
disable_interrupts(INT_TIMER2); //desavilitada la interrupcion
comando_serie();
lcd_datos();
};
*/
IF(b_dcha){
girar_derecha();
}
IF(b_izda){
girar_izquierda();
}
if((!b_menu)&&(!aut)) {
while (!b_menu){
delay_ms(10);
}
//# ifdef debug printf("boton menu"

;
//si hay alguna bandera la atiendo...
if (f_norte) { // se esta calibrando el norte
sel_norte();
}
if (f_minimo) { // se esta calibrando el minimo
sel_minimo();
}
if (f_maximo) { // se esta calibrando el maximo
sel_maximo();
}
else{
menus();
}
}
if((b_mas)&&(!aut)){
while(b_mas){
delay_ms(10);
};
if (f_menu){
f_menu=0; //desactivo el flag de menu
switch(menu){
case 0: {
sel_retardo();
break;
}
case 1: {
sel_norte();
break;
}
case 2: {
sel_muestreo();
break;
}
case 3: {
sel_minimo();
break;
}
case 4: {
sel_maximo();
break;
}
}
}
}
if((b_exit)&&(!aut)) { //para salir de los menus y config
while(b_exit){
delay_ms(10);
};
f_menu=0; //desactivo el flag de menu
f_norte=0; //desactivo el flag de menu
f_minimo=0; //desactivo el flag de minimo
f_maximo=0; //desactivo el flag de maximo
lcd_datos();
}
}
}//la ultima