Capı́tulo 1 Práctica: Teclado 4X4 Acostumbraros a ser obedientes, porque siempre os ha de tocar obedecer ∼ Madame de Maintenon ∼ 1.1. Enunciado En1 esta práctica vamos a conectar a nuestro PIC un teclado matricial de 4 filas por 4 columnas. Queremos atender un teclado matricial (pasivo) y aprender como conectarlo. Al mismo tiempo se busca eliminar los rebotes mecánicos de los pulsadores y disponer de una asignación dinámica de valores a las pulsaciones obtenidas. En una segunda parte buscamos atender el teclado usando interrupciones, lo que permitirá al microcontrolador no dedicarse en exclusiva a la atención del teclado. Al mismo tiempo tendremos una oportunidad inmejorable de aplicar el modo SLEEP de bajo consumo del microcontrolador y comprobarlo. 1.1.1. Especificaciones Se pide realizar la programación necesaria para escanear el teclado matricial y su conexión hardware. La rutina deberá devolver un valor numérico entre 1 y 16 dependiendo de la tecla pulsada. Si no se pulsó ninguna tecla deberá devolver el valor 0. Es muy interesante hacer una traducción de la tecla hardware pulsada con el valor serigrafiado en los pulsadores. Realiza la traducción mediante una tabla. 1.1.2. Para sacar nota Los rebotes mecánicos son un efecto no deseado. ¿Cómo los eliminarı́as? Desarróllalo. Queremos atender el teclado por interrupciones para que el microcontrolador pueda hacer otras tareas. Modifica el código para que sea posible. Si el microcontrolador está esperando a que el usuario pulse una tecla, entonces es buena idea dormir el micro para reducir el consumo eléctrico utilizando la instrucción SLEEP. Las interrupciones lo despertarán. Comprueba experimentalmente la reducción del consumo. 1 Versión de 19 de abril de 2008 1 2 Enunciado 1.1.3. Diagramas Los contactos: El módulo: Figura 7. Esquema mecánico del teclado matricial. Capı́tulo 1. Práctica: Teclado 4X4 3 1.2. Solución 1.2.1. Esquema hardware A B C D E F G H J K 0 0 1 1 2 A 7 8 9 B 4 5 6 2 3 2 3 0 = C 10k X1 U1 16 15 4 MHz 5 4 C1 C2 33pF 33pF RA7/OSC1/CLKIN RA0/AN0 RA6/OSC2/CLKOUT RA1/AN1 RA2/AN2/CVREF/VREFRA5/MCLR RA3/AN3/C1OUT/VREF+ RA4/AN4/T0CKI/C2OUT RB0/INT/CCP1 RB1/SDI/SDA RB2/SDO/RX/DT RB3/CCP1 RB4/SCK/SCL RB5/SS/TX/CK RB6/AN5/T1OSO/T1CKI RB7/AN6/T1OSI 6 D 17 18 1 2 3 C 1 4 4 4 1 ON 3 R1 2 3 6 7 8 9 10 11 12 13 5 6 PIC16F88 7 7 8 8 FILE NAME: P_teclado.dsn DESIGN TITLE: Práctica "Teclado 4x4" BY: A 1.2.2. 2 19/04/2008 PAGE: Hoja principal 9 1 DATE: B C D E F G Jesús M. Hernández Mangas H 1 REV: A J Programas # include < pic .h > # include " binario . h " 3 4 5 6 7 8 9 // Para el PIC16F88 __CONFIG ( WDTDIS & XT & UNPROTECT & PWRTDIS & CCPRB0 & DEBUGDIS & LVPDIS & BORDIS & MCLREN ); // Palabra de configuración 0 x2007 __CONFIG ( FCMDIS & IESODIS ); // Palabra de configuración 0 x2008 const unsigned char Teclas []={0 , 10 11 12 13 14 15 16 17 18 19 20 21 22 23 7, 4, 1, 0 xC , 8 , 9 ,0 xF , 5 , 6 ,0 xE , 2 , 3 ,0 xD , 0 ,0 xB ,0 xA }; unsigned char TECLADO_Scan () { unsigned ; ; ; ; ; ; // // // // // // char Tecla =1; Muestrea el teclado 1. Pone la variable Tecla a 1 para el primer código 2. Pone todas las filas de salida a 1 , excepto la fila a muestrear que tiene un 0. 3. Se chequea cada columna de entrada buscando el 0 Si no hay ninguna tecla pulsada la columna se leerá of TIME: 1 11:20:28 K 9 4 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 Solución // // // // // // // // // // // // // // // // // // // 43 45 46 47 48 49 50 51 52 53 54 55 56 57 58 } 59 60 62 63 64 } if ( Tecla ==17) return 0; PORTB = PORTB << 1; // Saco un cero en la fila cero // Borro la notificación ( por si interrupciones ) ) return Tecla ; // Comprueba la primera columna ) return Tecla ; // Comprueba la segunda columna ) return Tecla ; // Comprueba la tercera columna ) return Tecla ; // Comprueba la cuarta columna // Si no se pulsó ninguna retorna cero // Selecciona otra fila return 0; void main () { 65 66 unsigned char T ; ANSEL = 0; TRISB = 0 xF0 ; TRISA = 0 x00 ; RBPU = 0; while (1) { T = TECLADO_Scan (); T = Teclas [ T ]; PORTA = T ; } 67 68 69 70 71 72 73 74 75 76 77 como un 1 gracias a las resistencias de pull - up . Si está pulsada se leerá un 0. 4. Se continua el proceso con todas las filas . Si se ha pulsado una tecla , se sale de la rutina con el valor de la tecla pulsada en la variable Tecla Col . 1 2 3 4 Fila + - - - -+ - - - -+ - - - -+ - - - -+ 1 | 1 | 2 | 3 | 4 | + - - - -+ - - - -+ - - - -+ - - - -+ 2 | 5 | 6 | 7 | 8 | + - - - -+ - - - -+ - - - -+ - - - -+ 3 | 9 | 10 | 11 | 12 | + - - - -+ - - - -+ - - - -+ - - - -+ 4 | 13 | 14 | 15 | 16 | + - - - -+ - - - -+ - - - -+ - - - -+ Si no se ha pulsado ninguna tecla se sale con el valor 0 en Tecla . Si se pulsan dos o más teclas a la vez sólo la primera ( siguiendo el orden ) se detecta . PORTB = B00001110 ; RBIF = 0; while (1) { if ( ( PORTB & (1 < <4))==0 Tecla ++; if ( ( PORTB & (1 < <5))==0 Tecla ++; if ( ( PORTB & (1 < <6))==0 Tecla ++; if ( ( PORTB & (1 < <7))==0 Tecla ++; 44 61 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; } // // // // Configuro el PORTA como digital RB0 .. RB3 salidas , RB4 .. RB7 entradas RA0 .. RA4 salidas Resistencias pull - up entrada activadas // Comprueba el teclado // Traduce