Micro 8031

Necesito medir frecuencia con el micro 8031, creo tenerlo resuelto.
Excepto por lo siguiente:
Tengo, por ejemplo, que desplegar en tres display de 7 segmentos el numero 100. ¿Cómo lo decodifico y lo muestro en los display?. ( El 100 esta guardado en la memoria del micro, en un registro de 8 bits )
Respuesta
1
El problema que tienes es que guardas la información en binario y necesitas pasarla a BCD.
Programar en asembler:
Supongo que programas al micro en asembler. Lo único que se me ocurre en este momento es crear tres registros como contadores e inicializarlos a 0. Luego vas decrementando el valor de la frecuencia (p.e. 100) y con cada decrementación, incrementas un contador (unidades). Cuando éste llegue a 10 lo pones a cero e incrementas en 1 unidad otro contador (decenas). Lo mismo: cuando este segundo llegue a 10 lo pones a cero e incrementas en una unidad el tercer contador (centenas). El proceso finaliza cuando el valor que decrementas (p.e. 100) llega a 0. Luego tienes tres registros, cada uno con un dígito del valor inicial (p.e. centenas = 1, decenas = 0, unidades = 0). Cada registro ocupará, como mucho, 4 bits (hasta 9). Si quieres displayarlos todos a la vez puedes poner un valor en los 4 bits bajos de un puerto, otro en los 4 bits altos de ese puerto, y el otro valor en otro puerto. (Pero yo te aconsejaría que tuvieses los displays como periféricos y, por tanto, como posiciones de memoria externa, así con un solo puerto bastaría).
Programar en c:
Si programas en C, solo tienes que:
1- Hacer el módulo del valor para encontrar las unidades
2- Dividir el valor entre 10 y coger la parte entera (sin decimales)
3- Hacer el módulo del nuevo valor y tendrás decenas.
2- Dividir de nuevo el valor entre 10 y no coger decimales. El resultado serán las centenas.
El módulo es el resto de dividir dos números. En C, el módulo de 10 y 5 se escribe:
int modulo=0;
modulo=10%5;
Espero haber sido de alguna ayuda. Si tienes cualquier otra duda ya sabes donde encontrarme.
He estado estudiando el databook del 8031 y he visto que en asembler también se puede hacer lo del módulo.
Con la instucción DIV AB divides el número de A entre el de B. En A se queda la parte entera y en B el resto.
El programa quedaría:
Mover a A el 100
Mover a B un 10
Div ab
Mover a Unidades el B
Mover a B un 10
Div ab
Mover a Decenas el B
Mover a Centenas el A
De esta manera queda más simplificado y más rápido. Es lo mismo que se hace con C. Al final consigues tres registros (Centenas, Decenas y Unidades) con el valor de cada cifra decimal.
Supongo que después de mover el B a Unidades o Decenas el A queda modificado. Por eso, antes de mover el B debes salvar el valor de A en un registro temporal (Pero no estoy seguro de eso).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas