;
;
;Leer el estado de 3 interruptores conectados a RA0 - RA1 - RA2
;Si RA2 esta apagado lo detiene todo a espera de encenderlo nuevamente a modo de interruptor de
;encendido general.
;Dependiendo de las posiones de RA0 y RA1 efectuara ordenes diferentes de operaciones (A+B)-C
;El resultado de la operacion (en binario) se muestra en los LEDS conectados a las salidas en RB0-RB1-RB2
List p=16F876A ;Tipo de procesador
include "P16F876A.INC" ;Definiciones de registros internos
; Definicion de variables temporales
dato_A equ 0x20
dato_B equ 0x21
dato_C equ 0x22
resultado equ 0x23
temp equ 0x24
;Ajusta los valores de la palabra de configuración durante el ensamblaje:
;Protección de código y datos=OFF, LVP=OFF, WDT=OFF y OSC=XT
__config _CP_OFF&_CPD_OFF&_LVP_OFF&_WDT_OFF&_XT_OSC
org 0x00
goto Inicio ;Vector de reset
org 0x05
Inicio clrf temp
clrf dato_A
clrf dato_B
clrf dato_C
clrf resultado
clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida
movlw 0x06
movwf ADCON1 ;Puerta A digital
movlw b'00000111'
movwf TRISA ;Puerta A se configura como entrada
bcf STATUS,RP0 ;Selecciona banco 0
Loop
btfss PORTA,2 ;Chequea el estado del interruptor I
goto apaga ;Está en OFF, sistema parado
movf PORTA,W ;Leer las entradas RA0-RA1
movwf resultado ;Carga el valor anterior de W para poder verlo en el debug.
andlw b'00000011' ;Máscara para las línea RA0-RA1
movwf resultado
btfsc STATUS,Z ;RA0 Esta a 00 ? RA0->0 RA1->0
goto Valen00 ;Si
movwf temp ;almacena resultado de estado original
movlw b'00000001' ;almacena en W
subwf temp,W ;resta temp-W (00000011-00000001=00000010)
btfsc STATUS,Z ;Esta a 10 ? RA0->1 RA1->0
goto Valen10 ;SI
movlw b'00000010' ;
subwf temp,W
btfsc STATUS,Z ;Esta a 01 ? RA0->0 RA1->1
goto Valen01 ;SI
movlw b'00000011' ;
subwf temp,W
btfsc STATUS,Z ;Esta a 11 ? RA0->1 RA1->1
goto Valen11 ;SI
goto Loop
Valen01 movlw 0x04
movwf dato_A
movlw 0x05
movwf dato_B
movlw 0x02
movwf dato_C
movf dato_A,W ;Carga en W el valor de dato_A
movwf resultado ;valor de W a ---> resultado para verlo
addwf dato_B,W ;Suma el valor de B a W
movwf resultado ;valor de W a ---> resultado para verlo
movf dato_C,W ;carga en W el valor de dato_c
subwf resultado,W ;resta de resultado el valor de W
movwf resultado ;valor de W a ---> resultado para verlo
movwf PORTB ;Reflejar en las salidas
goto Loop ;Bucle sin fin
Valen00
movlw 0x03
movwf dato_A
movlw 0x04
movwf dato_B
movlw 0x01
movwf dato_C
movf dato_A,W ;Carga en W el valor de dato_A
movwf resultado ;valor de W a ---> resultado para verlo
addwf dato_B,W ;Suma el valor de B a W
movwf resultado ;valor de W a ---> resultado para verlo
movf dato_C,W ;carga en W el valor de dato_c
subwf resultado,W ;resta de resultado el valor de W
movwf resultado ;valor de W a ---> resultado para verlo
movwf PORTB ;Reflejar en las salidas
goto Loop ;Bucle sin fin
Valen10 movlw 0x01
movwf dato_A
movlw 0x05
movwf dato_B
movlw 0x02
movwf dato_C
movf dato_A,W ;Carga en W el valor de dato_A
movwf resultado ;valor de W a ---> resultado para verlo
addwf dato_B,W ;Suma el valor de B a W
movwf resultado ;valor de W a ---> resultado para verlo
movf dato_C,W ;carga en W el valor de dato_c
subwf resultado,W ;resta de resultado el valor de W
movwf resultado ;valor de W a ---> resultado para verlo
movwf PORTB ;Reflejar en las salidas
goto Loop ;Bucle sin fin
Valen11 movlw 0x01
movwf dato_A
movlw 0x08
movwf dato_B
movlw 0x04
movwf dato_C
movf dato_A,W ;Carga en W el valor de dato_A
movwf resultado ;valor de W a ---> resultado para verlo
addwf dato_B,W ;Suma el valor de B a W
movwf resultado ;valor de W a ---> resultado para verlo
movf dato_C,W ;carga en W el valor de dato_c
subwf resultado,W ;resta de resultado el valor de W
movwf resultado ;valor de W a ---> resultado para verlo
movwf PORTB ;Reflejar en las salidas
goto Loop
;esta etiqueta la creo porque en el stimulus no se aprecia, pero metido
;en el entrenador, si apagamos RA2 quedan encendidos los LEDS con el
;ultimo resultado.
apaga clrf PORTB
goto Loop
end ;Fin del programa fuente