Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Teclado Matricial
Teclado Matricial
En el compilador hay un driver para manejar un teclado telefónico, que es de gran utilidad
en algunas aplicaciones donde el usuario necesita digitar un número.
Los pasos que se deben seguir para manejar un teclado telefónico son:
5. Llamar la función del teclado y almacenar el valor digitado en una variable tipo carácter. Si
no se oprime ninguna tecla el teclado retorna el carácter nulo.
K=KBD_GETC(); // K debe ser una variable tipo caracter (char)
NOTA: Si se utiliza otro microcontrolador y se conecta el teclado telefónico al puerto D se
debe poner resistencias a +5V en RD1, RD2, RD3 y RD4.
Realizar un programa que muestre en un display 7 segmentos los números presionados en un
teclado matricial de 4×3.
#INCLUDE <16F887.H>
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#USE DELAY(CLOCK=4000000)
#DEFINE USE_PORTB_KBD
#INCLUDE <KBD.C>
#BYTE PORTC= 7
#BYTE PORTB= 6
CHAR K;
VOID MAIN()
//PORT_B_PULLUPS(TRUE);
WHILE (TRUE)
//siete
//ocho
//nueve
El teclado matricial 4x4 está constituido por una matriz de pulsadores dispuestos en filas (A,B,C,D) y
columnas (1,2,3,4), con la intención de reducir el número de pines necesarios para su conexión. Las 16 teclas
necesitan sólo 8 pines del microcontrolador, en lugar de los 16 pines que se requerirían para la conexión de
16 teclas independientes.
LIBRERIA A USAR
El compilador C incluye la librería KBD.c para manejar el teclado 3x4. las funciones que se incorporan son las
siguientes:
En el caso que se quiera utilizar un teclado matricial de 4x4, se tendrá que modificar la librería KBD.c e
incluirse en la carpeta drivers del CCS compiler
///////////////////////////////////////////////////////////////////////////
//// KBD4x4.C ////
//// Generic keypad scan driver ////
//// ////
//// kbd_init() Must be called before any other function. ////
//// ////
//// c = kbd_getc(c) Will return a key value if pressed or /0 if not ////
//// This function should be called frequently so as ////
//// not to miss a key press. ////
//// ////
///////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, reproduction ////
//// or distribution is permitted without written permission. ////
//// Derivative programs created using this software in object code ////
//// form are not restricted in any way. ////
///////////////////////////////////////////////////////////////////////////
// Make sure the port used has pull-up resistors (or the LCD) on
// the column pins
#if defined(__PCH__)
#if defined use_portb_kbd
#byte kbd = 0xF81 // This puts the entire structure
#else
#byte kbd = 0xF83 // This puts the entire structure
#endif
#else
#if defined use_portb_kbd
#byte kbd = 6 // on to port B (at address 6)
#else
#byte kbd = 8 // on to port D (at address 8)
#endif
#endif
#endif
// Keypad layout:
char const KEYS[4][4] = {{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}};
void kbd_init() {
}
char kbd_getc( ) {
static BYTE kbd_call_count;
static int1 kbd_down;
static char last_key;
static BYTE col;
BYTE kchar;
BYTE row;
kchar='\0';
if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {
switch (col) {
case 0 : set_tris_kbd(ALL_PINS&~COL0);
kbd=~COL0&ALL_PINS;
break;
case 1 : set_tris_kbd(ALL_PINS&~COL1);
kbd=~COL1&ALL_PINS;
break;
case 2 : set_tris_kbd(ALL_PINS&~COL2);
kbd=~COL2&ALL_PINS;
break;
case 3 : set_tris_kbd(ALL_PINS&~COL3);
kbd=~COL3&ALL_PINS;
break;
}
if(kbd_down) {
if((kbd & (ALL_ROWS))==(ALL_ROWS)) {
kbd_down=FALSE;
kchar=last_key;
last_key='\0';
}
} else {
if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {
if((kbd & ROW0)==0)
row=0;
else if((kbd & ROW1)==0)
row=1;
else if((kbd & ROW2)==0)
row=2;
else if((kbd & ROW3)==0)
row=3;
last_key =KEYS[row][col];
kbd_down = TRUE;
} else {
++col;
if(col==4)
col=0;
}
}
kbd_call_count=0;
}
set_tris_kbd(ALL_PINS);
return(kchar);
}
Lo primero que hay que decir es que no son unas resistencias especiales, se tratan de resistencias
normales pero que están dispuestas en un circuito de una manera determinada. Dependiendo de
la configuración se determinará si la resistencia es pull up o pull down. Como funcionalidad
básica, estas resistencias establecen un estado lógico en un pin o entrada de un circuito lógico
cuando se encuentra en estado reposo. Como bien indica su nombre la resistencia pull up
establece un estado HIGH y las resistencias pull down establecen un estado LOW cuando el pin se
encuentra en reposo. Esto evita los falsos estados que se producen por el ruido generado por los
circuitos electrónicos.
Funcionamiento
Resistencia pull down
Resistencia pull up
Por el contrario, en la configuración pull up, cuando el circuito está en reposo, P1 sin pulsar, la
caída de tensión es de 5V (HIGH), en cambio cuando pulsamos P1 se deriva toda la corriente a
masa y la caída de tensión es 0V (LOW).
Normalmente las resistencias que se utilizan en estos casos son de 10K. Como hemos
comprobado, estas dos configuraciones nos evitarán que en estado de reposo midamos un valor
erróneo eliminando la influencia de factores externos sobre nuestras mediciones como el ruido
eléctrico.