mire rapidamente el codigo aunque me marie de tantos comments entre otras cosas.
Voy a hacer un codigo rapido para que entiendas lo que digo.
org 0x00
NOP
NOP
GOTO configuracion
org 0x04
GOTO interrupcion
configuracion:
; Aca configuro todo (puertos, timers, inicializo todas las variables a 00 o el valor que tengan, cargo valor de timer y activo interrupciones al ultimo )
GOTO main
;******COMIENZO DE INTERRUPCION********
interrupcion:
;guardo contexto
BTFSC PIR1,RCIF ; Pregunto por si llego algo en la UART
GOTO int_uart
BTFSS INTCON,TMR0IF ; Pregunto si la interrupcion fue del timer
GOTO salir_int ; Aca podria seguir agregando por eso pregunte arriba, y puse el GOTO, sino no hacia flata pregunta si era lo unico 2 que estaba activo
DECF CONTADOR_DISPLAYS ;Implemento contador por si es muy corta la interrupcion y para hacerla mas larga ( es decir contar la cantidad de interrupciones )
BTFSS STATUS,Z
GOTO salir_int
BSF FLAG,1 ; mi flag al pasar X veces por aca habilitando que se muestre
MOVLW 0xXX ; Recargo mi temporizador
MOVWF TMR0
MOVLW 0xXX ; Recargo mi contador
MOVWF CONTADOR_DISPLAYS
BCF INTCON,TMR0IF
GOTO salir_int
int_uart
BSF FLAG,0 ; mi flag de que llego algo por la UART
MOVF RCREG ; Limpio el buffer de lectura
MOVF RCREG ; Limpio el buffer de lectura
MOVF RCREG ; Limpio el buffer de lectura, 3 por que es posible tener 2 en la FIFO + 1 en el shift register, al vaciar la FIFO se pone a 0 RCIF
salir_int
;devuelvo el contexto
RETFIE
;******FIN DE INTERRUPCION********
;******COMIENZO DE PROGRAMA PRINCIPAL********
main:
CALL tomar_datos
CALL enviar
CALL mostrar_displays
CALL animacion
GOTO main
mostrar_displays
BTFSC FLAG,2 ; Con este indico que display estoy mostrando, si esta en 1 significa que es mi 2do display
Goto Display2
Display1:
BTFSC FLAG,1 ; Espero hasta que pase el tiempo se ejecute la interrupcion y me habilite la flag sino sigo saliendo
RETURN
BCF PORTB,catodo2
MOVF dato_decenas
MOVWF PORTB ; Aca supongo que todo lo demas que no es dato esta en 0
BSF PORTB,catodo1
BSF FLAG,2 ; Activo el flag para que pase al otro display ( 2 )
BCF FLAG,1 ; Desactivo el flag del timer
RETURN
Display2:
BTFSC FLAG,1
RETURN
BCF PORTB,catodo1
MOVF dato_unidades
MOVWF PORTB ; Aca supongo que todo lo demas que no es dato esta en 0
BSF PORTB,catodo2
BCF FLAG,2 ; Activo el flag para que pase al otro display ( 1 )
BCF FLAG,1 ; Desactivo el flag del timer
RETURN
animacion:
BTFSS FLAG,0
RETURN
;Aca parecido nomas que deberia contar un poco mas ya que el otro delay es mas corto o directamente aplicar la interrupcion a este.Y el otro no hacerle un "delay"
BCF FLAG,0
RETURN
tomar_datos:
MOVF PORTA ;supongo que esta en el porta el dato en el nibble bajo
ANDLW 0x0F
MOVWF DATO_A_ENVIAR
;paso a BCD, codigo q pase antes
ANDLW 0x0F
MOVWF UNIDADES
SWAPF DATO_A_ENVIAR,W
ANDLW 0x0F
MOVWF DECENAS
RETURN
enviar:
BTFSS PIR1,TXIF
RETURN
;Aca me fijo si es de 0 a 9 asi le sumo 0x30 ('0') o si es una A a F asi le sumo una 'A' a DATO_A_ENVIAR
MOVWF TXREG ;Cargo el valor asi se envia
RETURN
Lamentablemente creo que lo termine haciendo casi todo yo.. nuevamente e.e
Tendrias que hacer 2 partes de codigo y listo, tenes terminado tu programa, al menos es de la forma que lo encararia yo, seguro que otro tiene otra perspectiva diferente y mejor.