Buenas.
Dudo mucho que el codigo sea el problema. Yo creo que es mas del hardaware que estoy montando,pero bueno ahi va.
Es una modificacion del ejercicio del libro del PIC, los datos a comparar entran por los puertos.
Os he puesto una explicacionen el codigo
Ahi va:
;;;;;;;;;;;;;;;;;;;
; Compara dos datos entrados por PORTA y PORTB de dos digitos.
; salida por los bits de mayor peso de PORTB a un display BCD de 7 segmentos
; Si A=B , mandamos el valor '0'
; Si A<B, mandamos el resultado 'A+B'
; Si A>B, mandamos el resultado 'A-B'
list p= 16f84A
#include <p16f84.inc>
Resultado equ 0x10
Error_E equ b'1110'
Consigna_7 equ b'0111'
Consigna_2 equ b'0010'
org 0x00 ;vector reset origen
goto inicio
;org 0x05
inicio
bsf STATUS,RP0 ;cambio al banco 1
movlw b'00001111'
movwf TRISA ;RA0 y RA1 como entrada
movlw 0x0F ;Parte baja PORTB como entrada
movwf TRISB ;parte alta PORTB como salida
bcf STATUS,RP0 ;cambio al banco 0
;programa principal
principal
movf PORTB,0 ; cargamos el dato del PORTB a W
subwf PORTA,0 ; restamos al valor de PORTA lo que hay en W,
; es decir, el valor de PORTB,
btfsc STATUS,Z ; Si despues de la resta, Z= 1 , significa que
;A = B
goto A_igual_B
btfsc STATUS,C ;si despues de la resta, Z=0, y ahora C= 1,
;significa que A > B
goto A_mayor_B
A_menor_B ; si llegamos aqui, es porque despues de
;la resta, Z=0, y C= 0
movf PORTA,0
addwf PORTB,0 ; para el caso de A < B, mandamos a la
;salida el valor de A+B.
; si no ponemos el '0', la suma la guarda
; en PORTB, dando falso el resultado
goto Activa_salida
A_mayor_B
goto Activa_salida ; para el caso A > B, resulta que en la
;resta, en W quedo A-B, que
;es lo queremos mandar a la salida, por eso no lo volvemos a cargar
A_igual_B
clrf W ; para el caso A = B, en la salida teniamos
;que enviar el valor '0'
Activa_salida
movwf Resultado ; cargamos el valor que haya en W en un
;registro Resultado, pq hacer el
; SWAPF en W da problemas
swapf Resultado,0 ;rotamos en el registro Resultado los bits
; de mayor peso con los de
; menor peso, pq la salida en PORTB la
;tenemos en los bits altos de mayor peso
movwf PORTB ;cargamos ya el valor rotado en PORTB
;goto principal
END
Lo pongo de nuevo que el anterior era erroneo.
; Compara dos datos entrados por PORTA y PORTB de dos digitos.
; salida por los bits de mayor peso de PORTB a un display BCD de 7 segmentos
; Si A=B , mandamos el valor '0'
; Si A<B, mandamos el resultado 'A+B'
; Si A>B, mandamos el resultado 'A-B'
list p= 16f84A
#include <p16f84.inc>
Resultado equ 0x10
org 0x00
goto inicio
inicio
bsf STATUS,RP0
movlw b'00001111'
movwf TRISA
movlw 0x0F
movwf TRISB
bcf STATUS,RP0
;programa principal
principal
movf PORTB,0
subwf PORTA,0
btfsc STATUS,Z
goto A_igual_B
btfsc STATUS,C
goto A_mayor_B
A_menor_B
movf PORTA,0
addwf PORTB,0
goto Activa_salida
A_mayor_B
goto Activa_salida
A_igual_B
clrf W
Activa_salida
movwf Resultado
swapf Resultado,0
movwf PORTB
goto principal
END