Está en la página 1de 27

Captulo 4

Control de un teclado matricial


El teclado matricial proporciona una interfaz sencilla de entrada de datos. Sus usos
pueden ser tan variados como aplicaciones que precisen de la introduccin manual de
datos puedan ocurrrsele al diseador. Desde una calculadora, pasando por una
cerradura codificada, un termostato programable, etc.

4.1 Descripcin
En el mercado es habitual encontrar teclados matriciales pasivos de 3 x 4 y de 4 x 4
teclas. Esencialmente estn constituidos por filas y columnas conductoras en cuyo cruce
se encuentra un pulsador mecnico o de membrana que, al ser pulsado, establece el
contacto elctrico entre la fila y la columna correspondiente.

Figura 1 Esquema tpico de un teclado matricial de 4 filas y 4 columnas (cedido por Elena Muoz Salinero y Olga Cristina
Santos Martn-Moreno)

Para su conexin al microcontrolador se deben colocar unas resistencias de pull-up en


las filas (o las columnas). De esta forma si se pone a masa (cero lgico) una columna
(fila) se obtendr un cero en la fila (columna) correspondiente cuando se pulse una
tecla.

Al pulsar pueden producirse rebotes mecnicos e interpretarlos como varias repeticiones


de la misma tecla. Para evitarlo basta con esperar un tiempo superior a la duracin de
los mismos antes de seguir leyendo datos del teclado.
Este tiempo debe ser ajustado por el alumno de tal forma que ni se detecten pulsaciones
falsas ni resulte lento el manejo del teclado. El ajuste se puede realizar a tanto alzado,
aumentando la espera hasta que desaparezca el fenmeno de repeticin o bien de modo
ms preciso midiendo los transitorios con rebotes y su duracin con un osciloscopio
digital con captura sensible a flancos (como los disponibles en el laboratorio B-043).

4.2 Algoritmo de reconocimiento de teclas


Para conocer la tecla pulsada se puede seguir un algoritmo como el descrito a
continuacin:
REPETIR
Excitar una columna.
Retardo (necesario si hay optoacopladores)
Leer las filas.
Si no hay tecla pulsada pasar a la siguiente columna.
HASTA QUE SE PULSE UNA TECLA
Esperar un tiempo mayor que la duracin de los rebotes.
REPETIR
Leer la fila
HASTA QUE SE SUELTE LA TECLA
Determinar la tecla pulsada a partir de la fila y la

columna.

En el caso de que los puertos lleven optoacopladores es necesario introducir un retardo


que asegure la propagacin de la seal, debido a la lentitud de los mismos.

4.3 Conexin al microcontrolador MC68331


Para conectar al microcontrolador un teclado de 4 x 4 teclas se necesitan ocho puntos de
conexin (pins), cuatro de salida y otros cuatro de entrada. Con las salidas se excitan las
columnas (filas) y con las entradas se leen las filas (columnas). El microcontrolador
MC68331 ofrece una amplia variedad de posibilidades de conexin, cuya eleccin
depender del diseo en cuestin.

En los ejemplos que se muestran a continuacin se ha optado por usar como salidas los
cuatro primeros bits del puerto C (PC0-PC3) para excitar las columnas y como entradas
los cuatro primeros del puerto E (PE0-PE3) para leer las filas, sin que exista una razn
que haga de sta una eleccin mejor que otra.

4.4 Rutina bsica de atencin al teclado


A continuacin se muestra el cdigo en ensamblador para el micro Motorola MC68331.
La rutina tiene por nombre TECLA_LEER y usa una subrutina llamada
TECLA_SOLTAR:
************************** TECLA_SOLTAR ***************************
* Permanece en un bucle mientras sigue pulsada la tecla indicada

* en D5 y sale cuando se suelta.

*******************************************************************
TECLA_SOLTAR
MOVE.L

#REBOTES_MATAR,D1

BSR DELAY

* Duracin del transitorio que aparece al


* pulsar una tecla. (REBOTES_MATAR = 4)

SIGUE_PULSADA
BTST.B

D3,PORTE

* Se lee el puerto E

BEQ.S

SIGUE_PULSADA

* Si son iguales SIGUE PULSADA la tecla

RTS

**************************** TECLA_LEER ***************************


* Esta rutina rastrea las filas y columnas del teclado en busca

* de una tecla pulsada. Utiliza los registros D1 a D4 para su uso *


* interno y devuelve el nmero correspondiente a la tecla pulsada.*
*******************************************************************
TECLA_LEER
MOVEM.L

D1-D4,-(A7)

* Se salva en la pila los registros a usar.

CLR.B

D0

* D0 almacena el valor de la tecla pulsada.

MOVE.L

#3,D1

* D1 es el contador de columnas.

MOVE.B

#$0E,D4

* D4 es usado como registro auxiliar.

MOVE.B

D4,PORTC

* Pone el Puerto C el valor 0000 1110

MOVE.L

#3,D2

* D2 es el contador de filas

MOVE.B

#0,D3

* D3 guarda el nmero de bit a comprobar

D3,PORTE

* Comprueba el bit de la fila

COLUMNA

FILA
BTST.B

BEQ

TECLA

* Salta si encontr la tecla pulsada

ADDQ.B

#1,D0

* Siguiente tecla

ADDQ.B

#1,D3

* Siguiente fila

DBF

D2,FILA

* Decrementa el contador de filas y salta a la


* siguiente

ORI.B

#$10,CCR

