#include <P16F628A.inc>
__config 0x3F10
CBLOCK 0x70
STATUS_TEMP
W_TEMP
ENDC
org 0x00
GOTO start
org 0x04
GOTO interrupcion
start:
BANKSEL TRISA ; Selecciono banco donde esta TRISA
CLRF TRISA ; Pongo todo el puerto A como salida
BANKSEL PORTA ; Vuelvo al banco 0, donde esta CMCON y los PORTx
CLRF PORTA ; Pongo a 0 el PORTA
MOVLW 0x07
MOVWF CMCON ; Puerto A todo como digital
MOVF PORTB, W ; Leo el puertoB asi me permite borrar el flag
BCF INTCON, RBIF ; Borro el flag
BSF INTCON, RBIE ; Activo interrupciones
BSF INTCON, GIE
principal: ; Loop principal, aca podrias encender otro led con una demora
GOTO principal
interrupcion:
MOVWF W_TEMP
SWAPF STATUS, W
BCF STATUS, RP0
MOVWF STATUS_TEMP
BTFSC INTCON, RBIF ; Esto lo pongo para que veas como es cuando existen varias interrupciones juntas
CALL int_RB ; En caso de estar en 1 haga este codigo, sino sale
SWAPF STATUS_TEMP, W
MOVWF STATUS
SWAPF W_TEMP, F
SWAPF W_TEMP, W
RETFIE
int_RB
MOVF PORTB, W ; Aca podria comprobar cual de los RB4 a 7 fue el que cambio
BCF INTCON, RBIF ; y de paso leo asi puedo borrar el flag
BTFSS PORTB, 4 ; Pregunto si esta en 1, recorda que entra tanto cuando esta en 0 como en 1
RETURN ; En caso de ser 0 salgo
MOVF PORTA, W
XORLW 0x01 ; Hago una XOR del bit0, si estaba en 0 pasa a 1, si estaba en 1 pasa a 0
MOVWF PORTA ; Actualizo el puerto y salgo
RETURN
END