Hola a todos
Hoy no vengo a preguntar dudas mas bien a dar un aporte, segun he podido ver
en todos los ejemplos que he bajado de internet casi siempre cuando atendemos
un teclado matricial 4x4 que es el mas comun usamos el driver KBD.c que trae
el MPLAB, haciendo que gastemos mas memoria ROM del micro lo cual a veces no
es bueno, es por ello que decidi buscar otra forma de atender el teclado sin
tener que usar KBD.c... de esta forma se puede conectar el teclado en
cualquier puerto del micro, en este caso use un PIC16F73 y el teclado lo
conecte al puerto C de esta forma:
4x1K Vcc
|---|---|---|---| |
C0 <----| 3 | 7 | B | F |-----/\/\/\------|
|---|---|---|---| |
C1 <----| 2 | 6 | A | E |-----/\/\/\------|
|---|---|---|---| |
C2 <----| 1 | 5 | 9 | D |-----/\/\/\------|
|---|---|---|---| |
C3 <----| 0 | 4 | 8 | C |-----/\/\/\------|
|---|---|---|---|
^ ^ ^ ^
| | | |
C4 _____| | | |
C5 _______| | |
C6 __________| |
C7 _____________|
Estas son las funciones que implemente, he aqui todo lo que hace falta para
usarlas:
//...Variables globales
typedef unsigned long myint;
myint teclas;
unsigned char Burbuja[] = {0xEF, 0xDF, 0xBF, 0x7F};
unsigned char tecla_activa;
//...Declaracion de funciones
void Leer(void);
void Teclado(void);
void main()
{
while(1)
{
Teclado();
}
}
//...Leer puerto del teclado
void Leer(void)
{
unsigned char i;
for(i = 0; i<=3; i++)
{
PORTC = Burbuja;
teclas = (teclas << 4)| (PORTC & 0x0F);
}
}
//...Atencion al teclado 4x4
void Teclado(void)
{
//...Determino cual tecla fue activada
unsigned char i, cont_tecla = 0;
teclas = 0xFFFF;
Leer();
while(teclas == 0xFFFF)
return;
delay_ms(250); //...elimino el rebote
C = 1; //...bandera de acarreo (PIC16F73)
for(i = 0; i<16; i++)
{
teclas = teclas <<1;
if(C == 1)
cont_tecla++;
else
tecla_activa = cont_tecla;
}
//...En funcion de la tecla presionada realizo la accion
switch(tecla_activa)
{
case 0x01:
break;
case 0x02:
break;
.
.
.
.
default: break;
}
}
Como veran lo unico que hice fue basarme en el algoritmo de atencion al
teclado, es decir mando la burbuja por el puerto y despues leo el valor y lo
guardo en una variable de 16bits (teclas), despues la roto a la izquierda
hasta que la bandera de acarreo (C en este PIC) me de distinta de uno y voy
contando y asi determino cual fue la tecla activada... bueno eso es todo,
espero que les sirva para algo... cualquier sugerencia sera recivida con
agrado, ah otra cosa pueden usar el codigo y hacer con el lo que quieran
Saludos J.C