1. Control de un teclado matricial En esta práctica se genera el

Transcripción

1. Control de un teclado matricial En esta práctica se genera el
LSP: Teclado matricial
1. Control de un teclado matricial
En esta práctica se genera el código adecuado para poder utilizar un teclado matricial. El
programa debe convertir cada pulsación sobre el teclado, en un carácter ASCII que
identifique la tecla. El carácter se puede enviar a la utilidad Uviterm del PC, o bien a la
pantalla LCD.
1.1. Características funcionales de la interfaz teclado-sistema
En el desarrollo de la interfaz es necesario tener en cuenta que:
a) El usuario no pulsará varias teclas simultáneamente.
b) Las teclas pueden generar varios impulsos tanto al pulsar como al soltar (rebotes
durante t < 100 ms, p. ej.).
El usuario pulsa la tecla así
t
Pero se genera ésto (por ejemplo)
t
NOTA: '0' = contacto cerrado
c) El usuario teclea lo bastante lento como para poder detectar las pulsaciones mediante
consulta.
d) El sistema es capaz de
1
2
3
4
5
6
que se generan (no se
necesita un buffer de
7
8
9
teclado).
*
0
#
atender a los mensajes de
pulsación a la velocidad en
+5V
A
Fila A
1
Fila B
1
Fila C
1
Fila D
B
C
D
1
e) Para el conexionado del
teclado se utilizará el puerto
P5 del micro, con las
asignaciones de bits que se
indican en la figura.
P5.3 P5.2 P5.1 P5.0
Col 1 Col 2 Col 3 Col 4
1
P5.7
P5.6
P5.5
P5.4
LSP: Teclado matricial
1.2. Diagrama de bloques de la interfaz
El programa de control del teclado se basa en dos rutinas que se describen a continuación:
EXPLORACION
DEL TECLADO
TECLADO
kb_in
kb_scan
MÁQUINA DE
ESTADOS
ANTI-REBOTES
kb_out
kb_reb
a) Rutina de exploración. Activa (pone a ‘0’) secuencialmente las salidas P5.7 a P5.4
(filas A a D) y lee las entradas P5.3 a P5.0 (columnas 1 a 4). Actualiza la variable kb_in
con el valor:
a) Si no hay ninguna tecla pulsada, kb_in = 0.
b) Si hay alguna tecla pulsada, kb_in = ASCII de la tecla.
b) Rutina antirrebotes. A partir de la variable kb_in, que puede contener rebotes,
actualiza la variable kb_out libre de rebotes. Se realiza mediante una máquina de estados.
En la página siguiente se muestra el diagrama de flujo de la rutina de exploración.
2
LSP: Teclado matricial
Diagrama de flujo de la rutina de exploración
kbscan
Mascara=
01111111b
Para activar
la fila A
(P5.7)
P5= mascara
¿Nibble
bajo de P5
= 1111 ?
Ya se
encontró una
tecla pulsada
no
kbin = nº tecla
Ninguna
tecla pulsada
de esta fila
si
kbin = ascii tecla
Rotar la
máscara a la
derecha
no
return
¿máscara=
11110111b
?
si
kbin = 0
mascara
return
3
Número
de 0 a 15
Mediante
consulta a una
tabla
LSP: Teclado matricial
El diagrama de estados de la máquina anti-rebotes es el siguiente:
EL ESTADO INICIAL ES E0
kb_out = 0 (*)
E0
alarma temp.
kb_in != 0
kb_out = kb_in
arranca temp.
E1
E3
alarma temp.
kb_out = 0 (*)
arranca temp.
kb_in = 0
E2
(*) Se puede dejar sin poner a 0, para que sea
la rutina que utilice kb_out quien lo borre
La máquina de estados se realiza mediante una subrutina que comprueba el valor de una
variable (estado) y según su valor realiza las operaciones adecuadas (p. ej. actualizar
salidas) y determina si se ha de producir la transición a un nuevo estado.
En la página 5 se indica el diagrama de secuencia de operaciones de una máquina de
estados genérica.
Además, esta máquina de estados utiliza un temporizador. En la página 6 se muestra la
forma de obtener un conjunto de temporizadores SW basados e un tiemporizador HW.
4
LSP: Teclado matricial
Implementación de una máquina de estados.
maq_est
estado = 0
?
si
Se acaba de
cambiar a este si
estado ?
no
no
estado = 1
?
actualizar
salidas,etc.
si
una estructura
equivalente
no
no
Hay que
cambiar a otro
estado ?
si
estado = nuevo
cambio = si
estado = n
?
no
estado = 0
idem
seguro por si
entra en un
estado no válido
RET
5
LSP: Teclado matricial
Para realizar el temporizador se debe programar
un temporizador software (SW)
utilizando un único temporizador hardware (HW), p. ej. T1.
De forma general, para crear temporizadores SW se debe programar un temporizador HW
para que genere interrupciones periódicas, p. ej. cada milisegundo o cada centésima de
segundo. La rutina de atención a la interrupción de dicho temporizador HW gestiona los
temporizadores SW necesarios.
En la figura siguiente se representa el diagrama de secuencia de operaciones de una rutina
de atención a un temporizador HW (ISR_temp) programado en modo de auto-recarga que
genera un conjunto de temporizadores SW descendentes.
ISR_temp
temp. 1 está
activo ?
si
decrementar
temp. 1
temp. 1 = 0
?
no
temp. 2 está
activo ?
si
activar alarma
desactivar temp.
no
si
una estructura
equivalente
si
idem
no
temp. m está
activo ?
no
RET
RETI
Si el temporizador HW no utiliza un modo con auto-recarga, la recarga debe hacerse por
software al entrar en la rutina (ISR_temp).
Para arrancar el temporizador SW, se debe realizar la siguiente secuencia:
- Cargar el valor que corresponda al tiempo a medir.
- Borrar una posible alarma anterior.
Activar el temporizador.
Para comprobar si ya ha transcurrido el tiempo programado, se consulta la alarma.
6
LSP: Teclado matricial
Estructura general del programa de control del teclado
a) Inicializaciones de variables: Temporizadores SW inactivos, etc.
b) Inicializaciones de periféricos: Modo de temporizadores HW, interrupciones que se
habilitan, etc.
c) Bucle en el que se llama a las diferentes rutinas utilizadas de forma cíclica.
Por ejemplo:
#include “io517.h”;
/* utilizar “#define” para asignar valores a símbolos (por ejemplo #define led P3.5) */
/* declarar variables globales y prototipos de funciones */
main(){
/* declarar variables locales */
/* inicializar variables globales */
while(1){
kb_scan();
kb_reb();
send_key();
}
}
/* definir contenidos de las funciones, incluidas las funciones de interrupción */
La función send_key() podría enviar el ascii de la tecla pulsada al puerto serie o a la
pantalla LCD.
Para enviar el ascii al puerto serie (de forma que lo reciba el terminal del PC) se deben
inhibir las interrupciones del puerto serie (o todas) con objeto de no interferir con el
programa monitor de la placa Altair. Por ejemplo:
EA= 0;
TI= 0;
SBUF= kbout;
while(TI= =0);
TI= 0;
EA= 1;
7
LSP: Teclado matricial
Además, pueden utilizarse interrupciones para atender otras tareas urgentes. En general,
se procurará que las interrupciones realicen solamente la parte esencial de la respuesta.
Pueden dejar un aviso (mensaje) para que una rutina del bucle principal realice el resto
del trabajo.
VER TAMBIÉN DOCUMENTO “Uvi51Ce.pdf”
8

Documentos relacionados