Curso de Microcontroladores [email protected] 1 TUTORIAL Teclado matricial OBJETIVOS • • Manejar teclados matriciales por el método RWR. Conocer el uso y la utilidad de las Pull-Up del puerto B. INTRODUCCIÓN: El teclado matricial es uno de los dispositivos de entrada de datos más usados en aplicaciones como introducción de claves, números en calculadoras, registradoras, etc. En esta práctica usaremos un teclado matricial conectado en el puerto B cuya lectura realizaremos por medio del metodo RWR, asignaremos ciertas funciones a cada letra (incrementar, decrementar etc) y mostraremos la salida utilizando los display de siete segmentos. CONCEPTOS TEÓRICOS: PULL-UPS DE PUERTO B : Las pull-up de puerto B son unas resistencias que internamente en el microcontrolador conectan cada pin del puerto B con la alimentación positiva, dichas resistencias pueden ser activadas y desactivadas por software. Son controladas por el bit RBPU del registro OPTION_REG el cual con 1 desactiva dichas pull-up y con 0 las activa. Las pull-up de puerto B facilitan la conexión de pulsadores en los pines de dicho puerto, con una configuración de pulsador como la mostrada abajo la resistencia es la pull - up interna del microcontrolador y solo es necesario conectar externamente el pulsador y la tierra. Con esta configuración debe tenerse en cuenta que los pulsadores quedan en lógica negativa (un cero significa presionado). Curso de Microcontroladores [email protected] 1 Curso de Microcontroladores [email protected] 2 DESCRIPCIÓN DEL TECLADO MATRICIAL: Existen varios tipos de teclados matriciales, en nuestro caso usaremos un teclado matricial de 16 teclas organizadas en 4 columnas y 4 filas, este teclado dispone de un conector de 16 pines de los cuales cuatro corresponden a las filas y cuatro a las columnas. El conexionado interno de este teclado es como sigue: Existen diferentes formas de realizar la lectura de estos teclados, una de ellas es conocida como el método RWR el cual será utilizado en esta práctica. Se recomienda consultar otros métodos de lectura del teclado y comparar ventajas y desventajas, hay varios ejemplos en (www.xrobotics.com) El método RWR (Read Write Read, leer escribir leer) consiste en, como su nombre lo indica, en realizar una lectura, luego una escritura, y finalmente otra lectura, lo obtenido en esta lectura permitirá por medio de unos códigos que deben establecerse, obtener el digito presionado por el usuario . Para aplicar el método RWR dividimos el puerto en dos, una parte manejará las columnas y otra parte manejará las filas, el teclado se conecta al puerto B del PIC de tal manera que en las líneas RB4 a RB7 queden los pines que representan las columnas y en las líneas RB0 a RB3 los pines que representan las filas. Curso de Microcontroladores [email protected] 2 Curso de Microcontroladores [email protected] 3 Inicialmente, la parte del puerto que maneja las columnas está como entrada y las filas están como salida entregando un valor lógico bajo, las entradas de las columnas están fijas a un valor alto por medio de resistencias de pull-up, para esto usaremos las pull-up del microcontrolador. El esquema circuital es el siguiente: La secuencia para realizar una lectura por el método RWR sería: 1) Inicialmente, los pines RB4, RB5, RB6 y RB7 leen 1, que se debe a la configuración previa de habilitar las “pull-up”. Esta configuración lo que hace es darle un estado lógico inicial de 1 a los pines del puerto B configurados como entradas. Los pines RB0 – RB3 están configurados como salidas y están enviando un valor lógico 0. 2) El usuario presiona un botón, para ejemplificar supongamos que presionó la tecla 6. 3) El pin RB5 que estaba como entrada lee un 0, que ocurre porque la acción de presionar la tecla cierra el circuito entre RB5 y RB2 y el RB2 recordemos estaba enviando un 0. 4) Se lee el estado del puerto B, que para el ejemplo es: 11010000. El PIC se entera que hemos presionado una tecla ya que ocurre una interrupción por cambio de estado en Puerto B; en el ejemplo vemos que fue el RB5 el pin que cambio de estado (por pull-up estaba en 1 y al presionar la tecla pasó a 0). Curso de Microcontroladores [email protected] 3 Curso de Microcontroladores [email protected] 4 5) Este dato aun no nos dice cual de las 16 teclas fue la presionada, ya que el 11010000 también se da si presionamos las teclas 3, 9 ó #. 6) Se reconfigura el puerto B, esta vez se colocan las líneas RB0 a RB3 como entradas y las RB4 a RB7 como salidas (TRISB=0b00001111) 7) A PORTB le asigno el valor leído, para el ejemplo es PORTB=0b11010000. Como las pull-up siguen habilitadas los pines RB0, RB1, y RB3 leen 1. El pin RB2 lee un 0, ya que la tecla presionada cierra el circuito que conecta a RB2 con RB5, y este RB5 ahora esta enviando 0. 8) Vuelve a leerse el estado del puerto, en el caso del puerto es: 11011011. Este valor si es único y con él se puede identificar por completo la tecla presionada, en este caso el 6. 9) Se reconfigura de nuevo el puerto B como estaba inicialmente para que pueda ser leída de nuevo otra tecla (pines de mayor peso como entrada, los de menor como salida de 0) De esta forma podemos realizar los códigos correspondientes a cada uno de los dígitos del teclado, con dichos códigos y la respectiva configuración del micro podemos realizar la implementación de esto en el código. Configuración del microcontrolador: Para este método de lectura necesitamos realizar las siguientes configuraciones en el microcontrolador: • • Configurar el OPTION_REG para habilitar las “pull up” (se pone el bit RBPU en 0). Configurar las líneas RB4 a RB7 como entradas y las líneas RB0 a RB3 como salidas, sacando un 0 lógico por ellas (TRISB=0b11110000). A continuación mostraremos un código que lee el teclado matricial y realiza incrementos de al pulsar la tecla 1 y decrementos al pulsar la tecla 2. ANTIRREBOTES: la instrucción while: la sintaxis de esta expresión es la siguiente: while(condición) { Instrucciones a realizar mientras que la condición sea verdadera. ------------} El bloque incluido por el ciclo while se repetirá mientras que la condición sea verdadera, una vez se llegue al final del bloque volverá a evaluarse la condición y Curso de Microcontroladores [email protected] 4 Curso de Microcontroladores [email protected] 5 si es verdadera se ejecutará el bloque un vez más, en caso de ser falsa se continuará con la sección siguiente al bloque. Para mantener el micro esperando que se libere la tecla se utilizara el siguiente código: while(PORTB!=0b11110000) {}; Esta línea significa que mientras el puerto B sea diferente del valor dado por defecto cuando las teclas están sueltas (0b11110000) el pic ejecutará el bloque en el cual no hay instrucciones (en otras palabras, el micro esperará), cuando el puerto sea igual al valor dado cuando no hay ninguna tecla presionada el pic continuará la ejecución del código restante. . #include <pic.h> #include "delay.h" #include "delay.c" char void ReadKeypad(void); ProcesarKeypad(char); signed unsigned unsigned char bit char char TECLA,Cont=89,DEC,UNI; AuxTecla; Display[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; FlagTecla=0; void main(void) { //Configuracion del conversor A/D como entradas/salidas digitales ANSEL=0x00; //Entradas analogas como digitales ANSELH=0x00; //Entradas analogas como digitales // configuracion del teclado TRISB=0b11110000; //configuracion inicial del puerto metodo RWR RBPU=0; //activo resistencias de pull-up PORTB=0b00000000; TRISA0=0; TRISA1=0; TRISC=0b10000000; PORTA=0; PORTC=0; while(1) { AuxTecla=ReadKeypad(); // deteccion de la activacion de una tecla if((AuxTecla!=0b11110000)&&(FlagTecla==0)) { ProcesarKeypad(AuxTecla); FlagTecla=1; } if(AuxTecla==0b11110000) { FlagTecla=0; Curso de Microcontroladores [email protected] 5 Curso de Microcontroladores [email protected] 6 } DEC=Cont/10; UNI=Cont%10; //3. Mostrar decenas RA1=0; //desactivo el display de unidades RA0=1; //activo el display de decenas PORTC=Display[DEC]; DelayMs(25); //4. Mostrar unidades RA1=1; //desactivo el display de unidades RA0=0; //activo el display de decenas PORTC=Display[UNI]; DelayMs(25); } } void { ProcesarKeypad(char CodigoTecla) //comandos a ejecutar segun tecla activada switch(CodigoTecla) { case 0b01110111: Cont++; break; case 0b10110111: Cont--; //Tecla 1 //Tecla 2 break; } } char { ReadKeypad(void) //APLICACION del metodo RWR if(PORTB!=0b11110000) { TECLA=PORTB; TRISB=0b00001111; PORTB=TECLA; TECLA=PORTB; TRISB=0b11110000; PORTB=0b00000000; return TECLA; } else { return 0b11110000; } } LA SENTENCIA SWITCH: La sentencia switch se utiliza para comparar una variable con varias constantes y realizar una acción si coincide con una de estas, en nuestro caso seria útil para realizar la decodificación de la tecla, su sintaxis es la siguiente: Curso de Microcontroladores [email protected] 6 Curso de Microcontroladores [email protected] 7 switch(variable) { case constante1: { - - -Instrucciones a ejecutar - - - si variable es igual a constante1 Break; } case constante2: { - - -Instrucciones a ejecutar - - - si variable es igual a constante2 Break; } . . . } Para nuestro ejemplo la decodificación de la tecla podría hacerse también de la siguiente forma: switch (teclado) {case 0b10111110: {boton=0; break;} case 0b01110111: {boton=1; break;} case 0b10110111: {boton=2; break;} case 0b11010111: {boton=3; break;} case 0b01111011: {boton=4; break;} case 0b10111011: {boton=5; break;} case 0b11011011: {boton=6; break;} case 0b01111101: {boton=7; break;} case 0b10111101: {boton=8; break;} case 0b11011101: {boton=9; break;} case 0b01111110: {boton='A'; break;} case 0b11011110: {boton='B'; break;} case 0b11101110: {boton='C'; break;} case 0b11101101: {boton='D'; break;} case 0b11101011: {boton='E'; break;} case 0b11100111: {boton='F'; break;} } Se sugiere que cada uno realice el código y lo compare con este código ya dado, la idea es que cada uno diseñe un código que genere distintos conteos al oprimir diferentes teclas. Curso de Microcontroladores [email protected] 7 GND VCC R1 10k 1 2 3 4 5 6 7 14 13 33 34 35 36 37 38 39 40 U1 RD0 RD1 RD2 RD3 RD4 RD5/P1B RD6/P1C RD7/P1D RE0/AN5 RE1/AN6 RE2/AN7 RE3/MCLR/VPP RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RA0/AN0/ULPWU/C12IN0RC2/P1A/CCP1 RA1/AN1/C12IN1RC3/SCK/SCL RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA RA3/AN3/VREF+/C1IN+ RC5/SDO RA4/T0CKI/C1OUT RC6/TX/CK RA5/AN4/SS/C2OUT RC7/RX/DT RA6/OSC2/CLKOUT RA7/OSC1/CLKIN RB0/AN12/INT RB1/AN10/C12IN3RB2/AN8 RB3/AN9/PGM/C12IN2RB4/AN11 RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT PIC16F887 15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 8 9 10 1 2 3 4 5 6 7 8 RN1 330 16 15 14 13 12 11 10 9 8 Curso de Microcontroladores [email protected] 8 Curso de Microcontroladores [email protected] DIAGRAMA DE CONEXIONES.