LIST P=16F628A
INCLUDE P16F628A.inc
__CONFIG 0x2150
CBLOCK 0x20
W_TEMP
STATUS_TEMP
d1
d2
d3
ENDC
; Vector de reset
ORG 0x00
GOTO CONF_BITS
;Vector de interrupcion
ORG 0x04
GOTO INTERRUPT
;Configuration Bits
CONF_BITS
MOVLW .7
MOVWF CMCON ; Todos los pines digitales
BSF STATUS,RP0
CLRF TRISA ; Puerto A como salida
MOVLW B'11111111'
MOVWF TRISB ; Puerto B como entradas
MOVLW B'01000111' ; ...
MOVWF OPTION_REG
BCF STATUS,RP0
MOVLW B'10010000' ; Activo interrupciones
MOVWF INTCON
MAIN
; Aca el programa principal, pongo un ejemplo
BSF PORTA, 0 ; Activo RA0
CALL DELAY500ms ; Llamo a un delay, 0.5s
BCF PORTA, 0 ; Apago RA0
CALL DELAY500ms ; Espero 0.5s
GOTO MAIN
;Interrupt Start
INTERRUPT
;Aca guardo W y STATUS ( sacado del datasheet )
MOVWF W_TEMP
SWAPF STATUS, W
BCF STATUS, RP0
MOVWF STATUS_TEMP
;Codigo de interrupcion
BTFSC INTCON,INTF
CALL LED_1
;Aca codigo para restaurar W y STATUS ( sacado del datasheet )
SWAPF STATUS_TEMP, W
MOVWF STATUS
SWAPF W_TEMP, F
SWAPF W_TEMP, W
LED_1
MOVLW B'00000010'
XORWF PORTA, F ; Invierto RA1 solamente
RETURN
; Delay de 0.5s para 4Mhz
DELAY500ms
;499994 cycles
movlw 0x03
movwf d1
movlw 0x18
movwf d2
movlw 0x02
movwf d3
DELAY500ms_0
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto DELAY500ms_0
;2 cycles
goto $+1
;4 cycles (including call)
return
END