List P=16F877A ; Procesador PIC16f877A
#include "p16f877a.inc" ;Incluye las librerias
; CONFIGURACION DEL PIC16F84A
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _CP_OFF
;CODIGO
VAL1 EQU 0x20
VAL2 EQU 0x21
ORG 0
INICIO
BSF STATUS,RP0
CLRF TRISC ;PORTC todo como salida
CLRF TRISD ;PORT D RD0,RD1 como salida para el led
MOVWF TRISA ; PORTA CON RA0, RA1, RA2, RA3 como entrada
MOVWF TRISB ; PORTB CON RB1,RB2,RB4,RB5 como entrada
MOVLW 0x06
MOVWF ADCON1 ; PORTB como digital
BCF STATUS,RP0
; Cambiar las salidas del display para que no muestre nada.
START
; Propongo delay aca
; Preparo los registros para que por mas que cambie
; el PORTA/B entre comparaciones no me afecte, para facilitarme
; el trabajo uso 2 registros, 1 para A y otro para B
MOVF PORTA, W
MOVWF VAL1 ; VAL1 = x:A
MOVF PORTB, W
MOVWF VAL2 ; VAL2 = x:B
MOVLW 0x0F
ANDWF VAL1, F ; VAL1 = A (Elimino cualquier cosa de los 4 bits superiores)
ANDWF VAL2, F ; VAL2 = B (Elimino cualquier cosa de los 4 bits superiores)
; Comienzo la comparacion
; ¿Pares? Ambos bits 0 deben ser 0
MOVF VAL1, W
IORWF VAL2, W ; VAL1 OR VAL2
ANDLW 0x01 ; Dejo unicamente el bit 0
BTFSC STATUS, Z ; Pregunto si todo W es 0, si lo es entonces son pares
GOTO SONPARES
BCF LEDROJO
IGUAL:
MOVF VAL1, W
SUBWF VAL2, W
BTFSC STATUS,Z
GOTO IGUALES
BTFSC STATUS,C
GOTO VAL2MAYOR
MOVLW 'A' ; Cambiar por el valor que encienda una A
;Aca actualizar puerto con display
GOTO START
IGUALES:
MOVLW 'E' ; Cambiar por el valor que encienda una E
;Aca actualizar puerto con display
GOTO START
VAL2MAYOR:
MOVLW 'B' ; Cambiar por el valor que encienda una B
;Aca actualizar puerto con display
GOTO START
SONPARES:
BSF LEDROJO
GOTO IGUAL
No lo probé.... Pero la idea es la siguiente:
Uso 2 registros para guardar el valor de PORTA, se toma una única ves, lo que menos queres es que entre medio de preguntas de PORTA te cambie algún valor, tal ves en este caso no sea algo que cambie tu panorama, pero en otros si.
Entonces uso los registros VAL1 y VAL2, luego de hacerles una AND y dejar únicamente los 4 bits de menos peso en cada uno, tengo separado cual es A y cual es B.
Solo resta empezar la comparación. Uno podría pensar que podría usar la resta para ver si son pares los números. Pero ocurre que si se cumple que es par cuando restamos 2 números pares, pero también es par cuando restamos dos números impares. Por lo tanto no es útil... Lo que hice fue usar una OR, de esa forma si el bit 0 de alguno de los 2 (A o B ) es 1, este bit quedaría en 1... Luego la AND 0x01 me deja únicamente el bit ese y los demás en 0, si el bit 0 ya ERA cero (ambos pares) entonces W queda igual a 0 y activa el flag Z.
Queda observar que en este caso el cero se considera par que no es correcto.
Finalmente pasamos a la comparación de los 2 valores. Con una resta tal y cual lo hiciste.
Primeros verificamos igualdad, segundo si es mayor y como ultima opcion si no se cumple ninguno es obviamente menor.
En cada caso puse un MOVLW con una letra, deberás cambiarlo por el valor binario con los segmentos correctos que deben encenderse.
Como es un solo display, el micro es MUY rápido, entonces no es necesario manejar el ánodo del display. Simplemente manejar que mostrar.
Otro tema es que tal ves sea mejor agregar un pequeño retardo al programa, que la lectura del puerto de entrada no sea tan rapido. Supongamos cada 100ms.
Y tambien agregue codigo para que el puerto B se pueda usar como digital, cambiando el registro ADCON1, ya que inicialmente todos los pines estan como entradas analogicas.