Está en la página 1de 3

INTERRUPCIONES

list p=16F84A #include P16F84A.inc __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;**** Definicion de variables **** Contador1 equ 0x0C Contador2 equ 0x0D Pulsador equ Led equ 0 1 ; pin RB0 ; pin RB1

;**** Inicio del Micro **** Reset org 0x00 ; Aqui comienza el micro.goto Inicio ; Salto a inicio de mi programa.;**** Vector de Interrupcion **** org 0x04 ; Atiendo Interrupcion.goto ISR ; **** Programa Principal **** ;**** Configuracion de puertos *** org 0x05 ; Origen del codigo de programa.Inicio bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.movlw b'11111101' ; RB0 como entrada y RB1 como salida.movwf TRISB movlw b'01000000' ; Config. Por flanco Ascendente.movwf OPTION_REG bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0 bcf PORTB,Led ; El Led comienza apagado.movlw b'10010000' ; Habilitamos GIE y INTE (interrupcin por RB0) movwf INTCON ;**** Bucle infinito **** Bucle nop ; goto Bucle ; ;............................................. ;**** Rutina de servicio de Interrupcion **** ;**** Interrupcion por RB0 **** ISR btfss INTCON,INTF ; Consultamos si es por RB0.retfie ; No, Salimos de interrupcin.call Demora_20ms ; Comprueba si es rebote.btfss PORTB,Pulsador goto Fin_ISR ; Es rebote, entonces salimos.btfss PORTB,Led ; Si esta prendido, lo apagamos.goto Prender_Led bcf PORTB,Led ; Apagamos Led goto Fin_ISR Prender_Led bsf PORTB,Led ; Encendemos Led Fin_ISR bcf INTCON,INTF ; Limpiamos bandera.retfie ; Salimos de interrupcin.;.......................................... ;**** Demora **** Demora_20ms movlw 0xFF ; movwf Contador1 ; Iniciamos contador1.Repeticion1 movlw 0x19 ; movwf Contador2 ; Iniciamos contador2 Repeticion2 decfsz Contador2,1 ; Decrementa Contador2 y si es 0 sale.goto Repeticion2 ; Si no es 0 repetimos ciclo.decfsz Contador1,1 ; Decrementa Contador1.goto Repeticion1 ; Si no es cero repetimos ciclo.return ; Regresa de la subrutina.end

También podría gustarte