Manejo de un Teclado 4x4 /* ***************************************************************************** ** Nombre : teclado4x4.C ** Target : PIC18F4620 ** Compilador : Microchip C18 ** IDE : Microchip MPLAB ** XTAL : 20MHZ ** Autor : ** ** ****************************************************************************/ #include <p18f4620.h> #pragma config OSC=HS,PWRT=ON,MCLRE=OFF,LVP=OFF,WDT=OFF #include <delays.h> #include <stdio.h> Función que lee el teclado. unsigned char KeyScan(){ unsigned char k,j,dt=0; k=0b11101111; for(j=0;j<4;j++){ PORTB=k; Delay10KTCYx(2); switch (PORTB){ case 0x77: dt='D'; break; case 0xB7: dt='C'; break; case 0xD7: dt='B'; break; case 0xE7: dt='A'; break; case 0x7B: dt='E'; break; case 0xBB: dt='3'; break; case 0xDB: dt='6'; break; case 0xEB: dt='9'; break; case 0x7D: dt='F'; break; case 0xBD: dt='2'; break; case 0xDD: dt='5'; break; case 0xED: dt='8'; break; case 0x7E: dt='0'; break; case 0xBE: dt='1'; break; case 0xDE: dt='4'; break; (Este teclado no corresponde a los case 0xEE: dt='7'; break; valores mostrados en el switch) } if(dt!=0){break;} k<<=1; } return dt; } FUNCION PRNCIPAL void main(void){ TRISB=0x0f; // Configura el sentido de transferencia del puerto. PORTB=0x0f; // Define un valor en el puerto. ADCON1 = 0X0F; // Desactiva los canales analógicos INTCON2bits.RBPU = 0; // Conecta las resistencias Pull-Up del puerto B. lcd_init(); // Configura el LCD lcd_gotoxy(1,1); lcd_putrs("Teclado 4x4\n"); // Cartel inicial lcd_putrs("Tecla:?"); while(1){ if(KeyScan()!=0){ // Pregunta si hay alguna tecla. lcd_gotoxy(7,2); stdout =_H_USER; 1 printf("%c ",KeyScan()); // Imprime la tecla apretada. while(KeyScan()!=0){ // Espera que suelte la tecla. Delay10KTCYx(5); } } } } • • • • • • • • • • • 1 Microcontrolador PIC18F4620. 1 Teclado Matricial 4x4 1 Cristal de 20Mhz. 2 Condensadores de 18pF o 20pF. 1 Pantalla LCD 16x2 Hitachi 44780 o compatible 1 Resistencia de 1K. 1 Condensador de ,01uF y 10uF 1 Protoboard. Cables de conexión. Placa programadora de PIC´s. Fuente de alimentación de 5 voltios. 2 Este trabajo muestra una forma sencilla de manejar un teclado con matriz 4x4 pero fácilmente adaptable a cualquier matriz. El corazón del programa es la función KeyScan. unsigned char KeyScan(){ unsigned char k,j,dt=0; k=0b11101111; for(j=0;j<4;j++){ PORTB=k; Delay10KTCYx(2); switch (PORTB){ case 0x77: dt='D'; case 0xB7: dt='C'; case 0xD7: dt='B'; case 0xE7: dt='A'; case 0x7B: dt='E'; case 0xBB: dt='3'; case 0xDB: dt='6'; case 0xEB: dt='9'; case 0x7D: dt='F'; case 0xBD: dt='2'; case 0xDD: dt='5'; case 0xED: dt='8'; case 0x7E: dt='0'; case 0xBE: dt='1'; case 0xDE: dt='4'; case 0xEE: dt='7'; } if(dt!=0){break;} k<<=1; } return dt; } break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; break; Esta función básicamente lee el puerto B y dependiendo del valor leído será el dato retornado, un teclado matricial es en esencia un montón de pulsadores colocados de manera particular conectando entre si filas y columnas. Los pines del puerto B 33,34,35,36 son colocados a las filas y los pines 37,38,39,40 son colocados en las columnas de la matriz, esto se puede cambiar ajustando todo a nuestro teclado. Si observa la variable K=11101111 es puesta en el puerto B y el valor leído en el puerto dependerá de si hay tecla activa y de que tecla. Por ejemplo si coloco el binario 11101111 que es la condición inicial en el pin 37 habrá un cero y suponiendo que esté apretada la tecla F se recibe un cero en el pin 33, el binario en el puerto B en el momento de la lectura será 11101110, el valor de retorno seria 7 de acuerdo a nuestra tabla y suponiendo que ese valor está “pintado” en la tecla. Cambiando los valores de retorno podemos ajustar cualquier matriz. 3