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