Práctica 1: Manejo de los periféricos
Objetivo
Diseñar un programa en ensamblador en el que al pulsar el switch situado más a la derecha se muestre en el display de 8 segmentos los números del 7 al 0. Al volver a pulsar el switch se iluminará, en todos y cada uno de los displays, el segmento central.
El resultado que se deberá observar en la ventana de hardware del simulador será el de las imagenes:
El funcionamiento del display de 7 segmentos es muy sencillo, los valores que se asignaran a cada display de la maqueta serán en función de lo que se quiera mostrar en el display y en las direcciones de memoria correspondientes (en la captura anterior se puede observar que comienzan en la E00000) mostradas en la tabla a continuación.
DISPLAY |
DIRECCIÓN |
1 |
E000000 |
3 |
E000004 |
4 |
E000006 |
5 |
E000008 |
6 |
E00000A |
7 |
E00000C |
8 |
E00000E |
Para el desarrollo de la práctica es muy recomendable definir como variable de programa un vector denominado tabla que contenga la codificación de los dígitos del 0 al 9.
tabla dc.b $3F,$06,$5B,$4F,$66, $6D,$7D,$27,$7F,$67 |
Nota sobre la implementación: Para poder visualizar y gestionar la ventana hardware es necesario generar una excepción (trap) que lo permita. El código que permite hacer estas tareas es:
Trap para obtener la dirección hardware y visualización de la ventana hardware move.b #32,d0 MOVE.B #0,D1 TRAP #15 Almacena la dirección del display en D1 move.b #01,d1 trap #15 Almacena la dirección de los leds en D1 move.b #02,d1 trap #15 Almacena la dirección de los switch en D1 move.b #03,d1 trap #15 |
El estado de los switch y de los leds, se almacena en la dirección de memoria que tienen asociada. Así, p.e., si el contenido de la dirección E00012 es %00100000 indicará que todos los interruptores a excepción del 5 están apagados.
Solución
El código de la solución será el siguiente:
*----------------------------------------------------------- * * Versión : 1.0 * Escrito por : Vidal Maté Barbero * Fecha : 27 - 4 - 2006 * Descripción : Manejo de los periféricos * *----------------------------------------------------------- START ORG $1000 jmp inicio * * Constantes y variables * * Guardo la tabla con los valores (en hexadecimal), para mostrar más tarde en los displays tabla dc.b $3F,$06,$5B,$4F,$66,$6D,$7D,$27,$7F,$67 * * Programa principal * inicio move.b #32,d0 Cojo la dirección del hardware move.b #0,d1 trap #15 Muestro la ventana de hardware move.l #$E0000E, a1 Guardo la dirección del display en un registro para poder incrementarla sobre la marcha lea tabla,a0 Pone el primer valor de la tabla en el registro de direcciones 0 move.b #0,d2 Muevo el contador de iteraciones del bucle al registro 2 move.b #8,d3 Muevo el número tope de iteraciones del bucle al registro 3 salto1 move.l #$E00012,a3 Pongo la dirección de los switches en el registro de direcciones 3 move.b #1,d5 Pongo el estado 01 en el registro 5 para comparar cmp.b (a3),d5 Comparación: determina si los switches están a 01 beq bucle1 Si la comparación es cierta pasamos a rellenar con 876543210 jmp salto1 Si no, ejecutamos de nuevo el bucle salto2 move.l #$E00012,a3 Pongo la dirección de los switches en el registro de direcciones 3 move.b #0,d5 Pongo el estado 00 en el registro 5 para comparar cmp.b (a3),d5 Comparación: determina si los switches están a 00 beq prebuc2 Si la comparación es cierta pasamos a rellenar con -------- jmp salto2 Si no, ejecutamos de nuevo el bucle bucle1 move.b (a0),d4 Coloco en d4 al valor correspondiente de la tabla move.b d4,(a1) Coloco el valor adecuado en el contenido del registro a1 sub.l #2,a1 Paso al siguiente display disminuyendo la posición de mem a la que apunta a1 add #1,a0 Paso a la siguiente posición de memoria en a0 (siguiente valor de la tabla) add #1,d2 Añado una unidad al contador cmp.w d2,d3 Comprobación de continuación del bucle bgt.b bucle1 Bucle del programa, si se alcanza el valor límite, pasará a la siguiente instrucción jmp salto2 Pasa a la espera de que se pulse de nuevo el switch prebuc2 move.b #0,d2 Muevo el contador de iteraciones del bucle al registro 2 move.b #8,d3 Muevo el número tope de iteraciones del bucle al registro 3 move.l #$E0000E, a1 Guardo la dirección del display en un registro para poder incrementarla sobre la marcha bucle2 move.b #$40,d4 Coloco en d4 al valor correspondiente (para poner un guión) move.b d4,(a1) Coloco el valor adecuado en el contenido del registro a1 sub.l #2,a1 Paso al siguiente display disminuyendo la posición de mem a la que apunta a1 add #1,d2 Añado una unidad al contador cmp.w d2,d3 Comprobación de continuación del bucle bgt.b bucle2 Bucle del programa, si se alcanza el valor límite, pasará a las instrucciones de parada fin MOVE.B #9,d0 TRAP #15 Parada del simulador END START |