* Pone a 1 el bit de eXtensin del CCR

ROXL.B

#1,D4

* Siguiente columna

ANDI.B

#$0F,D4

* Elimina los cuatro bits ms significativos

DBF

D1,COLUMNA

* Decrementa el contador de columnas y salta a la


* siguiente

MOVE.B

#$FF,D0

BRA

FIN

* Devuelve $FF si no hay tecla pulsada

TECLA
BSR

TECLA_SOLTAR

* Salta a subrutina TECLA_SOLTAR

(A7)+,D1-D4

* Restaura los registros desde la pila

FIN
MOVEM.L
RTE

4.5 Anexo Ejemplos de uso del teclado


4.5.1 Ejemplo 1 Programa bsico de atencin al teclado
El programa listado a continuacin utiliza la rutina bsica de atencin al teclado para
dejar en el registro D2 del micro el cdigo ASCII de la tecla pulsada.
******************************************************************************
*

REGISTROS SIM

******************************************************************************
SIMCR

EQU $FFFA00

* Controla la configuracin del sistema ($00CF).

SYNCR

EQU $FFFA04

* Fija frecuencia y modo de operacin del reloj ($3F08).

RSR

EQU $FFFA06

* Guarda la causa de un reset (Ej.-$80, reset hardware).

PORTE

EQU $FFFA11

* Registro de lectura y escritura en el puerto E.

PORTE1 EQU $FFFA13

* Tiene exactamente la misma funcin que el anterior.

DDRE

EQU $FFFA15

* Determina el sentido del puerto E pin a pin.

PEPAR

EQU $FFFA17

* Asignacin del puerto E (Puerto o control de BUS).

PORTF

EQU $FFFA19

* Registro de lectura y escritura en el puerto F.

PORTF1 EQU $FFFA1B

* Tiene exactamente la misma funcin que el anterior.

DDRF

EQU $FFFA1D

* Determina el sentido del puerto F pin a pin.

PFPAR

EQU $FFFA1F

* Asignacin del puerto F (Puerto F o control de BUS).

PICR

EQU $FFFA22

* Configuracin de interrupciones peridicas ($000F).

PITR

EQU $FFFA24

* Contiene la cuenta del timer peridico ($0000).

SYPCR

EQU $FFFA21

* Controla las funciones de monitorizacin del sistema


* como es el caso del Watchdog. ($40 anula watchdog).

SWSR

EQU $FFFA27

* Se debe escribir peridicamente si Watchdog activado.

CSPAR0 EQU $FFFA44

* Sirve junto con CSPAR1 para configurar la funcin de

CSPAR1 EQU $FFFA46

* los pins de Chip Select (CS, Port C, etc.).

PORTC

* Registro de escritura en el puerto C.

EQU $FFFA41

******************************************************************************
*

REGISTROS GPT-PWM

******************************************************************************
GPTMCR

EQU $FFF900

* Configuracin del GPT.

ICR

EQU $FFF904

* Configuracin de interrupciones del GPT.

DDRGP

EQU $FFF906

* Determina el sentido del puerto GP.

PORTGP

EQU $FFF907

* Registro de lectura y escritura del puerto GP.

OC1M

EQU $FFF908

* Mscara para asignar los pin de captura de OC.

OC1D

EQU $FFF909

* Registro de datos a comparar con el puerto OC.

TCNT

EQU $FFF90A

* Registro del GPT asociado a las capturas IC, OC y PAI.

PACTL

EQU $FFF90C

* Configuracin del acumulador de pulsos PAI.

PACNT

EQU $FFF90D

* Es el contador de registro de eventos del PAI.

TIC1

EQU $FFF90E

* Capturan el TCNT cuando se registra un evento en IC1.

TIC2

EQU $FFF910

* Capturan el TCNT cuando se registra un evento en IC2.

TIC3

EQU $FFF912

* Capturan el TCNT cuando se registra un evento en IC3.

TOC1

EQU $FFF914

* Cuando coincide con TCNT causa eventos en los pin OC.

TOC2

EQU $FFF916

* Si el valor coincide con TCNT causa un evento en OC2.

TOC3

EQU $FFF918

* Si el valor coincide con TCNT causa un evento en OC3.

TOC4

EQU $FFF91A

* Si el valor coincide con TCNT causa un evento en OC4.

TI4O5

EQU $FFF91C

* Pin compartido (Puede realizar una funcin TIC o TOC).

TCTL1

EQU $FFF91E

* Configura el modo de comparacin y nivel de salida.

TCTL2

EQU $FFF91F

* Configura que flanco provoca la captura en los IC.

TMSK1

EQU $FFF920

* Habilita las interrupciones de IC y OC.

TMSK2

EQU $FFF921

* Habilita las interrupciones del PAI y del TIMER.

TFLG1

EQU $FFF922

* Registro de flags de interrupciones de IC y OC.

TFLG2

EQU $FFF923

* Registro de flags de interrupciones del PAI y TIMER

CFORC

EQU $FFF924

* Fuerza una salida en los pin OC y PWM.

PWMC

EQU $FFF925

* Configuracin del PWM.

PWMA

EQU $FFF926

* Determina el ancho de pulso. ($80 es medio ciclo)

PWMB

EQU $FFF927

* Determina el ancho de pulso. ($80 es medio ciclo)

PWMCNT

EQU $FFF928

* Registro del contador del PWM.

PWMBUFA EQU $FFF92A

* Buffer para prevenir glitches cuando modificamos PWMA.

