Академический Документы
Профессиональный Документы
Культура Документы
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)
columna.
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.
*******************************************************************
TECLA_SOLTAR
MOVE.L
#REBOTES_MATAR,D1
BSR DELAY
SIGUE_PULSADA
BTST.B
D3,PORTE
* Se lee el puerto E
BEQ.S
SIGUE_PULSADA
RTS
D1-D4,-(A7)
CLR.B
D0
MOVE.L
#3,D1
* D1 es el contador de columnas.
MOVE.B
#$0E,D4
MOVE.B
D4,PORTC
MOVE.L
#3,D2
* D2 es el contador de filas
MOVE.B
#0,D3
D3,PORTE
COLUMNA
FILA
BTST.B
BEQ
TECLA
ADDQ.B
#1,D0
* Siguiente tecla
ADDQ.B
#1,D3
* Siguiente fila
DBF
D2,FILA
ORI.B
#$10,CCR
ROXL.B
#1,D4
* Siguiente columna
ANDI.B
#$0F,D4
DBF
D1,COLUMNA
MOVE.B
#$FF,D0
BRA
FIN
TECLA
BSR
TECLA_SOLTAR
(A7)+,D1-D4
FIN
MOVEM.L
RTE
REGISTROS SIM
******************************************************************************
SIMCR
EQU $FFFA00
SYNCR
EQU $FFFA04
RSR
EQU $FFFA06
PORTE
EQU $FFFA11
DDRE
EQU $FFFA15
PEPAR
EQU $FFFA17
PORTF
EQU $FFFA19
DDRF
EQU $FFFA1D
PFPAR
EQU $FFFA1F
PICR
EQU $FFFA22
PITR
EQU $FFFA24
SYPCR
EQU $FFFA21
SWSR
EQU $FFFA27
PORTC
EQU $FFFA41
******************************************************************************
*
REGISTROS GPT-PWM
******************************************************************************
GPTMCR
EQU $FFF900
ICR
EQU $FFF904
DDRGP
EQU $FFF906
PORTGP
EQU $FFF907
OC1M
EQU $FFF908
OC1D
EQU $FFF909
TCNT
EQU $FFF90A
PACTL
EQU $FFF90C
PACNT
EQU $FFF90D
TIC1
EQU $FFF90E
TIC2
EQU $FFF910
TIC3
EQU $FFF912
TOC1
EQU $FFF914
TOC2
EQU $FFF916
TOC3
EQU $FFF918
TOC4
EQU $FFF91A
TI4O5
EQU $FFF91C
TCTL1
EQU $FFF91E
TCTL2
EQU $FFF91F
TMSK1
EQU $FFF920
TMSK2
EQU $FFF921
TFLG1
EQU $FFF922
TFLG2
EQU $FFF923
CFORC
EQU $FFF924
PWMC
EQU $FFF925
PWMA
EQU $FFF926
PWMB
EQU $FFF927
PWMCNT
EQU $FFF928
PRESCL
EQU $FFF92C
******************************************************************************
*
TIPOS DE RETARDO
******************************************************************************
CORTO
EQU $0400
MEDIO
EQU $2800
LARGO
EQU $C800
RETARDO
EQU $FFFF
REBOTES_MATAR
EQU $0004
* Tiempo necesario para matar los transito* rios que se producen al pulsar una tecla.
******************************************************************************
*
******************************************************************************
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
******************************************************************************
*
******************************************************************************
*************************** 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
MOVE.B
#$F0,DDRE
MOVE.B
#$00,PEPAR
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
*******************************************************************
TECLA_SOLTAR
MOVE.L
D1,-(A7)
MOVE.L
#REBOTES_MATAR,D1
BSR DELAY
SIGUE_PULSADA
BTST.B
D3,PORTE
* Se lee el puerto E
BEQ.S
SIGUE_PULSADA
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
*******************************************************************
TECLA_LEER
MOVEM.L
CLR.B
D0
MOVE.L
#3,D1
* D1 es el contador de columnas
MOVE.B
#$0E,D4
COLUMNA
MOVE.B
D4,PORTC
MOVE.L
#3,D2
* D2 es el contador de filas
MOVE.B
#0,D3
BTST.B
D3,PORTE
BEQ
TECLA
ADDQ.B
#1,D0
* Siguiente tecla
ADDQ.B
#1,D3
* Siguiente fila
DBF
D2,FILA
ORI.B
#$10,CCR
ROXL.B
#1,D4
* Siguiente columna
ANDI.B
#$0F,D4
DBF
D1,COLUMNA
FILA
MOVE.B
BRA
#$FF,D0
FIN
TECLA
BSR
TECLA_SOLTAR
FIN
MOVEM.L
(A7)+,D1-D4
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
REGISTROS SIM
******************************************************************************
SIMCR
EQU $FFFA00
SYNCR
EQU $FFFA04
RSR
EQU $FFFA06
PORTE
EQU $FFFA11
DDRE
EQU $FFFA15
PEPAR
EQU $FFFA17
PORTF
EQU $FFFA19
DDRF
EQU $FFFA1D
PFPAR
EQU $FFFA1F
PICR
EQU $FFFA22
PITR
EQU $FFFA24
SYPCR
EQU $FFFA21
SWSR
EQU $FFFA27
PORTC
EQU $FFFA41
******************************************************************************
*
REGISTROS GPT-PWM
******************************************************************************
GPTMCR
EQU $FFF900
ICR
EQU $FFF904
DDRGP
EQU $FFF906
PORTGP
EQU $FFF907
OC1M
EQU $FFF908
OC1D
EQU $FFF909
10
TCNT
EQU $FFF90A
PACTL
EQU $FFF90C
PACNT
EQU $FFF90D
TIC1
EQU $FFF90E
TIC2
EQU $FFF910
TIC3
EQU $FFF912
TOC1
EQU $FFF914
TOC2
EQU $FFF916
TOC3
EQU $FFF918
TOC4
EQU $FFF91A
TI4O5
EQU $FFF91C
TCTL1
EQU $FFF91E
TCTL2
EQU $FFF91F
TMSK1
EQU $FFF920
TMSK2
EQU $FFF921
TFLG1
EQU $FFF922
TFLG2
EQU $FFF923
CFORC
EQU $FFF924
PWMC
EQU $FFF925
PWMA
EQU $FFF926
PWMB
EQU $FFF927
PWMCNT
EQU $FFF928
PRESCL
EQU $FFF92C
******************************************************************************
*
TIPOS DE RETARDO
******************************************************************************
CORTO
EQU $0400
MEDIO
EQU $2800
LARGO
EQU $C800
RETARDO
EQU $FFFF
REBOTES_MATAR
EQU $0004
******************************************************************************
*
CONSTANTES DE INTERS
******************************************************************************
INI_DR
EQU $00
11
FIN_DR
EQU $4F
L1_INI_DR
EQU $00
L1_FIN_DR
EQU $27
L2_INI_DR
EQU $40
L2_FIN_DR
EQU $67
LCD_LONG
EQU $0F
******************************************************************************
*
******************************************************************************
BYTE_DATA
EQU PORTE
* Puerto de datos.
* Puerto de control.
BIT_ENABLE
EQU 4
EQU 5
BIT_RW
EQU 6
FLAG
EQU 7
******************************************************************************
*
******************************************************************************
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
MENS2
DC.B
MENS3
DC.B
'CERO', $00
MENS4
DC.B
MENS5
DC.B
MENS6
DC.B
'NUEVE', $00
MENS7
DC.B
'OCHO', $00
MENS8
DC.B
'SIETE', $00
MENS9
DC.B
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
******************************************************************************
*
******************************************************************************
*************************** 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
MOVE.B
#$FF,DDRE
* PE0..PE7 salidas.
MOVE.B
#$00,PEPAR
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
MOVE.B
#$F0,DDRE
RTS
*----------------------------------------------------------------------------*
*******************************************************************
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
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
BSET.B #BIT_ENABLE,BYTE_CONTROL
BCLR.B #BIT_ENABLE,BYTE_CONTROL
RTS
*----------------------------------------------------------------------------*
******************************************************************************
*
******************************************************************************
************************** CFG_DISPLAY ****************************
* Configura el modo de funcionamiento del display. Bsicamente se *
* reduce a tres aspectos:
15
2 - 1 o 2 lneas en pantalla.
*******************************************************************
CFG_DISPLAY
BSR FLAG_ESPERAR
MOVE.B #$30,BYTE_DATA
BCLR.B #4,BYTE_DATA
* Modo 4 bits.
BSET.B #3,BYTE_DATA
* Habilita 2 lneas.
BSET.B #2,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
*************************** MODO_AVC ******************************
* El cursor avanza cuando se escribe un carcter en el registro
*******************************************************************
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
*----------------------------------------------------------------------------*
*******************************************************************
16
MODO_RTC
BSR FLAG_ESPERAR
MOVE.B #$04,BYTE_DATA * Cursor atrs, display no acompaa.
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
*******************************************************************
MODO_RTT
BSR FLAG_ESPERAR
MOVE.B #$05,BYTE_DATA * Cursor atrs, display acompaa.
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
*******************************************************************
MODO_NORMAL
BSR FLAG_ESPERAR
MOVE.B #$0E,BYTE_DATA
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
*----------------------------------------------------------------------------*
* el LCD.
*******************************************************************
17
MODO_OFF
BSR FLAG_ESPERAR
MOVE.B #$08,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
********************************************************************
RETURN_HOME
BSR FLAG_ESPERAR
MOVE.B #$02,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
*******************************************************************
CURS_IZQ
BSR FLAG_ESPERAR
MOVE.B #$10,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
18
*******************************************************************
CURS_DCHA
BSR FLAG_ESPERAR
MOVE.B #$14,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
*******************************************************************
DISP_IZQ
BSR FLAG_ESPERAR
MOVE.B #$1C,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
*******************************************************************
DISP_DCHA
BSR FLAG_ESPERAR
MOVE.B #$18,BYTE_DATA
BSR ENABLE_LCD
RTS
*----------------------------------------------------------------------------*
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
*----------------------------------------------------------------------------*
- 80 posiciones x 1 lnea
*******************************************************************
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
*----------------------------------------------------------------------------*
*******************************************************************
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
*******************************************************************
TECLA_SOLTAR
MOVE.L
#REBOTES_MATAR,D1
BSR DELAY
SIGUE_PULSADA
BTST.B
D3,PORTE
* Se lee el puerto E
BEQ.S
SIGUE_PULSADA
RTS
******************************************************************************
*
******************************************************************************
**************************** INI_LCD ******************************
* Esta rutina realiza toda la inicializacin del display tras el
*******************************************************************
INI_LCD:
BSR CFG_DISPLAY
BSR MODO_NORMAL
BSR CLEAR
RTS
******************************************************************************
*
SERVICIOS DE DISPOSITIVOS
******************************************************************************
21
******************************************************************************
*
******************************************************************************
************************** ESCR_MENSAJE ***************************
* Esta rutina escribe un mensaje completo en el display en el
ter-
* desplaza.
*******************************************************************
ESCR_MENSAJE
BSR RETURN_HOME
BSR MODO_AVC
MOVE.B #LCD_LONG,D1
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
BRA BUCLE1
FIN1
RTS
*----------------------------------------------------------------------------*
*******************************************************************
DSP_ADELANTE
MOVE.B #FIN_DR,D0
BUCLE2
22
BSR DISP_DCHA
MOVE.L #RETARDO,D1
BSR DELAY
SUB.B #1,D0
BNE BUCLE2
RTS
*----------------------------------------------------------------------------*
*******************************************************************
DSP_ATRAS
MOVE.B #FIN_DR,D0
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
*******************************************************************
TECLA_LEER
MOVEM.L
CLR.B
D0
MOVE.L
#3,D1
* D1 es el contador de columnas
MOVE.B
#$0E,D4
MOVE.B
D4,PORTC
MOVE.L
#3,D2
* D2 es el contador de filas
COLUMNA
23
MOVE.B
#0,D3
BTST.B
D3,PORTE
BEQ
TECLA
ADDQ.B
#1,D0
* Siguiente tecla
ADDQ.B
#1,D3
* Siguiente fila
DBF
D2,FILA
FILA
* siguiente
ORI.B
#$10,CCR
ROXL.B
#1,D4
* Siguiente columna
ANDI.B
#$0F,D4
DBF
D1,COLUMNA
MOVE.B
BRA
#$FF,D0
FIN_T
TECLA
BSR
TECLA_SOLTAR
FIN_T
MOVEM.L
RTS
*----------------------------------------------------------------------------*
* 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
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
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