Teclado Matricial
Teclado Matricial
Teclado Matricial
Los sistemas con microcontroladores tienen como finalidad el proceso de datos. stos se obtienen de formas muy variadas, puede ser de manera automtica por medio de sensores que midan parmetros fsicos o de manera manual, en cuyo caso tienen que ser suministrados por los usuarios. Para este ltimo caso se pueden usar pulsadores cuando la informacin es muy simple, tal como se ha hecho hasta ahora, o mediante teclados de mayor o menor complejidad. En este captulo estudiaremos los teclados matriciales, que sin duda son los ms utilizados en la realizacin de proyectos con microcontroladores (figura 1-1), y se desarrollarn interesantes aplicaciones con ellos.
TECLADO HEXADECIMAL
Un teclado matricial est constituido por una matriz de pulsadores dispuestos en filas y columnas, figuras 1-2 y 1-3. Su intencin es reducir el nmero de lneas necesarias para su conexionado.
Figura 1-2 Conexin de un teclado matricial Cada tecla se conecta a una fila y a una columna. Las 16 teclas necesitan slo 8 lneas para conectarse con el exterior, en lugar de las 16 lneas que hubieran necesitado las teclas independientes. Cuando una tecla es pulsada, queda en contacto una fila con una columna y, si no hay tecla alguna presionada, las filas estn desconectadas de las columnas.
CONEXIN DE UN TECLADO A UN PIC16F84 La figura 1-4 describe una posible conexin de un teclado hexadecimal a un sistema con microcontrolador PIC16F84A. En la figura 1-4 se destacan los aspectos principales de su conexin: Las filas del teclado se conectan a las lneas de la parte baja del Puerto B configuradas como salida. Las columnas del teclado se conectan a las lneas de la parte alta del Puerto B del PIC16F84A configuradas como entradas.
1-4 Conexin de un teclado matricial hexadecimal a un PIC16F84A Para detectar si hay alguna tecla pulsada se aplica a las filas un nivel bajo y tres altos (figura 1-4). Si se presiona alguna tecla en la fila por la que se aplica el nivel bajo, ese nivel bajo aparecer en la columna correspondiente con la que ha hecho el contacto. En el ejemplo de la figura se pulsa la tecla "3" cuando el microcontrolador explora la fila F 1, este cero aparece en la columna C3, y es ledo por la lnea RB6. Si en una fila no hay pulsada tecla alguna, las entradas se encuentran en estado flotante, razn por la que son necesarias resistencias de Pull-Up. Por ello en la configuracin del PIC16F84A es necesario activar las resistencias internas de Pull-Up para el Puerto B. Leyendo los niveles de los terminales de las columnas conectados a las lneas RB4 a RB7 se podr deducir si hay alguna tecla pulsada en la fila donde est aplicado el nivel bajo. Si no hay pulsada tecla alguna, en todas las columnas se lee un nivel alto. Escribiendo secuencialmente el nivel bajo por cada una de las lneas RBO a RB3 conectadas a las filas y leyendo los niveles en las columnas, se podr determinar la tecla pulsada en su caso. Las resistencias de 330 en serie con las filas tienen como misin evitar cortocircuitos entre las lneas de la parte baja y alta del Puerto B cuando el microcontrolador utilice estas lneas para funciones distintas de la exploracin del teclado. ALGORITMO DE PROGRAMACION La tcnica de programacin usada para explorar este teclado est esquematizada en el diagrama de flujo de la subrutina Teclado-LeeOrdenTecla que lee el orden de la tecla pulsada (figura 1-6). Se entiende como "orden" el nmero que le corresponde a cada tecla leyndola de izquierda a derecha y de arriba hacia abajo, independientemente de la serigrafa dibujada sobre ella, figura 1-5(A). La exploracin del teclado debe deducir el "orden" de la tecla pulsada sin importar lo serigrafiado sobre sta. Cada tecla tiene asignado el nmero de orden indicado en la
figura y que se va contabilizando en la variable Tecl-TeclaOrden. El programa utiliza una tabla de conversin para convertir el orden de la tecla a su valor real para cada tipo de teclado. La figura 1-5 expone la relacin entre el nmero de orden de las teclas y los valores correspondientes para un teclado hexadecimal. As, la tecla '7' ocupa el orden 8, la tecla "F" ocupa el orden 3 y la tecla "9" el orden 10. Si cambia el teclado es necesario cambiar la tabla de conversin. En el diagrama de flujo de la figura 1-6 se aprecia que la exploracin del teclado comienza colocando a "0" la primera fila (lnea RBO del microcontrolador) y las restantes a " 1 ". Se va testeando el estado de cada una de las columnas e incrementando al mismo tiempo el valor de la variable Tecl - TeclaOrden, de manera tal que su valor coincide con el orden de la tecla cuya columna se lee y a cuya fila se aplica un cero. Las columnas son exploradas de forma secuencial, comprobando si hay un '0'. Si no lo encuentra pone a '0' la fila siguiente y la anterior a " 1" comprobando nuevamente las columnas e incrementando el valor de la variable Tecl - TeclaOrden. Si alguna tecla es pulsada, el valor de orden de la tecla es guardado en el registro de trabajo y acaba la exploracin del teclado. El bit de Carry del STATUS se activa a "1" indicando que hay alguna tecla pulsada y a "0" si no ha pulsado tecla alguna. Como conclusin de la tcnica de lectura de un teclado hexadecimal a continuacin se expone una librera de subrutinas para su control.
1-5 Relacin entre el orden de las teclas y la serigrafa de un teclado hexadecimal LIBRERA DE SUBRUTINAS La librera TECLADOS.INC contiene las subrutinas de control del teclado hexadecimal. Para la confeccin de los programas se utilizarn las siguientes subrutinas: "Teclado - Inicializa". Configura las lneas del Puerto B segn la conexin del teclado realizada y comprueba que no hay pulsada tecla alguna al principio. "Teclado - EsperaDejePulsar". Permanece en esta subrutina mientras siga pulsada la tecla. Se utiliza para que no repita la misma lectura varias veces. "Teclado-LeeOrdenTecla". Lee el teclado obteniendo en el registro W el orden de la tecla pulsada. Adems, posiciona el flag Carry para indicar si se ha presionado alguna tecla. "Teclado-LeeHex". Lee un teclado hexadecimal. En el registro de trabajo W aparece el valor hexadecimal de la tecla pulsada. Adems posiciona el flag Carry para indicar si se ha presionado alguna tecla.
;**************************** Librera "TECLADO.INC" ********************************* ; ; ; ; Librera de subrutinas para la gestin de un teclado organizado en una matriz de 4 x 4 y ; conectado al Puerto B segn la disposicin siguiente y explicada en la figura 1-2 ; ; RB4 RB5 RB6 RB7 ; ^ ^ ^ ^ ; |----|----|----|----| ; RB0 --> | 0 | 1 | 2 | 3 | ; |----|----|----|----| ; RB1 --> | 4 | 5 | 6 | 7 | ; |----|----|----|----| ; RB2 --> | 8 | 9 | 10 | 11 | ; |----|----|----|----| ; RB3 --> | 12 | 13 | 14 | 15 | ; |----|----|----|----| ; ; Los nmeros que se han dibujado dentro de cada cuadrado son el orden de las teclas ; que no tienen por qu coincidir con lo serigrafiado sobre ellas. El paso del nmero de ; orden de la tecla al valor que hay serigrafiado sobre la misma se hace con una tabla de ; conversin. ; ; ZONA DE DATOS ********************************************************************** ; CBLOCK Tecl_TeclaOrden ; Orden de la tecla a chequear. ENDC Tecl_UltimaTecla EQU d'15' ; Valor de orden de la ltima tecla utilizada.
; Subrutina "Teclado_LeeHex" ************************************************************ ; ; Cada tecla tiene asignado un nmero de orden que es contabilizado en la variable ; Tecl_TeclaOrden. Para convertir a su valor segn el tipo de teclado en concreto se ; utiliza una tabla de conversin. ; A continuacin se expone la relacin entre el nmero de orden de la tecla y los ; valores correspondientes para el teclado hexadecimal ms utilizado. ; ; ORDEN DE TECLA: TECLADO HEX. UTILIZADO: ; 0 1 2 3 1 2 3 F ; 4 5 6 7 4 5 6 E ; 8 9 10 11 7 8 9 D ; 12 13 14 15 A 0 B C ; ; As, en este ejemplo, la tecla "7" ocupa el orden 8, la tecla "F" ocupa el orden 3 y la ; tecla "9" el orden 10. ; Si cambia el teclado tambin hay cambiar de tabla de conversin. ; ; Entrada: En (W) el orden de la tecla pulsada. ; Salida: En (W) el valor hexadecimal para este teclado concreto. ; Teclado_LeeHex call Teclado_LeeOrdenTecla ; Lee el Orden de la tecla pulsada. btfss STATUS,C ; Pulsa alguna tecla?, C=1? goto Tecl_FinLeeHex ; No, por tanto sale.
call Tecl_ConvierteOrdenEnHex ; Lo convierte en su valor real mediante tabla. bsf STATUS,C ; Vuelve a posicionar el Carry, porque la Tecl_FinLeeHex ; instruccin "addwf PCL,F" lo pone a "0". return ; Tecl_ConvierteOrdenEnHex ; Segn el teclado utilizado resulta: addwf PCL,F DT 1h,2h,3h,0Fh ; Primera fila del teclado. DT 4h,5h,6h,0Eh ; Segunda fila del teclado DT 7h,8h,9h,0Dh ; Tercera fila del teclado. DT 0Ah,0h,0Bh,0Ch ; Cuarta fila del teclado. Teclado_FinTablaHex ; ; Esta tabla se sita al principio de la librera con el propsito de que no supere la ; posicin 0FFh de memoria ROM de programa. De todas formas, en caso que as fuera ; visualizara el siguiente mensaje de error en el proceso de ensamblado: ; IF (Teclado_FinTablaHex > 0xFF) ERROR "Atencin: La tabla ha superado el tamao de la pgina de los" MESSG "primeros 256 bytes de memoria ROM. NO funcionar correctamente." ENDIF ; Subrutina "Teclado_Inicializa" -------------------------------------------------------; ; Esta subrutina configura las lneas del Puerto B segn la conexin del teclado realizada ; y comprueba que no hay pulsada tecla alguna al principio. Teclado_Inicializa bsf STATUS,RP0 ; Configura las lneas del puerto: movlw b'11110000' ; <RB7:RB4> entradas, <RB3:RB0> salidas movwf PORTB bcf OPTION_REG,NOT_RBPU ; Habilita resistencia de Pull-Up del Puerto B. bcf STATUS,RP0 ; Acceso al banco 0. ; call Teclado_EsperaDejePulsar ; return ; ; Subrutina "Teclado_EsperaDejePulsar" -------------------------------------------------; ;Permanece en esta subrutina mientras siga pulsada la tecla. ; Teclado_Comprobacion EQU b'11110000' Teclado_EsperaDejePulsar: movlw Teclado_Comprobacion ; Pone a cero las cuatro lneas de salida del movwf PORTB ; Puerto B. Teclado_SigueEsperando call Retardo_20ms ; Espera a que se estabilicen los niveles de tensin. movf PORTB,W ; Lee el Puerto B. sublw Teclado_Comprobacion ; Si es lo mismo que escribi es que ya no pulsa btfss STATUS,Z ; tecla alguna. goto Teclado_SigueEsperando return ; ; Subrutina "Teclado_LeeOrdenTecla" ----------------------------------------------------; ; Lee el teclado, obteniendo el orden de la tecla pulsada. ; ; Salida: En (W) el nmero de orden de la tecla pulsada. Adems Carry se pone a "1" si ;se pulsa una tecla a "0" si no se pulsa tecla alguna. ;
Teclado_LeeOrdenTecla: clrf Tecl_TeclaOrden ; Todava no ha empezado a chequear el teclado. movlw b'11111110' ; Va a chequear primera fila. Tecl_ChequeaFila ; (Ver esquema de conexin). movwf PORTB ; Activa la fila correspondiente. call Retardo_1ms Tecl_Columna1 btfss PORTB,4 ; Chequea la 1 columna buscando un cero. goto Tecl_GuardaValor ; S, es cero y por tanto guarda su valor y sale. incf Tecl_TeclaOrden,F ; Va a chequear la siguiente tecla. Tecl_Columna2 ; Repite proceso para las siguientes btfss PORTB,5 ; columnas. goto Tecl_GuardaValor incf Tecl_TeclaOrden,F Tecl_Columna3 btfss PORTB,6 goto Tecl_GuardaValor incf Tecl_TeclaOrden,F Tecl_Columna4 btfss PORTB,7 goto Tecl_GuardaValor incf Tecl_TeclaOrden,F ; ; Comprueba si ha chequeado la ltima tecla, en cuyo caso sale. Para ello testea si ; el contenido del registro Tecl_TeclaOrden es igual al nmero de teclas del teclado. ; Tecl_TerminaColumnas movlw Tecl_UltimaTecla subwf Tecl_TeclaOrden,W ; (W) = (Tecl_TeclaOrden)-Tecl_UltimaTecla. btfsc STATUS,C ; C=0?, (W) negativo?, (Tecl_TeclaOrden)<15? goto Tecl_NoPulsada ; No, se ha llegado al final del chequeo. bsf STATUS,C ; S. Va a chequear la siguiente fila. rlf PORTB,W ; Apunta a la siguiente fila. goto Tecl_ChequeaFila Tecl_NoPulsada bcf STATUS,C ; Posiciona C=0, indicando que no ha pulsado goto Tecl_FinTecladoLee ; tecla alguna y sale. Tecl_GuardaValor movf Tecl_TeclaOrden,W ; El orden de la tecla pulsada en (W) y sale. bsf STATUS,C ; Como hay tecla tecla pulsada, pone C=1. Tecl_FinTecladoLee return
Ejemplo de aplicacin
;************************************* Teclado_03.asm ********************************* ; ; El mdulo LCD visualiza el valor hexadecimal de la tecla pulsada. Para la lectura del ; teclado se utiliza la interrupcin RBI o por cambio en las lneas <RB7:RB4> del Puerto B. ; ; ZONA DE DATOS ************************************************************************* LIST INCLUDE __CONFIG P=16F84A <P16F84A.INC> _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C ENDC ; ZONA DE CDIGOS ******************************************************************** ORG goto ORG goto Inicio call call movlw movwf Principal sleep goto LCD_Inicializa Teclado_Inicializa b'10001000' INTCON Principal ; Configura las lneas del teclado. ; Habilita la interrupcin RBI y la general. ; Espera en modo bajo consumo que pulse teclado. 0 Inicio 4 ServicioInterrupcion
; Subrutina "ServicioInterrupcion" -----------------------------------------------------; ServicioInterrupcion call Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada. call LCD_Nibble ; Visualiza el valor en pantalla. call Teclado_EsperaDejePulsar ; Para que no se repita el mismo carcter bcf INTCON,RBIF ; mientras permanece pulsado. Limpia flag. retfie INCLUDE <TECLADO.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END ; Subrutinas de control del teclado.