PIC16F84 – Puertos de entrada y salida

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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

18 + diecisiete =