imlementacion de un push button

hola que tal.

tengo el siguiente archivo para programar un pic... me interesa saber como le hago para poder introducir en el codigo algo que me lea en la entrada de RA0 el pulso de un push button, que al momento de accionarlo este me haga el cambio entre la secuencia1 a la secuencia2 y asi mismo al accionarlo de nuevo me cambie a la secuencia3 y de nuevo al accionarlo me mande al la secuencia1 y volver a empezar. gracias por sus comentarios.

HTML:
#include <16f84a.h>

#fuses XT ,NOWDT //¿QUE ME FALTARIA PONER AQUI?????????
#use   delay(clock=4000000) 

#define   LED0  pin_B0 
#define   LED1   pin_B1


   int i=1; 
   int j=1;
   

#byte   TRISB =0b000000   //pin de Rb se declaran como salidas 
#byte   TRISA =0b00001      //pin de Ra0 se declaran como entrada  

void main()
{   



   
Inicio:  //inicio de programa

  
 
SECUENCIA1: //inicio secuencia 1
     
     
	
	  
		for(j=0; j<20; j++){
		for(i=0; i<1; i++){
         output_high(LED0)   ; // Encender LED en salida B0. 
         delay_ms(250)      ; // Esperar 250msegundos. 
         output_low(LED0)   ; // Apagar LED en salida B0. 
         delay_ms(10)      ; // Esperar 10msegundos.
         }//fin de for
		
         for(c=0; c<1; c++){
         output_high (LED1)   ; // Encender LED en salida B1.
         delay_ms(250)      ; // Esperar 250msegundos.
         output_low(LED1)   ; // Apagar LED en salida B1.
         delay_ms(10)      ; // Esperar 10msegundos.
         } //fin de for
	}//FIN DE FOR
	
   
SECUENCIA2: 


 		 for(j=0; j<20; j++){
		for(i=0; i<1; i++){
         output_high(LED0)   ; // Encender LED en salida B0. 
         delay_ms(100)      ; // Esperar 100msegundos. 
         output_low(LED0)   ; // Apagar LED en salida B0. 
         delay_ms(75)      ; // Esperar 75msegundos.
         }//fin de for


        for(c=0; c<1; c++){
         output_high (LED1)   ; // Encender LED en salida B1.
         delay_ms(100)      ; // Esperar 100msegundos.
         output_low(LED1)   ; // Apagar LED en salida B1.
         delay_ms(75)      ; // Esperar 75msegundos.
         }//fin de for
		}//fin de for

    
SECUENCIA3:  //inicio de secuencia 3

      for(j=0; j<20; j++){
      for(i=0; i<5; i++){
         output_high (LED0)   ; // Encender LED en salida B0. 
         delay_ms(50)      ; // Esperar 50msegundos. 
         output_low(LED0)  ; // Apagar LED en salida B0.
         delay_ms(50)      ; // Esperar 50msegundos.
         } //fin de for.  


      for(c=0; c<5; c++){
         output_high (LED1)   ; // EEncender LED en salida B1.
         delay_ms(50)      ; // Esperar 50msegundos.
         output_low(LED1)   ; // Apagar LED en salida B1.
         delay_ms(50)      ; // Esperar 50msegundos.
      }//fin de for.
      
}//fin de for

     
    GOTO Inicio;  //pasa a Inicio



}// fin de void main
 
Última edición:
para leer un pin debes utilizar la instruccion
Código:
 input_state(*PIN)
, que te devolvera un 1 si el puerto esta a 1 y un cero en caso contrario.
Un saludo
 
si me parece bien pero y luego que hago con ese uno..... por ejemplo tengo un uno y le digo que haga una secuencia pero, donde lo pongo dentro del codigo para que este detecte el impulso del boton para el cambio de secuencia, o en cada renglon hago que lea la entrada, es en lo que no entiendo, si debo de estar leyendo en cada renglon para detectar el impulso o existe alguna menera de que al accionar el boton este se detecte me cambie la secuencia. Yo tenia pensado implementar los "if" para estar leyendo la entrada que cuando me detecte el impuso el if me mande directamente a otra secencia, pero insisto debo de estar poniendo la lectura de la entrada a cada momento o que... la verdad estoy hecho un nudo.....
gracias
 
