TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: marmoleta en 25 de Julio de 2017, 03:02:28

Título: Menu con pic 16f873A pulsadores oprimir y detener pulsar nuevamente para seguir
Publicado por: marmoleta en 25 de Julio de 2017, 03:02:28
Buenos dias estoy realizando un menu con pantalla lcd y pic 16f873A, pero tengo un problema, no puedo hacer que cuando se pulse el boton menu se quede en el submenu y cuando es presionado nuevamente el boton menu pase a otro

 :g)es decir presiono pulsador y hasta que no se suelte y presione  nuevamente no ingresa a otro

porque si mantengo presionado el boton menu entra a los submenu todo el tiempo

aqui dejo el codigo en css con el programa css c compiler

Código: [Seleccionar]
#include <main.h>

// DECLARACION DE FUNCIONES
int pulsador(void);

//DEFINICIONES
#define in input
//DEFINICION DE PINES

#define Mas         PIN_C4
#define Menos       PIN_C6
#define menu_bt PIN_C7

 
void main()
{
   // VARIABLES LOCALES
   int8 interna;                                    // contador
   int8 menu=0;                                     // seleccion de menu

   // PROGRAMA PRINCIPAL

   lcd_init();                                   // Inicializo el LCD
   delay_ms(100);                                // Retardo necesario para que se inicialice el LCD
   lcd_gotoxy(1,1);                              // Me ubico en la posicion 1,1 del LCD
   printf(lcd_putc,"  Test botones  ");          // Escribo el mensaje de bienvenida
   lcd_gotoxy(1,2);                              // Me ubico en la posicion 1,2 del LCD
   for(interna=0;interna<=15;interna++)          // En el segundo renglon cargo 16 * y creo un retardo
   {                                             // de 80ms para que el mensaje se mantenga 2 Segundos
      lcd_putc('*');
      delay_ms(80);
   }
   
WHILE(TRUE)
   { // ESTA PARTE DEL SOFTWARE SE DEDICA A LOS MENUS

   //MENU PRINCIPAL
   while (menu==0)
   {
      lcd_gotoxy(1,1);     
   printf(lcd_putc,"    pantalla    ");          // Escribo el mensaje pantalla
     
      lcd_gotoxy(1,2);                                   // Me ubico en la posicion 1,2 del LCD   
   
         printf(lcd_putc,"    principal   ");            // Escribo principal
         
      if(pulsador()==1){                                 // Si pulso el boton menu
         menu=1;}                                        // voy a menu  1

   }
   }
   
   //MENU 1
   if (menu==1)
      {

      lcd_gotoxy(1,2);                                         // Me ubico en la posicion 1,2 del LCD
      printf(lcd_putc,"       Menu     ");                     // Escribo menu
      while(menu==1){
         lcd_gotoxy(1,1);                                      // Me ubico en la posicion 1,1 del LCD
      printf(lcd_putc,"       1        ");                     // Escribo 1
         if(pulsador()==1){                                    // Si pulso el boton menu
            delay_ms(10);
            menu=2;}                                           // paso a siguiente menu
      }
      }
   
   //MENU 2
   if (menu==2)                                                // Menu 2
   {
      lcd_gotoxy(1,2);                                         // Me ubico en la posicion 1,2 del LCD
      printf(lcd_putc,"       Menu     ");                     // Escribo menu
      while(menu==2){
         lcd_gotoxy(1,1);                                      // Me ubico en la posicion 1,1 del LCD
      printf(lcd_putc,"       2        ");                     // Escribo 2
         if(pulsador()==1){                                    // Si pulso el boton menu
            delay_ms(10);
            menu=3;}                                           // paso a siguiente menu
      }
   }
   //MENU 3
   if (menu==3)                                                // Menu 3
   {
      lcd_gotoxy(1,2);                                         // Me ubico en la posicion 1,2 del LCD
      printf(lcd_putc,"       Menu     ");                     // Escribo menu
      while(menu==3){
         lcd_gotoxy(1,1);                                      // Me ubico en la posicion 1,1 del LCD
      printf(lcd_putc,"       3        ");                     // Escribo 3
         if(pulsador()==1){                                    // Si pulso el boton menu
            delay_ms(10);
            menu=0;}                                           // paso a siguiente menu
      }
   }   
   
   }


