No le puede quedar 30 por mas que sea ASCII del 0 ( cero ), sino esta mal hecho el programa, y si fuera un numero mayor o igual a 10 (4 llaves 2^4=16 ) necesitaria 4 digitos para representarlo 0x31 0x30 en ASCII. Aparte "magicamente" luego de que recibe un caracter por la USART se pone en 0 las decenas ..... imagino que es en decimal por que si es en hexa no vale la pena hacerlo con 2 displays ya que uno solo alcanzaria.
Sobre el cd4511 te aconsejo que busques el datasheet, en realidad siempre busca el datasheet de los IC e intenta ver que son o como funcionan, es muy simple solo le das el valor en binario ( 4 bits ) y este lo decodifica a 7 segmentos.
No se exactamente que explicarte. El pseudocodigo esta muy simple, tanto que puede llevar 1/2 hasta maximo 4/5 lineas de ASM ( creo que hay 2 lineas de pseudocodigo que te llevaria eso ) por cada linea de pseudocodigo.
Pero hay que diferenciar una cosa. Si lo tenes que hacer fisicamente o en simulacion, si lo haces en fisico entonces vas a necesitar un poco mas de consideracion con los delays y el antirebote, si es simulacion no te preocupes, el unico que necesitarias es el de 0.5s.
Y si lo podes hacer con delays. Asi tal cual lo hizo el .... se nota por como funciona ( deja de enviar datos cuando recibe algo y se pone a hacer la animacion de los ceros ).
¿Que necesitas que te explique?
Para la configuracion de la UART vas a tener que leerte la seccion de UART del datasheet del PIC para ver los registros involucrados de la UART y definir los valores de los registros (Ni calcular hay tablas que te dan el valor a cargar para el baud rate dentro del datasheet )
Tenes que configurar los puertos a digitales y como salidas/entradas segun sea el caso seguro que tenes cerca de 2 registros por puerto.
Listo terminaste la configuracion.
Ahora el programa... que ya te lo pase
en pseudocodigo por supuesto.
No se me ocurre que otras dudas puedas tener. Tenes ya todo ahi, solo es agarrar el datasheet leer los capitulos que necesitas "I/O Ports", "AUSART" la parte de ASYNCHRONOUS y baud rate y "Instruction Set Sumary"
Ademas de saber setear los bits de configuracion, que eso el MPLAB X te lo genera.
Cualquier duda que tengas la explico.. Si esque la se obviamente
Con respecto al programa.. el programa principal se basa en lo siguiente:
Tomar datos
Enviarlos ( si es que no esta trasmitiendo )
Mostrarlos en display
Preguntar si recibiste algo para hacer la animacion
Usando el diagrama de tu profesor
1- Tomar datos:
En esta seccion tomas el dato de PORTA solo el nibble superior, asi que deberias hacer un SWAPF PORTA,W de esa forma cambia el lugar los nibbles y lo almacena en W, luego un ANDLW 0x0F y solo te queda el dato de las llaves. Este dato lo guardas en una variable supongamos A_ENVIAR
Pero necesitas saber si supera el valor 10 en decimal, por lo tanto podrias restarle 10 para saber si es mayor o menor a 10 el numero. si es mayor pones en 1 la variable decenas y el resto en unidades, si no pones a 0 decenas y copias el valor a las unidades
Ya ahi tenes 3 variables:
A_ENVIAR : Este vas a enviar por UART pronto
DECENAS: Valor del digito decenas
UNIDADES: valor digito unidades
2- Enviar datos por UART
Como el programa es mas rapido que el envio de datos pregunto primero si se esta enviando los datos o no. si se estan enviando entonces continuo con lo de mostrar en el display y no molesto a la UART
Listo hora de enviar... Pregunto si las DECENAS esta en 1.. Si estan en 1 significa que el valor es como minimo un A, entonces le sumo a UNIDADES el valor de "A" y lo guardo en W, posteriormente lo mando al buffer de TX.
Si DECENAS esta en 0, simplemente le sumo 30 a UNIDADES guardo en W y de ahi al buffer de TX
Fin
3- Mostrar display
Pongo DECENAS en PORTB
activo el comun de diplay de decenas
Delay ( si vas al fisico )
Pongo UNIDADES en PORTB
Activo el comun de display de unidades
Delay ( si vas al fisico )
Fin
4- Recepecion? :
Al recibir se activa el flag de interrupcion, como no estan activadas simplemente pregunto por ese bit. Si no recibio nada Salgo y vuelvo a comenzar todo de nuevo.
Si recibio algo entonces es hora de hacer la animacion.
Nueva Variable CONTADOR = 5 decimal.
Borro el flag de la recepcion para que no entre aca de nuevo ya que ya se que recibi algo.
Pongo a 0 el PORTB ( asi entra un 0 en el 4511 y este activa las salidas para un 0 en el display )
Vuelta:
Y activo ambos catodos ( ambos reciben el 0 por lo tanto los 2 muestran en 0 )
Delay ( 0.5s )
Apago los catodos
Delay ( 0.5s )
Decremento en 1 a CONTADOR
BTFSS STATUS,Z ( es decir CONTADOR llego a 0 ?, si llego a 0 que salte, sino se ejecuta el GOTO y prende y apaga 10 veces ( 5 * 1s = 5s ) ) Es 1s por que estan los 2 delays el de prendido y el de apagado.
GOTO Vuelta
FIN
Pensa que cada punto es un programita aparte, y el programa principal solo hace CALL a esos programitas, y el FIN vendria a ser un RETURN.
PD: Mas claro no lo podes tener.