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