PWMBUFB EQU $FFF92B

* Buffer para prevenir glitches cuando modificamos PWMB.

PRESCL

* Guarda el valor del multiplicador del GPT.

EQU $FFF92C

******************************************************************************
*

TIPOS DE RETARDO

******************************************************************************
CORTO

EQU $0400

* Del orden de 100us.

MEDIO

EQU $2800

* Del orden de 1ms.

LARGO

EQU $C800

* Del orden de 5ms.

RETARDO

EQU $FFFF

* Se usa para el avance de caracteres.

REBOTES_MATAR

EQU $0004

* Tiempo necesario para matar los transito* rios que se producen al pulsar una tecla.

******************************************************************************
*

VECTORES DEL RESET

******************************************************************************
ORG $0
PILA_RESET DC.L FIN_PILA
PC_RESET DC.L PRINCIPAL

******************************************************************************
*

VECTORES DE INTERRUPCIN

******************************************************************************
ORG $80
VECTOR0

DC.L

TECLA_LEER

******************************************************************************
*

PUNTERO DE PILA

******************************************************************************
ORG $4000
PILA DS.L 200
FIN_PILA:

******************************************************************************
*

LISTA DE TECLAS

******************************************************************************
ORG $2000

TECLAS DC.B

$41,$30,$42,$43,$37,$38,$39,$44,$34,$35,$36,$45,$31,$32,$33,$46

******************************************************************************
*

SUBRUTINAS

******************************************************************************
ORG $1000

******************************************************************************
*

CONFIGURACION DEL HARDWARE DEL MICRO

******************************************************************************
*************************** INHAB_WDOG ****************************
* Inhabilita el Watchdog que es una funcin de monitorizacin del *
* sistema para detectar la entrada en un bucle infinito.

*******************************************************************
INHAB_WDOG:
MOVE.B #$40,SYPCR

* Inhabilitamos WatchDog

RTS
*----------------------------------------------------------------------------*

************************** PORT_EC_CFG ****************************


* Con esta rutina se configuran los puertos E y C que son los que *
* se usan para controlar el teclado.

*******************************************************************
PORT_EC_CFG
MOVE.B

#$F0,DDRE

* PE0..PE3 entradas, PE4..PE7 salidas.

MOVE.B

#$00,PEPAR

* Configura el registro de control del puerto E.

MOVE.B

#$00,CSPAR0

* PC0-PC2 utilizables.

MOVE.W

#$0000,CSPAR1

* PC3-PC6 utilizables.

MOVE.B

#$00,PORTE

MOVE.B

#$0F,PORTC

RTS
*----------------------------------------------------------------------------*

******************************************************************************
*

SUBRUTINAS DE TECLADO

******************************************************************************
************************** TECLA_SOLTAR ***************************
* Permanece en un bucle mientras sigue pulsada la tecla indicada

* en D5 y sale cuando se suelta.

*******************************************************************
TECLA_SOLTAR
MOVE.L

D1,-(A7)

MOVE.L

#REBOTES_MATAR,D1

BSR DELAY

* Duracin del transitorio que aparece al


* pulsar una tecla.

SIGUE_PULSADA
BTST.B

D3,PORTE

* Se lee el puerto E

BEQ.S

SIGUE_PULSADA

* Si son iguales SIGUE PULSADA la tecla

MOVE.L

(A7)+,D1

RTS

******************************************************************************
*

RUTINAS DE CONTROL

******************************************************************************
***************************** DELAY *******************************
* Produce un retardo cuya duracin viene determinada por el valor *
* almacenado en el registro D1.

*******************************************************************
DELAY
SUB.L

#1,D1

BNE DELAY
RTS

******************************************************************************
*

SERVICIOS DE DISPOSITIVOS

******************************************************************************
******************************************************************************
*

SERVICIOS DE TECLADO

******************************************************************************
**************************** TECLA_LEER ***************************
* Esta rutina rastrea las filas y columnas del teclado en busca

* de una tecla pulsada. Utiliza los registros D6 y D7 para su uso *


* interno y devuelve el cdigo ASCII de la tecla a travs de D0.

*******************************************************************
TECLA_LEER
MOVEM.L

D1-D4,-(A7) * Se salva en la pila los registros que se van a usar

CLR.B

D0

* D0 almacena el valor de la tecla pulsada

MOVE.L

#3,D1

* D1 es el contador de columnas

MOVE.B

#$0E,D4

* D4 es usado como registro auxiliar

COLUMNA
MOVE.B

D4,PORTC

* Pone el Puerto C el valor 0000 1110

MOVE.L

#3,D2

* D2 es el contador de filas

MOVE.B

#0,D3

* D3 guarda el nmero de bit a comprobar

BTST.B

D3,PORTE

* Comprueba el bit de la fila

BEQ

TECLA

* Salta si encontr la tecla pulsada

ADDQ.B

#1,D0

* Siguiente tecla

ADDQ.B

#1,D3

* Siguiente fila

DBF

D2,FILA

* Decrementa fila y salta a la siguiente

ORI.B

#$10,CCR

* Pone a 1 el bit eXtensin del CCR

ROXL.B

#1,D4

* Siguiente columna

ANDI.B

#$0F,D4

* Elimina los cuatro bits ms significativos

DBF

D1,COLUMNA

* Decrementa columna y salta a la siguiente

FILA

MOVE.B
BRA

#$FF,D0
FIN

TECLA
BSR

TECLA_SOLTAR