//FUNCION PULSADORES
int pulsador(void)
{
   int interna;
   if(!in(menu_bt)){
      interna=1;
      delay_ms(250);
            interna=1;
      }
   if(!in(Mas)){
      interna=2;
      delay_ms(100);}
   if(!in(Menos)){
      interna=3;
      delay_ms(100);}
   return interna;
}
Título: Re:Menu con pic 16f873A pulsadores oprimir y detener pulsar nuevamente para seguir
Publicado por: KILLERJC en 25 de Julio de 2017, 09:03:29
podrias adentro de los if, poner un while esperando que suelte

Código: C
  1. int pulsador(void)
  2. {
  3.    int interna;
  4.    if(!in(menu_bt)){
  5.       interna=1;
  6.       while(!menu_bt);
  7.       }
  8.    if(!in(Mas)){
  9.       interna=2;
  10.       while(!Mas);}
  11.    if(!in(Menos)){
  12.       interna=3;
  13.       while(!Menos);}
  14.    return interna;
  15. }

Esto puede afeectar a tu programa, todo depende de como es que este programado, pero ya lo veras.
Título: Re:Menu con pic 16f873A pulsadores oprimir y detener pulsar nuevamente para seguir
Publicado por: marmoleta en 25 de Julio de 2017, 17:07:18
Hola killerjc gracias por la respuesta ahora entiendo cuando es pulsado el boton luego suelta y se produce la accion, algo asi entiendo ya lo agregue al codigo y funciona muy bien, pero en el caso del boton aumentar y disminuir no es necesario quedaria solo para el boton menu. Cuando debo aumentar el valor y disminuirlo lo hace bien pero como puedo hacer para luego de 2 segundos aumente mas rapidamente

   
Código: [Seleccionar]
if (menu==2)                                                // Menu de Tiempo
   {
      lcd_gotoxy(1,2);                                         // Me ubico en la posicion 1,2 del LCD
      printf(lcd_putc," Tiempo Deseado ");                     // Escribo en el renglon inferior la leyenda Tiempo deseado 
      while(menu==2){
         lcd_gotoxy(1,1);                                      // Me ubico en la posicion 1,1 del LCD
         printf(lcd_putc,"       %Lu S   ",Tiempo_deseado);    // Escribo la variable tiempo_deseado
         if((pulsador()==2)&&(Tiempo_deseado<255))             // Si pulso + y la variable es menor a 255
            {
            Tiempo_deseado++;                                  // Aumento la variable en un segundo

            }
         if((pulsador()==3)&&(Tiempo_deseado>0))               // Si pulso - y la variable es mayor a 0
            {
            Tiempo_deseado--;                                  // Disminuto la variable en un segundo
            }
         if(pulsador()==1){                                    // Si pulso el boton Temp/Tiempo
            guardar_valor16(0x2110,Tiempo_deseado);            // Guardo variable en eeprom
            delay_ms(10);
            menu=0;}                                           // paso a siguiente menu
      }
   }
Título: Re:Menu con pic 16f873A pulsadores oprimir y detener pulsar nuevamente para seguir
Publicado por: KILLERJC en 26 de Julio de 2017, 12:14:57
Para hacer eso necesitarias una refencia de tiempo, para saber cuanto tiempo paso. La unica forma de hacer esto es usar un Timer.

Dos soluciones:

- O llevas todo lo de los botones/acciones (Aca nada de mostrar en el LCD, eso se hace en el loop principal) a la interrupcion del Timer, esto va a hacer que saques esos while por completo del codigo de los botones, y contando cuantas veces entro a la interrupcion podes saber si aumentar de a 1 o de 5 por ejemplo.

- O creas un Timer el cual tenga un "contador", entonces cuando detectas que el boton se presiono, guardas el valor del contador por unica ves. Luego de alli en adelante empezas a revisar que valor posee el contador, y comparas, si supera una cierta diferencia ( 2 segundos ) entonces procedes a aumentar de otra forma.