bueno puedes utilizar la interrupcion externa, en el momento que haya un flanco de subida o de bajada, como tu quieras, saltara a una rutina de interrupción en la que tu ejecutaras lo que quieras. de todas formas si el codigo no es muy muy estricto, no pasa nada por que estes siempre comprobando la entrada, no vas a notar la diferencia.
Un saludo
 
haber si suponiendo que el pic esta ejecutando el codigo, éste se dará cuenta (por asi decirlo) que hubo un cambio en la entrada y se saltara a otra secuencia ¿asi de sencillo?.

yo tengo pensado escribir antes de que comience la secuencias hacer un sumador que al momento que tenga un cambio en la entrada me vaya sumando +1 al conteo y por ejemplo si el contador es 1 pues me haga la secuencia1 y al siguiente cambio me sume otro 1 ya con el 2 me haga la secuencia2 y asi para el 3, pero al incrementarse a 4, al contador hacerlo 1 y este se vaya a la secuencia1 para volver a empezar, pero como hacer el codigo para que esto se cumpla cuando el codigo este corriendo, tendria que estar mandando a revisar el contador en cada linea para que no se me escapara el momento de cambio, no se si me explique bien. gracias.
 
haber si suponiendo que el pic esta ejecutando el codigo, éste se dará cuenta (por asi decirlo) que hubo un cambio en la entrada y se saltara a otra secuencia ¿asi de sencillo?.
Con interrupciones SI.

Por ejemplo con interrupción:
PHP:
#use fast_io(b)
#byte TRISB = getenv("SFR:TRISB")

char Event = 0;            // Sumador para ejecutar eventos

#int_EXT
void  EXT_isr(void)        // Interrupción externa RB0 
{
   ++Event;                // Incrementa el sumador
}

void main()                // Parte principal
{
   TRISB = 0b00000001;     
   ext_int_edge(H_TO_L);   // Flanco
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL); // Activa interrupción

   // TODO: USER CODE!!
   while(TRUE){               // En el Bucle principal
      output_toggle(PIN_B7);  // parpadea un LED en RB7
      if(Event == 0){         // a 100ms si 'Event' = 0
         delay_ms(100);   
      }else if(Event == 1){   // o a 200ms si 'Event' = 1
         delay_ms(200);
      }else if(Event == 2){   // o a 500ms si 'Event' = 2
         delay_ms(500);
      }else{
         Event = 0;           // Solo 3 tareas.
      }
   }                          // Fin, continua con el bucle principal.
}

Sin interrupción:
PHP:
void main()                // Parte principal
{
   TRISB = 0b00000001;     

   // TODO: USER CODE!!
   while(TRUE){               // En el Bucle principal
      if(!input_state(PIN_B0)){  // Lee el estado del PIN_B0
         ++Event;             // Si es '0' incrementa el sumador.
         delay_ms(10);
      }
      output_toggle(PIN_B7);  // parpadea un LED en RB7
      if(Event == 0){         // a 100ms si 'Event' = 0
         delay_ms(100);   
      }else if(Event == 1){   // o a 200ms si 'Event' = 1
         delay_ms(200);
      }else if(Event == 2){   // o a 500ms si 'Event' = 2
         delay_ms(500);
      }else{
         Event = 0;           // Solo 3 tareas.
      }
   }                          // Fin, continua con el bucle principal.
}

AVISO: No he considerado el efecto que produce el pulsador al ser pulsado (Debounce) por lo que estos ejemplos no creo que funcionen bien en uno real.

PD: Es una mala práctica usar Labels (goto Label), esto es C no Basic...

saludos.
 
Atrás
Arriba