FIN
MOVEM.L

(A7)+,D1-D4

* Restaura los registros desde la pila

RTE

******************************************************************************
*

PRINCIPAL

******************************************************************************
ORG $400
PRINCIPAL
BSR

INHAB_WDOG

BSR

PORT_EC_CFG

BUCLE
MOVE

#LARGO,D1

BSR

DELAY

CLR.L

D0

TRAP #0
MOVE.B

D0,D6

BRA BUCLE
END

4.5.2 Ejemplo 2 Uso combinado con un display LCD


Este ejemplo combina el uso del teclado con el de un display LCD. En el display
aparecer un rtulo indicativo de la tecla pulsada. Para ello utiliza una serie de rutinas
de control de un display LCD que podrn ser consultadas en las Notas sobre el control
de un display LCD.
******************************************************************************
*

REGISTROS SIM

******************************************************************************
SIMCR

EQU $FFFA00

* Controla la configuracin del sistema ($00CF).

SYNCR

EQU $FFFA04

* Fija frecuencia y modo de operacin del reloj ($3F08).

RSR

EQU $FFFA06

* Guarda la causa de un reset (Ej.-$80, reset hardware).

PORTE

EQU $FFFA11

* Registro de lectura y escritura en el puerto E.

PORTE1 EQU $FFFA13

* Tiene exactamente la misma funcin que el anterior.

DDRE

EQU $FFFA15

* Determina el sentido del puerto E pin a pin.

PEPAR

EQU $FFFA17

* Asignacin del puerto E (Puerto o control de BUS).

PORTF

EQU $FFFA19

* Registro de lectura y escritura en el puerto F.

PORTF1 EQU $FFFA1B

* Tiene exactamente la misma funcin que el anterior.

DDRF

EQU $FFFA1D

* Determina el sentido del puerto F pin a pin.

PFPAR

EQU $FFFA1F

* Asignacin del puerto F (Puerto F o control de BUS).

PICR

EQU $FFFA22

* Configuracin de interrupciones peridicas ($000F).

PITR

EQU $FFFA24

* Contiene la cuenta del timer peridico ($0000).

SYPCR

EQU $FFFA21

* Controla las funciones de monitorizacin del sistema


* como es el caso del Watchdog. ($40 anula watchdog).

SWSR

EQU $FFFA27

* Se debe escribir peridicamente con Watchdog activado.

CSPAR0 EQU $FFFA44

* Sirve junto con CSPAR1 para configurar la funcin de

CSPAR1 EQU $FFFA46

* los pins de Chip Select (CS, Port C, etc.).

PORTC

* Registro de escritura en el puerto C.

EQU $FFFA41

******************************************************************************
*

REGISTROS GPT-PWM

******************************************************************************
GPTMCR

EQU $FFF900

* Configuracin del GPT.

ICR

EQU $FFF904

* Configuracin de interrupciones del GPT.

DDRGP

EQU $FFF906

* Determina el sentido del puerto GP.

PORTGP

EQU $FFF907

* Registro de lectura y escritura del puerto GP.

OC1M

EQU $FFF908

* Mscara para asignar los pin de captura de OC.

OC1D

EQU $FFF909

* Registro de datos a comparar con el puerto OC.

10

TCNT

EQU $FFF90A

* Registro del GPT asociado a las capturas IC, OC y PAI.

PACTL

EQU $FFF90C

* Configuracin del acumulador de pulsos PAI.

PACNT

EQU $FFF90D

* Es el contador de registro de eventos del PAI.

TIC1

EQU $FFF90E

* Capturan el TCNT cuando se registra un evento en IC1.

TIC2

EQU $FFF910

* Capturan el TCNT cuando se registra un evento en IC2.

TIC3

EQU $FFF912

* Capturan el TCNT cuando se registra un evento en IC3.

TOC1

EQU $FFF914

* Cuando coincide con TCNT causa eventos en los pin OC.

TOC2

EQU $FFF916

* Si el valor coincide con TCNT causa un evento en OC2.

TOC3

EQU $FFF918

* Si el valor coincide con TCNT causa un evento en OC3.

TOC4

EQU $FFF91A

* Si el valor coincide con TCNT causa un evento en OC4.

TI4O5

EQU $FFF91C

* Pin compartido (Puede realizar una funcin TIC o TOC).

TCTL1

EQU $FFF91E

* Configura el modo de comparacin y nivel de salida.

TCTL2

EQU $FFF91F

* Configura que flanco provoca la captura en los IC.

TMSK1

EQU $FFF920

* Habilita las interrupciones de IC y OC.

TMSK2

EQU $FFF921

* Habilita las interrupciones del PAI y del TIMER.

TFLG1

EQU $FFF922

* Registro de flags de interrupciones de IC y OC.

TFLG2

EQU $FFF923

* Registro de flags de interrupciones del PAI y TIMER

CFORC

EQU $FFF924

* Fuerza una salida en los pin OC y PWM.

PWMC

EQU $FFF925

* Configuracin del PWM.

PWMA

EQU $FFF926

* Determina el ancho de pulso. ($80 es medio ciclo)

PWMB

EQU $FFF927

* Determina el ancho de pulso. ($80 es medio ciclo)

PWMCNT

EQU $FFF928

* Registro del contador del PWM.

PWMBUFA EQU $FFF92A

* Buffer para prevenir glitches cuando modificamos PWMA.

PWMBUFB EQU $FFF92B

