Está en la página 1de 5

EJERCICIO SIMULACIÓN

1.

Se desea adaptar un teclado hexadecimal al puerto A de una VIA. Los pines PA7-
4generan los códigos de exploración, mientras que, por los pines PA3-0, se recibirán
los códigos de la tecla pulsada. Supóngase que la línea CA1 recibe un flanco cada vez
que se detecta la pulsación de una tecla.

1) Configure el TIMER1 de la VIA para que genere una interrupción cada 1ms teniendo
en cuenta que la frecuencia de reloj de la misma es de 1Mhz.

2) Suponiendo que las peticiones de interrupción del TIMER1 de la VIA generan


excepciones de nivel

3) Modifica la rutina de excepción anterior para que el microprocesador sea capaz,


también, de recibir el código de la tecla pulsada y la transforme a un código decima

4) realice la rutina de excepción que permita generar la secuencia de exploración del


teclado. Esto es, cada vez que se invoca dicha rutina, se deberá activar una nueva
columna del teclado.
Respuesta:
Básicamente, un teclado hexadecimal es una estructura matricial de pulsadores
formada por cuatro filas y cuatro columnas.

Ahora bien, las filas se conectan al puerto de entrada de algún dispositivo tipo VIA y
sobre las que se han situado resistencias de “pull-up” que producen “1's” cuando no
hay ningún pulsador presionado. Las cuatro columnas se conectan a un puerto de
salida de algún dispositivo tipo VIA y sobre las que hay que generar una secuencia de
exploración periódica en la que, alternativamente, cada columna va disponer de un 0
lógico mientras que las restantes estarán a 1 lógico.

La pulsación de una tecla se reconoce cuando existe algún 0 en una fila. Atendiendo
a la fila que recoge el 0 y a la posición del 0 en la secuencia de exploración, se
determina la tecla pulsada.

1) Para generar interrupciones cada 1ms se requiere configurar el T1 en modo aestable


(ACR[7:6] = 01)y cargar un valor igual a N = 1ms/1μs = 1000. Además, se deberá
habilitar la generación de interrupciones en el IER (escribir $C0).

conf_timer: ORI.B #$40,ACR ; Modo aestable y salida desactivada

MOVE.W #1000,D0

MOVE.B D0,T1CL

LSR.W #8,D0

MOVE.B D0,T1CH ; Carga 1000 en los latches y en el contador

MOVE.B $C0,IER ; Habilita la generación de interrupciones por parte del


T1

RTS

2) Se supone que las columnas A1,A2,A3 y A4 se han conectado a los pines PA7:4
respectivamente, y que los pines B4:1 se han conectado a los pines PA3:0. La
configuración de estos pines requiere escribir $F0 en DDRA. Se utilizará una variable
ref, para generar la secuencia de exploración. Dicha variable se inicializa a 01110111
en binario y su contenido se rota en cada ejecución de la rutina de excepción. El
autovector 2 ocupa la dirección $68 de la memoria principal.

ORG $68

DC.L int

ORG $1000

Ref: DC.B $77

Main: MOVE.B $F0,DDRA

Int: MOVE.B TICL,D0 ;Borra el flag de interrupción

ROR.B ref

MOVE.B ref, ORA

RTE
3) Como paso previo vamos a proceder a la rutina de excepción, se recuerda que el
puerto A debe haberse configurado como entrada y, por el modo de funcionamiento
descrito, conviene configurar el modo latch que está controlado por el pin CA1.

ORG $68

DC.L int

ORG $1000

Ref: DC.B $77

Main:

ORI.B #1,ACR ;Pone a 1 el bit ACR[0] que activa el modo latch del puerto
Int: MOVE.B TICL,D0 ;Borra el flag de interrupción

MOVE.B IRA,D0 ;Captura la posible entrada

AND.B #$F,D0 ;Borra los bits de la secuencia de exploración

CMP.B #$F,D0 ;Detecto si hay pulsación

BEQ final ;No hay tecla pulsada

BSR convierte_tecla

Final: ROR.B ref

MOVE.B Ref,ORA

RTE

4) La rutina de excepción convierte la tecla, cual puede construirse a partir de una tabla
que contiene los códigos de exploración que se generan para cada tecla pulsada.
Procediendo a una búsqueda en dicha tabla, la posición o el índice de la primera
coincidencia servirá como código hexadecimal. Por ejemplo, si el teclado tiene los
pulsadores que se muestran en la fotografía previa, los códigos de exploración y sus
correspondientes hexadecimales podrían ser:

Tecla Código de exploración (PA7:0) Código hexadecimal


asignado

0 1011 1110 0

1 0111 1101 1

2 1011 1101 2

3 1101 1101 3

4 0111 1011 4

5 1011 1011 5

6 1101 1011 6
7 0111 0111 7

8 1011 0111 8

9 1101 0111 9

Clear 0111 1110 A

Enter 1101 1110 B

Flecha Izquierda 1110 1101 C

Flecha Derecha 1110 1110 D

Flecha Arriba 1110 0111 E

Flecha Abajo 1110 1011 F

tabla_codigos: DC.B $BE,$7D,$BD,....


;códigosdeexploraciónexpresadosenhexadecimal

convierte_tecla: MOVE.B IRA,D0 ; El registro D0 contiene los códigos de


exploració.

MOVEA.L #tabla_codigos,A0

CLR.B D1 ; El registro D1 hace de índice de la tabla

Bucle: CMP.B (A0)+,D0

BEQ final

ADD.B #1,D1

BRA Bucle

Final: RTS

También podría gustarte