Práctica 1: Manejo de los periféricos

<body>.</body>

 

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
2
E000002
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


vidalmb_admin – Mié, 13/06/2007 – 11:37