* Buffer para prevenir glitches cuando modificamos PWMB.

PRESCL

* Guarda el valor del multiplicador del GPT.

EQU $FFF92C

******************************************************************************
*

TIPOS DE RETARDO

******************************************************************************
CORTO

EQU $0400

* Del orden de 100us.

MEDIO

EQU $2800

* Del orden de 1ms.

LARGO

EQU $C800

* Del orden de 5ms.

RETARDO

EQU $FFFF

* Se usa para el avance de caracteres.

REBOTES_MATAR

EQU $0004

* Duracin del transitorio de la tecla.

******************************************************************************
*

CONSTANTES DE INTERS

******************************************************************************
INI_DR

EQU $00

* Inicio de lnea nica de caracteres.

11

FIN_DR

EQU $4F

* Fin lnea nica de caracteres.

L1_INI_DR

EQU $00

* Inicio de la primera lnea.

L1_FIN_DR

EQU $27

* Fin de la primera lnea.

L2_INI_DR

EQU $40

* Inicio de la segunda lnea.

L2_FIN_DR

EQU $67

* Fin de la segunda lnea.

LCD_LONG

EQU $0F

* Longitud de la pantalla del LCD.

******************************************************************************
*

PUERTOS DEL DISPLAY

******************************************************************************
BYTE_DATA

EQU PORTE

* Puerto de datos.

BYTE_CONTROL EQU PORTC

* Puerto de control.

BIT_ENABLE

* Se usa para controlar el proceso de comunicacin.

EQU 4

* con el controlador del display.


BIT_RS

EQU 5

* Seleccin del tipo de registro al que se escribe:


* 0 - Registro de Instrucciones (IR).
* 1 - Registro de Datos (DR).

BIT_RW

EQU 6

* Cambio entre los modos de lectura y escritura.

FLAG

EQU 7

* Posicin del flag de datos en el puerto.

******************************************************************************
*

VECTORES DEL RESET

******************************************************************************
ORG $0
PILA_RESET DC.L FIN_PILA
PC_RESET DC.L PRINCIPAL

******************************************************************************
*

VECTORES DE INTERRUPCIN

******************************************************************************
ORG $80
VECTOR0

DC.L

DRIVER_SERVICIOS

******************************************************************************
*

PUNTERO DE PILA

******************************************************************************
ORG $4000
PILA DS.L 200
FIN_PILA:

12

******************************************************************************
*

LISTA DE MENSAJES

******************************************************************************
ORG $2000
MENSAJES
DC.L
MENS1,MENS2,MENS3,MENS4,MENS5,MENS6,MENS7,MENS8,MENS9,MENS10,MENS11,MENS12,MEN
S13,MENS14,MENS15,MENS16
MENS1

DC.B

'TECLA C', $00

MENS2

DC.B

'TECLA B', $00

MENS3

DC.B

'CERO', $00

MENS4

DC.B

'TECLA A', $00

MENS5

DC.B

'TECLA D', $00

MENS6

DC.B

'NUEVE', $00

MENS7

DC.B

'OCHO', $00

MENS8

DC.B

'SIETE', $00

MENS9

DC.B

'TECLA E', $00

MENS10

DC.B

'SEIS',$00

MENS11

DC.B

'CINCO',$00

MENS12

DC.B

'CUATRO',$00

MENS13

DC.B

'TECLA F',$00

MENS14

DC.B

'TRES',$00

MENS15

DC.B

'DOS',$00

MENS16

DC.B

'UNO',$00

******************************************************************************
*

SUBRUTINAS

******************************************************************************
ORG $1000

******************************************************************************
*

CONFIGURACION DEL HARDWARE DEL MICRO

******************************************************************************
*************************** INHAB_WDOG ****************************
* Inhabilita el Watchdog que es una funcin de monitoriracin del *
* sistema para detectar la entrada en un bucle infinito.

*******************************************************************
INHAB_WDOG:
MOVE.B #$40,SYPCR

* Inhabilitamos WatchDog

RTS

13

************************** PORT_EC_CFG ****************************


* Con esta rutina se configuran los puertos E y C que son los que *
* se usan para controlar el display y el teclado.

*******************************************************************
PORT_EC_CFG
MOVE.B

#$FF,DDRE

* PE0..PE7 salidas.

MOVE.B

#$00,PEPAR

* Configura el registro de control del puerto E.

MOVE.B

#$00,CSPAR0

* PC0-PC2 utilizables.

MOVE.W

#$0000,CSPAR1

* PC3-PC6 utilizables.

MOVE.B

#$00,PORTE

MOVE.B

#$0F,PORTC

RTS
*----------------------------------------------------------------------------*

************************* CAMB_TECLADO ****************************


* Con esta rutina se cambia la configuracin del puerto E para

* que los cuatro primeros bits funcionen como entrada y poder

* rastrear las columnas de la matriz del teclado.

*******************************************************************
CAMB_TECLADO
MOVE.B

#$F0,DDRE

* PE0..PE3 entradas, PE4..PE7 salidas.

RTS
*----------------------------------------------------------------------------*

************************* CAMB_DISPLAY ****************************


* Con esta rutina se devuelve al puerto E a su estado inicial con *
* todos los bits de salida para poder enviar datos al display.

*******************************************************************
CAMB_DISPLAY
MOVE.B

#$FF,DDRE

* PE0..PE7 salidas.

RTS

******************************************************************************
*

RUTINAS DE CONTROL

