Autor Tema: Menu con 3 botones  (Leído 4333 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Menu con 3 botones
« en: 18 de Septiembre de 2003, 07:02:00 »
Os cuento mas menos, quiero hacer un menu de en principio 5 opciones con un 16f876, que lo muestre en un LCD controlado con 4bits (aunque supongo que adaptarlo a uno de 8bits no debe ser complicado...), y para navegar por el haré uso de 3 botones:
boton 1: arriba
boton 2: abajo
boton 3: pulsacion corta:OK, pulsacion larga:entrar en el menu, o salir de el

Alguien tiene por ahi un ejemplo o sitio donde pueda informarme de como hacer lago parecido??

Muchas Gracias

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Menu con 3 botones
« Respuesta #1 en: 18 de Septiembre de 2003, 14:21:00 »
Hace algún tiempo Pacala dejó en Proyectos el tema: "Un menú en la LCD". He estado mirando pero no lo he visto, devió de sucumbir cuando lo del maremoto (se borraron muchos mensajes). Pero este yo lo tenía grabado. Está todo, el mensaje y los dos ficheros que lleva en http://miarroba.com/foros/ver.php?foroid=132136&temaid=1051817

Están los dos ficheros en pbp, no sé si te servirá.

Sí me gustaría saber como funciona alguno de ellos.

Un saludo

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: Menu con 3 botones
« Respuesta #2 en: 19 de Septiembre de 2003, 09:12:00 »
gracias tio.. a ver q puedo ir haciendo con eso

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: Menu con 3 botones
« Respuesta #3 en: 01 de Octubre de 2003, 20:20:00 »
hola otra vez. :(

No veo forma de hacer el menu... me voy a volver loco

ahora mismo con lo que estoy es con este...aunq he hecho varios ya .. y ninguno.. este empieza a hacer algo pro aun nada de nada:


#include <16f84a.h>

#use delay(clock=4000000,RESTART_WDT)

#use fast_io(A)
#use fast_io(B)

#include <lcd2.c>

int opc;

void opcion1();


void opciones(opc)
{
   restart_wdt();
   lcd_gotoxy(1,2);
   if (opc==1){lcd_putc("opcion 1");if(input(PIN_A3))opcion1();}
   if (opc==2)lcd_putc("opcion 2");
   if (opc==3)lcd_putc("opcion 3");
   if (opc==4)lcd_putc("opcion 4");
   if (opc==5)lcd_putc("opcion 5");
}

void opcion1()
{
restart_wdt();
lcd_gotoxy(1,1);
lcd_putc("opcion 1 Selecc");
lcd_gotoxy(1,2);
lcd_putc("                ");
delay_ms(2000);
}


main() {

  lcd_init();   // Comandos de inicialización del LCD.

  lcd_gotoxy(1,1);
  lcd_putc("Menu:");
  opc = 1;

  while(1)
  {
    restart_wdt();
    opciones(opc);
    if(input(PIN_A4))
    {
     if (opc<1)opc=5;
     if (opc>5)opc=1;
      delay_ms(500);
      opc++;
    }

joer si seguro que es mas sencillo de la que estoy liando... pro no veo forma de avanzar :(

muchas gracias

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: Menu con 3 botones
« Respuesta #4 en: 03 de Octubre de 2003, 03:02:00 »
alguna idea????

gracias

Desconectado lu6vg

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 313
RE: Menu con 3 botones
« Respuesta #5 en: 03 de Octubre de 2003, 09:39:00 »
Hola

No tengo experiencia en el manejo de LCD por lo que no puedo ayudarte en tu problema, pero te aconsejo que esta parte del programa

if (opc==1){lcd_putc("opcion 1";if(input(PIN_A3))opcion1();}
if (opc==2)lcd_putc("opcion 2";
if (opc==3)lcd_putc("opcion 3";
if (opc==4)lcd_putc("opcion 4";
if (opc==5)lcd_putc("opcion 5";
}

la cambies por un switch.

Saludos

Luis

Desconectado Nosemucho

  • PIC10
  • *
  • Mensajes: 5
RE: Menu con 3 botones
« Respuesta #6 en: 13 de Octubre de 2003, 14:39:00 »
Hombre no se si te puede servir de algo pero yo estoy programando algo similar, te remito el codigo basico se puede ampliar con multiples submenus y teclas, ya me contaras, si tienes alguna duda no dudes en consultar.

#include <16f870.H>
#include <stdlib.h>
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=n, bits=8)

signed int punter;

const char menu[6][10]={"HOLA","QUE","TAL","como","estas","Exec"};


void mostramenu(int punter)
 {
   char texto[10];
   strcpy(texto,menu[punter]);
   printf("%c",12);
   printf(texto);
   delay_ms(1000);
  }

void teclas(int tecla)
 {
  switch (tecla) {
    case 1:  {punter++; if (punter==5) punter=0;}
       break;
    case 2: {punter--; if (punter<0) punter=4;}
       break;
    case 10: punter=5;
         }
    mostramenu(punter);
    printf("%u",tecla);
  }

 main()
{
long contador;
byte tecla;

contador=0;
tecla=0;
punter=0;

mostramenu(0);

while(true){

contador=0;
  while(input_a()>0){  
   if (tecla==input_a())  contador++; else contador=0;
     tecla=input_a();  
     delay_ms(10);
      if (contador>110) break;
      }
    if (contador>5 && contador<100) teclas(tecla);
    if (contador>100) teclas(10);
  }
}


Un saludo


Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: Menu con 3 botones
« Respuesta #7 en: 16 de Octubre de 2003, 07:35:00 »
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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Menu con 3 botones
« Respuesta #8 en: 19 de Octubre de 2003, 04:35:00 »
Nosemucho he intentado simular tu programa en PROTEUS y creo que no funciona.

Si lo que deseas es conseguir que:

- En reposo muestre HOLA

- Al activar RA0 (0001) aparezcan secuencialmente (izquierda a derecha): HOLA, QUE, TAL, como, estas.

- Al activar RA1 (0010) aparezcan secuencialmente (derecha a izquierda): estas, como, TAL, QUE, HOLA.

Debes de hacer el siguiente cambio: la llave que va detrás de if (contador>110) break;   hay que quitarla y ponerla al final del programa.

Un saludo



Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Menu con 3 botones
« Respuesta #9 en: 19 de Octubre de 2003, 04:49:00 »
Venum ¿conseguiste avanzar con el programa? ¿Usaste la sentencia switch () ?

Por que no quitas lo de la temporización y de momento lo haces más sencillo.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: Menu con 3 botones
« Respuesta #10 en: 20 de Octubre de 2003, 11:25:00 »
joe unos dias sin pasarme y la de respuestas q hay...

Deje un pokillo de lado el tema del menu pq me lie con otro proyectillo, al final d esta semana, o como muxo la semana q viene lo retomo, os postearé x aki los resultados, que seguro q los habrá tanto wenos como malos.... espero q no sean de los 2ºs

S2S

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: Menu con 3 botones
« Respuesta #11 en: 21 de Octubre de 2003, 02:00:00 »
con las prisas te puse el codigo donde se llama a la rutina y no la propia rutina

fijate que la idea es guardar el numero de menu en una variable (menu en mi caso) y la puedes usar despues para lo que necesites. lo mejor es usar switch .




void menus(){

   disable_interrupts(INT_TIMER2); //deshabilitada la interrupcion
   f_menu=1;

            menu+= 1;


            if (menu>4) menu=0;
                        switch (menu){ //para indicar el menu en la lcd
                                    case 0: {
                                    lcd_putc("fAjustar retardos";
                                    break;
                                    }
                                    case 1: {
                                    lcd_putc("fConfigurar Norte";
                                    break;
                                    }
                                    case 2: {
                                    lcd_putc("f Vel. muestreo";
                                    break;
                                    }
                                    case 3: {
                                    lcd_putc("fConfig. Minimo";
                                    break;
                                    }
                                    case 4: {
                                    lcd_putc("fConfig. Maximo";
                                    break;
                                   }
                        }
                     while (!b_menu) {
                     delay_ms(10);
                     };  //espero a que suelte
         }




 

anything