PIC16F84 – Puertos de entrada y salida
Problema propuesto
Se trata de que el programa lea la entrada del puerto A y lo refleje en el puerto B. El programa deberá dormirse cuando los interruptores de entrada tengan la configuración «11111».
Solución
;-------------------------------------------------------------------------
list p=16F84A
include P16F84A.INC
;-------------------------------------------------------------------------
org 00h ;VectordeReset
goto INICIO
org 0x05 ;Vector de interrupción
INICIO
clrf PORTB ;NumB->W (Acumulador)
bsf STATUS,RP0 ;Banco = 1
clrf TRISB ;Puerto B como salida
movwf b'00011111' ;
movwf TRISA ;Puerto A como entrada
bcf STATUS,RP0 ;Banco = 0
BUCLE
movf PORTA,W ;Leo las entradas
movwf PORTB ;Las paso a las salidas
movlw 0x1F ;w=1F
subwf PORTA,W ;Porta-1F
btfsc STATUS,Z ;Z=1 -> PORTA=1F
goto DORMIR ;Z=1
goto BUCLE ;Z=0 -> analizamos las entradas
DORMIR
sleep
end ;Fin del programa fuente
;-------------------------------------------------------------------------
Disponemos de tres partes bien diferenciadas, INICIO, BUCLE y DORMIR. En inicio se configura el puerto B como salida y el puerto A como entrada. En bucle reflejamos el estado del puerto A en el puerto B y seguidamente chequeamos si el puerto A tiene todos los bits activados o en estado “1”. Para ello cargamos en el acumulador el valor hexadecimal “1F”, que en binario es “11111”, para a continuación realizar una resta entre Puerto A y W (PORTA-W). Si el resultado de la resta es cero se activará el flag Z (Z=1) y el programa pasará a reposo mediante la instrucción SLEEP, de lo contrario se repetirá el bucle.
Este código representa un ejemplo típico de interruptores asociados a leds, donde cada interruptor enciende un led.
Se puede ver un ejemplo de funcionamiento en este vídeo: https://youtu.be/eZSBLqVio-U
https://youtu.be/eZSBLqVio-U