Hola amigos Taringueros...aqui dejo una practica que realice el año pasado en mi universidad..
Se trata de un teclado matricial, hecho de botones controlado con pic, en este caso el 16F877A..y los numeros se muestran en un Display 7 segmetos, anodo comun,.
Materiales:
BCD 7 segment decoder (74ls47)
display 7 seg, anodo comun
pic 16f877a, crystal quartz 4Mhz, 2 cap ceramicos 22nf
resistencias de 220 omh + una de 10k para el pic
12 Botones tipo Push, el teclado cuanta con los numeros del 0 al 9 mas * mas # y 4 letras A,B,C y D.
la practica esta simulada en Proteus 7.8 sp2,
el pic esta progamado en C, con el compilador MikroC Pro for Pic.
el teclado matricial tiene 4 filas y 4 columnas es decir, es de 4x4, este programa funciona con uno de 3x3 o de 4x3 tambien..
aqui el codigo:
void teclado(){ //* funcion que sirve para reconocer que boton se ha pulsado
PORTB=0b00000001;
if(Button(&PORTB, 4, 20, 1)){PORTD=1;}
else if(Button (&PORTB, 5, 20, 1)){PORTD=2;}
else if(Button (&PORTB, 6, 20, 1)){PORTD=3;}
else if(Button (&PORTB, 7, 20, 1)){PORTD=13;}
else
delay_ms(80);
PORTB=0b00000010;
if(Button (&PORTB, 4, 50, 1)){PORTD=4;}
else if(Button (&PORTB, 5, 20, 1)){PORTD=5;}
else if(Button (&PORTB, 6, 20, 1)){PORTD=6;}
else if(Button (&PORTB, 7, 20, 1)){PORTD=14;}
else
delay_ms(80);
PORTB=0b00000100;
if(Button (&PORTB, 4, 20, 1)){PORTD=7;}
else if(Button (&PORTB, 5, 20, 1)){PORTD=8;}
else if(Button (&PORTB, 6, 20, 1)){PORTD=9;}
else if(Button (&PORTB, 7, 20, 1)){PORTD=15;}
delay_ms(80);
PORTB=0b00001000;
if(Button (&PORTB, 4, 20, 1)){ PORTD=10; }
else if(Button (&PORTB, 5, 20, 1)){PORTD=0;}
else if(Button (&PORTB, 6, 20, 1)){PORTD=12;}
else if(Button (&PORTB, 7, 20, 1)){PORTD=11;}
delay_ms(80);
}
//* el bloque anterior se puede entender como sigue:
// primero se pone en 1 el primer pin del portb y se recorre la fila 1, segun el boton presionado
// obtendremos la activacion del portd con la combinacion correspondiente a la fila- columna
//por ejemplo: si se pulsa el segundo boton de izq. a der. de la primer fila, entonces nuestra cordenada es (1,2)
//fila 1 columna 2, y por tanto el pin 6 (RB5) del portb que esta configurado como entrada, recibe un 1 logico
// y activa el portd, segun lo programamos en el codigo, y el numero es visualizado en el display ;
// si no se pulsa ningun boton de la primera fila, entonces se activa el siguiente pin del puerto b y
// la segunda fila es recorrida, lo mismo para las filas restantes,
void initmain (){ // subfuncion principal;
ADCON1=0x06;
TRISD=0;
PORTD=0; //* configuracion de puertos;
TRISB=0b11110000;
PORTB=0;
}
void main() {
initmain(); //* aqui madamos a llamar las funciones anteriores...
while(1){
teclado();
} }
no olviden conectar las resistencias de 220 a tierra y a cada una de las columnas del teclado...
subo los archivos, tanto el esquematico en proteus como el hex, les recomiendo que intenten compilar el progrma por si mismos, esta sencillo,....
Se trata de un teclado matricial, hecho de botones controlado con pic, en este caso el 16F877A..y los numeros se muestran en un Display 7 segmetos, anodo comun,.
Materiales:
BCD 7 segment decoder (74ls47)
display 7 seg, anodo comun
pic 16f877a, crystal quartz 4Mhz, 2 cap ceramicos 22nf
resistencias de 220 omh + una de 10k para el pic
12 Botones tipo Push, el teclado cuanta con los numeros del 0 al 9 mas * mas # y 4 letras A,B,C y D.
la practica esta simulada en Proteus 7.8 sp2,
el pic esta progamado en C, con el compilador MikroC Pro for Pic.
el teclado matricial tiene 4 filas y 4 columnas es decir, es de 4x4, este programa funciona con uno de 3x3 o de 4x3 tambien..
aqui el codigo:
void teclado(){ //* funcion que sirve para reconocer que boton se ha pulsado
PORTB=0b00000001;
if(Button(&PORTB, 4, 20, 1)){PORTD=1;}
else if(Button (&PORTB, 5, 20, 1)){PORTD=2;}
else if(Button (&PORTB, 6, 20, 1)){PORTD=3;}
else if(Button (&PORTB, 7, 20, 1)){PORTD=13;}
else
delay_ms(80);
PORTB=0b00000010;
if(Button (&PORTB, 4, 50, 1)){PORTD=4;}
else if(Button (&PORTB, 5, 20, 1)){PORTD=5;}
else if(Button (&PORTB, 6, 20, 1)){PORTD=6;}
else if(Button (&PORTB, 7, 20, 1)){PORTD=14;}
else
delay_ms(80);
PORTB=0b00000100;
if(Button (&PORTB, 4, 20, 1)){PORTD=7;}
else if(Button (&PORTB, 5, 20, 1)){PORTD=8;}
else if(Button (&PORTB, 6, 20, 1)){PORTD=9;}
else if(Button (&PORTB, 7, 20, 1)){PORTD=15;}
delay_ms(80);
PORTB=0b00001000;
if(Button (&PORTB, 4, 20, 1)){ PORTD=10; }
else if(Button (&PORTB, 5, 20, 1)){PORTD=0;}
else if(Button (&PORTB, 6, 20, 1)){PORTD=12;}
else if(Button (&PORTB, 7, 20, 1)){PORTD=11;}
delay_ms(80);
}
//* el bloque anterior se puede entender como sigue:
// primero se pone en 1 el primer pin del portb y se recorre la fila 1, segun el boton presionado
// obtendremos la activacion del portd con la combinacion correspondiente a la fila- columna
//por ejemplo: si se pulsa el segundo boton de izq. a der. de la primer fila, entonces nuestra cordenada es (1,2)
//fila 1 columna 2, y por tanto el pin 6 (RB5) del portb que esta configurado como entrada, recibe un 1 logico
// y activa el portd, segun lo programamos en el codigo, y el numero es visualizado en el display ;
// si no se pulsa ningun boton de la primera fila, entonces se activa el siguiente pin del puerto b y
// la segunda fila es recorrida, lo mismo para las filas restantes,
void initmain (){ // subfuncion principal;
ADCON1=0x06;
TRISD=0;
PORTD=0; //* configuracion de puertos;
TRISB=0b11110000;
PORTB=0;
}
void main() {
initmain(); //* aqui madamos a llamar las funciones anteriores...
while(1){
teclado();
} }
no olviden conectar las resistencias de 220 a tierra y a cada una de las columnas del teclado...
subo los archivos, tanto el esquematico en proteus como el hex, les recomiendo que intenten compilar el progrma por si mismos, esta sencillo,....