******************************************************************************
***************************** DELAY *******************************
* Produce un retardo cuya duracin viene determinada por el valor *
* almacenado en el registro D1.

*******************************************************************

14

DELAY
SUB.L #1,D1
BNE DELAY
RTS
*----------------------------------------------------------------------------*

************************* FLAG_ESPERAR ****************************


* Espera a que se baje el flag de ocupado.

*******************************************************************
FLAG_ESPERAR
MOVE.B #$7F,DDRE
BSET.B #BIT_RW,BYTE_CONTROL
BSET.B #BIT_ENABLE,BYTE_CONTROL
OCUPADO
BTST.B #FLAG,BYTE_DATA
BNE OCUPADO
BCLR.B

#BIT_ENABLE,BYTE_CONTROL

BCLR.B

#BIT_RW,BYTE_CONTROL

MOVE.B #$FF,DDRE
RTS
*----------------------------------------------------------------------------*

*************************** ENABLE_LCD ****************************


* Provoca la ejecucin de la instruccin, generando un pulso de

* duracin determinada en la lnea Enable del LCD.

*******************************************************************
ENABLE_LCD
BSET.B #BIT_ENABLE,BYTE_CONTROL
BCLR.B #BIT_ENABLE,BYTE_CONTROL
RTS
*----------------------------------------------------------------------------*

******************************************************************************
*

SUBRUTINAS DEL LCD (INSTRUCCIONES)

******************************************************************************
************************** CFG_DISPLAY ****************************
* Configura el modo de funcionamiento del display. Bsicamente se *
* reduce a tres aspectos:

1 - Comunicacin con el display con 8 o 4 bits.

15

2 - 1 o 2 lneas en pantalla.

3 - Dos tipos de fuentes 5x8 o bien 5x10 puntos.

* Suprimiendo el asterisco correspondiente se puede modificar la

* opcin seleccionada por defecto.

*******************************************************************
CFG_DISPLAY
BSR FLAG_ESPERAR
MOVE.B #$30,BYTE_DATA

* Modo 8 bits, una lnea, fuentes 5x8 puntos.

BCLR.B #4,BYTE_DATA

* Modo 4 bits.

BSET.B #3,BYTE_DATA

* Habilita 2 lneas.

BSET.B #2,BYTE_DATA

* Fuentes de 5x10 puntos.

BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
*************************** MODO_AVC ******************************
* El cursor avanza cuando se escribe un carcter en el registro

* DR. El display permanece esttico.

*******************************************************************
MODO_AVC
BSR FLAG_ESPERAR
MOVE.B #$06,BYTE_DATA * Cursor adelante, display no acompaa.
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
*************************** MODO_AVT ******************************
* El cursor y el display avanzan solidariamente cuando se escribe *
* un carcter en el registro DR.

*******************************************************************
MODO_AVT
BSR FLAG_ESPERAR
MOVE.B #$07,BYTE_DATA * Cursor adelante, display acompaa.
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*

*************************** MODO_RTC ******************************


* El cursor retrocede cuando se escribe un carcter en el regis-

* tro DR. El display permanece esttico.

*******************************************************************

16

MODO_RTC
BSR FLAG_ESPERAR
MOVE.B #$04,BYTE_DATA * Cursor atrs, display no acompaa.
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*

*************************** MODO_RTT ******************************


* El cursor y el display retroceden solidariamente cuando se es-

* cribe un carcter en el registro DR.

*******************************************************************
MODO_RTT
BSR FLAG_ESPERAR
MOVE.B #$05,BYTE_DATA * Cursor atrs, display acompaa.
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*

************************** MODO_NORMAL ****************************


* Se configura el modo del display. Por defecto estar n tanto el

* display como el cursor encendidos y sin parpadear el carcter

* donde se encuentra el cursor.

*******************************************************************
MODO_NORMAL
BSR FLAG_ESPERAR
MOVE.B #$0E,BYTE_DATA

* Display y Cursor ON, blinkin OFF

BCLR.B #2,BYTE_DATA

* Display OFF

BCLR.B #1,BYTE_DATA

* Cursor OFF

BSET.B #0,BYTE_DATA

* Blinking ON

BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*

**************************** MODO_OFF *****************************


* Produce el apagado de la pantalla del LCD. Se puede seguir en-

* viando ordenes al display que sern ejecutadas. La nica dife-

* rencia es que no aparece reflejado hasta que no se enciende de

* el LCD.

*******************************************************************

17

MODO_OFF
BSR FLAG_ESPERAR
MOVE.B #$08,BYTE_DATA

* Display y Cursor ON, blinkin OFF

BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*

***************************** CLEAR *******************************


* Borra el contenido del display y sita el cursor a la izquierda *
*******************************************************************
CLEAR
BSR FLAG_ESPERAR
MOVE.B #$01,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*

************************** RETURN_HOME *****************************


* Devuelve el cursor a la primera posicin conservando el conteni- *
* de la memoria del display.

********************************************************************
RETURN_HOME
BSR FLAG_ESPERAR
MOVE.B #$02,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*

*************************** CURS_IZQ ******************************


* Mueve el cursor a la izquierda sin modificar el texto.

*******************************************************************
CURS_IZQ
BSR FLAG_ESPERAR
MOVE.B #$10,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*

18

*************************** CURS_DCHA *****************************


* Mueve el cursor a la derecha sin modificar el texto.

*******************************************************************
CURS_DCHA
BSR FLAG_ESPERAR
MOVE.B #$14,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*

*************************** DISP_IZQ ******************************


* Desplaza la ventana del display hacia la izquierda.

*******************************************************************
DISP_IZQ
BSR FLAG_ESPERAR
MOVE.B #$1C,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*

*************************** DISP_DCHA *****************************


* Desplaza la ventana del display hacia la derecha.

*******************************************************************
DISP_DCHA
BSR FLAG_ESPERAR
MOVE.B #$18,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*

************************** CGRAM_ADDR *****************************


* Coloca la direccin indicada en D0 en el contador de la Memoria *
* del Generador de Caracteres (CGRAM). Este generador permite de- *
* finir 8 caracteres de usuario en el modo 5x8 y cuatro en el de

* 5x10 puntos. Para un correcto uso de la instruccin deberemos

* escribir una de las 64 direcciones posibles (de $00 a $3F)en D0 *


*******************************************************************

19

CGRAM_ADDR
BSR FLAG_ESPERAR
ADD.B #$40,D0
MOVE.B D0,BYTE_DATA
BSET.B #BIT_RS,BYTE_CONTROL
BSR ENABLE_LCD
BCLR.B #BIT_RS,BYTE_CONTROL
RTS
*----------------------------------------------------------------------------*

************************** DDRAM_ADDR *****************************


* Coloca la direccin indicada en D0 en el contador de la Memoria *
* de Datos del Display (DDRAM). Existen 80 posiciones disponibles *
* que ser n consecutivas cuando el display trabaje en una nica

* lnea o repartidas en dos grupos de 40 cuando trabaje en el

* modo de dos lneas.

* Vase detalle a continuacin:

- 80 posiciones x 1 lnea

- las direcciones van de $0 a $4F. *

- 40 posiciones x 2 lneas - las direcciones se reparten:

Lnea primera: de $00 a $27.

Lnea segunda: de $40 a $67.

*******************************************************************
DDRAM_ADDR
BSR FLAG_ESPERAR
ADD.B #$80,D0
MOVE.B D0,BYTE_DATA
BSET.B #BIT_RS,BYTE_CONTROL
BSR ENABLE_LCD
BCLR.B #BIT_RS,BYTE_CONTROL
RTS
*----------------------------------------------------------------------------*

*************************** ESCRIBIR ******************************


* Esta instruccin permite escribir en el registro de datos (DR)

* una palabra que puede ir destinada a la memoria del generador

* de caracteres (CGRAM) o a la de datos del display (DDRAM) de-

* pendiendo de cual fu la ultima seleccin. El dato a escribir

* lo pondremos en el registro D0.

*******************************************************************

20

ESCRIBIR
BSR FLAG_ESPERAR
MOVE.B D0,BYTE_DATA
BSET.B #BIT_RS,BYTE_CONTROL
BSR ENABLE_LCD
BCLR.B #BIT_RS,BYTE_CONTROL
RTS

******************************************************************************
*

SUBRUTINAS DE TECLADO

******************************************************************************
************************** TECLA_SOLTAR ***************************
* Permanece en un bucle mientras sigue pulsada la tecla indicada

* en D5 y sale cuando se suelta.

*******************************************************************
TECLA_SOLTAR
MOVE.L

#REBOTES_MATAR,D1

BSR DELAY

* Duracin del transitorio que aparece al


* pulsar una tecla.

SIGUE_PULSADA
BTST.B

D3,PORTE

* Se lee el puerto E

BEQ.S

SIGUE_PULSADA

* Si son iguales SIGUE PULSADA la tecla

RTS

******************************************************************************
*

RUTINAS DE INICIALIZACIN DE DISPOSITIVOS

******************************************************************************
**************************** INI_LCD ******************************
* Esta rutina realiza toda la inicializacin del display tras el

* encendido del mismo. Despus de su ejecucin el display queda

* preparado para recibir ordenes y caracteres.

*******************************************************************
INI_LCD:
BSR CFG_DISPLAY
BSR MODO_NORMAL
BSR CLEAR
RTS
******************************************************************************
*

SERVICIOS DE DISPOSITIVOS

******************************************************************************

21

******************************************************************************
*

SERVICIOS DEL DISPLAY

******************************************************************************
************************** ESCR_MENSAJE ***************************
* Esta rutina escribe un mensaje completo en el display en el

* sentido natural de escritura cuya direccin de inicio se la pa- *


* samos a travs del registro A0. El smbolo con que deber

ter-

* minarse el mensaje es $00. Si el mensaje es superior a los 16

* caracteres que tiene el LCD, al alcanzar el final de la lnea

* automticamente se cambia del modo AVC al AVT en el que el dis- *


* play acompaa al cursor dando la sensacin de que el texto se

* desplaza.

*******************************************************************
ESCR_MENSAJE
BSR RETURN_HOME
BSR MODO_AVC
MOVE.B #LCD_LONG,D1

* Cuenta los caracteres escritos en el display.

BUCLE1
TST.B (A0)
BEQ FIN1
MOVE.B (A0)+,D0
BSR ESCRIBIR
SUB.B #1,D1
BEQ FIN_LIN1
BRA BUCLE1
FIN_LIN1
BSR MODO_AVT

* Cambia al modo AVT para que el display acompae al cursor.

BRA BUCLE1
FIN1
RTS
*----------------------------------------------------------------------------*

*************************** DSP_ADELANTE **************************


* Esta rutina desplaza hacia la derecha la pantalla del display

* recorriendo las 80 posiciones del registro DDRAM.

*******************************************************************
DSP_ADELANTE
MOVE.B #FIN_DR,D0

* Cuenta los caracteres escritos en el display.

BUCLE2

22

BSR DISP_DCHA
MOVE.L #RETARDO,D1
BSR DELAY
SUB.B #1,D0
BNE BUCLE2
RTS
*----------------------------------------------------------------------------*

**************************** DSP_ATRAS ****************************


* Esta rutina desplaza hacia la izquierda la pantalla del display *
* recorriendo las 80 posiciones del registro DDRAM.

*******************************************************************
DSP_ATRAS
MOVE.B #FIN_DR,D0

* Cuenta los caracteres escritos en el display.

BUCLE3
BSR DISP_IZQ
MOVE.L #RETARDO,D1
BSR DELAY
SUB.B #1,D0
BNE BUCLE3
RTE
*----------------------------------------------------------------------------*

******************************************************************************
*

SERVICIOS DE TECLADO

******************************************************************************
**************************** TECLA_LEER ***************************
* Esta rutina rastrea las filas y columnas del teclado en busca

* de una tecla pulsada. Utiliza los registros D6 y D7 para su uso *


* interno y devuelve el cdigo ASCII de la tecla a travs de D0.

*******************************************************************
TECLA_LEER
MOVEM.L

D1-D4,-(A7) * Se salva en la pila los registros que se van a usar

CLR.B

D0

* D0 almacena el valor de la tecla pulsada

MOVE.L

#3,D1

* D1 es el contador de columnas

MOVE.B

#$0E,D4

* D4 es usado como registro auxiliar

MOVE.B

D4,PORTC

* Pone el Puerto C el valor 0000 1110

MOVE.L

#3,D2

* D2 es el contador de filas

COLUMNA

23

MOVE.B

#0,D3

* D3 guarda el nmero de bit a comprobar

BTST.B

D3,PORTE

* Comprueba el bit de la fila

BEQ

TECLA

* Salta si encontr la tecla pulsada

ADDQ.B

#1,D0

* Siguiente tecla

ADDQ.B

#1,D3

* Siguiente fila

DBF

D2,FILA

* Decrementa el contador de filas y salta a la

FILA

* siguiente
ORI.B

#$10,CCR

* Pone a 1 el bit extensin del CCR

ROXL.B

#1,D4

* Siguiente columna

ANDI.B

#$0F,D4

* Elimina los cuatro bits ms significativos

DBF

D1,COLUMNA

* Decrementa el contador de columnas y salta a la


* siguiente,

MOVE.B
BRA

#$FF,D0
FIN_T

TECLA
BSR

TECLA_SOLTAR

FIN_T
MOVEM.L

(A7)+,D1-D4 * Restaura los registros desde la pila

RTS
*----------------------------------------------------------------------------*

************************* DRIVER_SERVICIOS ************************


* Esta rutina realiza el servicio indicado a travs del registro

* D7 con un nmero ordinal. Para llamar a la rutina de servicio

* se coloca el nmero de servicio en el registro D7 y se ejecuta

* un TRAP #0.

*******************************************************************
DRIVER_SERVICIOS
CMP.B #1,D7
BEQ

SERVICIO1

CMP.B #2,D7
BEQ

SERVICIO2

CMP.B #3,D7
BEQ

SERVICIO3

CMP.B #4,D7
BEQ

SERVICIO4

BRA

FIN

SERVICIO1

24

BSR

ESCR_MENSAJE

BRA

FIN

SERVICIO2
BSR

DSP_ADELANTE

BRA

FIN

SERVICIO3
BSR

DSP_ATRAS

BRA

FIN

SERVICIO4
BSR

TECLA_LEER

FIN
RTE
*----------------------------------------------------------------------------*

******************************************************************************
*

PRINCIPAL

******************************************************************************
ORG $400
PRINCIPAL
MOVE.W

#MENSAJES,A6

BSR

INHAB_WDOG

BSR

PORT_EC_CFG

BSR

INI_LCD

BSR

RETURN_HOME

BSR

MODO_AVC

MOVE.B

#LCD_LONG,D3

* Cuenta los caracteres escritos en el display.

BUCLE
CLR.L

D0

BSR

CAMB_TECLADO

MOVE.L

#4,D7

TRAP

#0

CMP.B

#$FF,D0

BEQ

BUCLE

MULU

#4,D0

MOVE.L

(A6,D0.L),A0

BSR

CAMB_DISPLAY

BSR

CLEAR

MOVE.L

#1,D7

TRAP

#0

25

SUB.B

#1,D3

BEQ

FIN_LIN

BRA BUCLE
FIN_LIN
BSR MODO_AVT

* Cambia al modo AVT para que el display acompae al cursor.

BRA BUCLE
END

26

NDICE DE CONTENIDO
4.1 DESCRIPCIN.....................................................................................................................................1
4.2 ALGORITMO DE RECONOCIMIENTO DE TECLAS..................................................................2
4.3 CONEXIN AL MICROCONTROLADOR MC68331....................................................................2
4.4 RUTINA BSICA DE ATENCIN AL TECLADO.........................................................................3
4.5 ANEXO EJEMPLOS DE USO DEL TECLADO............................................................................4
4.5.1 EJEMPLO 1 PROGRAMA BSICO DE ATENCIN AL TECLADO.........................................................4
4.5.2 EJEMPLO 2 USO COMBINADO CON UN DISPLAY LCD..................................................................10