Manejar teclado matricial y mostrar en lcd

es preferible utilizar un micro controlador ya que es mas practico no digo que sea la única forma pero si es parte de un proyecto es preferible enfocarte el lo esencial que traumarte queriendo hacerlo con electrónica pura, yo hice un programa para un teclado matricial 4x3 con el pic 16f28a si lo ocupas te lo mando.
Suerte!!!
 
ya sabes si tu PICC cuenta con dicha libreria.????

En tu diagrama estas mal el LCD va en el puerto D porque la libreria esta por defult asi, a menos que la modifiques y peges el codigo, ademas te faltan muchos elementos.
 
Última edición:
@yohis960 espero que esto te sirva

yo hice algo similar a lo que tu estas haciendo, el programa que hice solicita la clave mostrando el display lcd la solicitud de los 4 numeros 7342 aunque si tu quieres se puede cambiar.... si la clave se ingresa mal con 3 intentos el programa se bloquea.... si la clave esta correcta lee 2 conversores analogos digitales y los muestra en display lcd....

saludos :apreton:
 

Adjuntos

  • robotica.rar
    17.3 KB · Visitas: 865
Hola

Quisiera saber si me pueden ayudar con mi programa que tiene que leer un carácter del teclado matricial y después desplegarlo en la LCD.

Quiero utilizar un mismo puerto del pic, en este caso el B.

Adjunto el circuito en Proteus.

El código es el siguiente:

Código:
#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 4000000)        

#define use_portb_kbd TRUE 

#include <lcd.c>
#include <kbd.c>
        

void main() {
   char k; 
   int  x;
          
   lcd_init(); 
   kbd_init();
   port_b_pullups(TRUE); 

   lcd_putc("\fListo...\n");
                                    
   while (TRUE) {
      k=kbd_getc(); 
      x=k-48;                             //Conversión numérica
      if(k!=0){
        if(k=='*')  
          lcd_putc('\f'); 
        else
           lcd_putc(k);             //Imprime carácter
           delay_ms(500);
           
           
           printf(lcd_putc,"\f Car=%c",k); //Imprime carácter
           delay_ms(500);
           
           
           printf(lcd_putc,"\f Car=%u",k); //Imprime valor ASCII       
           delay_ms(500);
           
           
           printf(lcd_putc,"\f Num=%u",x); //Imprime valor numérico
           delay_ms(500);
           lcd_putc("\fListo...\n");
      }
   }
}
 

Adjuntos

  • Untitled.png
    Untitled.png
    252.2 KB · Visitas: 103
Última edición por un moderador:
Hola a todos estoy realizando un control de temperatura donde es necesario que el set-point se ingrese por un teclado matricial 4x3 ya tengo la simulación en proteus y efectivamente muestra la tecla q uno presiona en la LCD, pero al montar el circuito las teclas 1-2-6-9 no funcionan las demas funcionan pero muestran numeros errados es decir si oprimo el 4 muestra 6 la verdad no se que hacer para que me funcione adjunto la simulacion y el codigo.


Código:
#include "main.h"
#include "LCD.C"
#include "kbd_lib.c"
int i=1,k;

void main()
{
 // port_b_pullups(TRUE);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

lcd_init();

    lcd_gotoxy(1,1); //pos 1 de la fila 1
    lcd_putc("teclas");
    lcd_gotoxy(1,2);

kbd_init();

while(1){

           k=kbd_getc();
    
                if(k!=0)
                       {
                    
                        output_toggle(PIN_C0);
                          lcd_gotoxy(i,2);//posicion i de la 2da linea
                          lcd_putc(k);
                        
                    i++;    
                    }
    
    
}


}
 

Adjuntos

  • conexion.JPG
    conexion.JPG
    247.4 KB · Visitas: 264
Última edición por un moderador:
Hola, ya pude resolver el problema.
La libreria kbd.c viene por defecto para trabajar con el puerto D, si queremos trabajar con algun otro puerto debemos editarla:

Esta es la parte que debemos editar, por defecto viene comentada la linea del define use_portb_kbd TRUE, debemos "descomentarla" para que el teclado sea administrado por el puerto b.
Código:
// Un-comment the following define to use port B
#define use_portb_kbd TRUE

Posteriormente viene en la librera el orden en que se deben conectar los pines del teclado matricial:
Código:
#ifdef blue_keypad  ///////////////////////////////////// For the blue keypad
#define COL0 (1 << 2)
#define COL1 (1 << 3)
#define COL2 (1 << 6)

#define ROW0 (1 << 4)
#define ROW1 (1 << 7)
#define ROW2 (1 << 1)
#define ROW3 (1 << 5)

#else ////////////////////////////////////////////////// For the black keypad
#define COL0 (1 << 0)
#define COL1 (1 << 1)
#define COL2 (1 << 2)

#define ROW0 (1 << 4)
#define ROW1 (1 << 5)
#define ROW2 (1 << 6)
#define ROW3 (1 << 7)

La libreria por defecto trabaja con el orden del black key pad, si queremos trabajar con el blue key pad debemos añadir al principio de la libreria la linea "#define blue_keypad TRUE".
Los pines para las columnas del black key pad serian el 0,1,2 y para los reenglones seria 4,5,6,7.

Este es un código sencillo que imprime en el lcd todo lo que pulsas en el teclado.

Código:
#include <18f4550.h>
#include <18f4550.h>
#use delay(clock=48000000)
#include <KBD_PTOB.c> //windows 7 no dejó editar la libreria, por eso cree otra idéntica pero  para trabajar con el puerto b y la copié en la carpeta "Drivers" del compilador
#include <lcd.c>
#fuses XTPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG
char k; //caracter que será leido
void main(void)
{
   lcd_init();
   kbd_init();
   port_b_pullups(TRUE); 
   while(true){
   k=kbd_getc();//para cachar lo que se pulse o no se pulse en el teclado
   if(k!=0){ //esta instrucción verifica si se ha pulsado una tecla      
      printf(lcd_putc,"%c",k);
      }
   }
}

Adjuntaria el código de la libreria pero seria poner en bandeja de plata el programa y no aprenderian nada y recordemos que aprender es el objetivo de esta comunidad :LOL:.

Así queda finalmente el esquema:
EsquemaProyectoBueno.png


Lo que deseen hacer ya depende de ustedes. Yo hice una cerradura electrónica comprendiendo solo el código que les proporciono y tomando en cuenta algunas propiedades de la pantalla LCD.

Dudas y aclaraciones por aquí, en cuanto tenga tiempo responderé.

Saludos.




Alguien sabe por que muchas personas tenemos el mismo problema con esta libreria???.......tampoco puedo usar el teclado.......ya le movi a todo lo que se le tiene que hacer a la libreria y nada......podrian ayudarme?.

Gracias!
 
Hola!
Podrias decirnos cual es el pic que esas usando, proporcionar un diagrama de conexiones o incluso el código para decirte en que parte te estas equivocando. Suerte!:)
 
Hola!
Podrias decirnos cual es el pic que esas usando, proporcionar un diagrama de conexiones o incluso el código para decirte en que parte te estas equivocando. Suerte!:)

Si claro, es el 16f887 o el 16f877......que lo unico que cambia es el oscilador interno.

Aun continuo con el problema, no se que pase con la libreria o con esa familia de pics y la libreria o el proteus, que se yo. Pronto armare el circuito para ver si es la simulacion y pasar el dato, pero mientras podrian ayudarme. Gracias!
 
Hola a todos estoy realizando un control de temperatura donde es necesario que el set-point se ingrese por un teclado matricial 4x3 ya tengo la simulación en proteus y efectivamente muestra la tecla q uno presiona en la LCD, pero al montar el circuito las teclas 1-2-6-9 no funcionan las demas funcionan pero muestran numeros errados es decir si oprimo el 4 muestra 6 la verdad no se que hacer para que me funcione...

Puede que esté mal conectado tu teclado, la conexión correcta está definida en el archivo <kbd.c> (no conozco la configuración que se utiliza en kbd_lib.c).

#define COL0 (1 << 5)
#define COL1 (1 << 6)
#define COL2 (1 << 7)

#define ROW0 (1 << 1)
#define ROW1 (1 << 2)
#define ROW2 (1 << 3)
#define ROW3 (1 << 4)

Saludos.

Necesito algo de ayuda con un la librería KBD.C de pic-c, el asunto es el siguiente:

Lo único que quiero hacer es mostrar por un puerto un valor y exhibirlo por un display 7 segmentos, el valor exhibido depende de la tecla que se oprima, uso un pic18f452.

El problema es que parece que esta funcionando el teclado, lo simulo en proteus y no funciona...

Armé tu circuito en el Proteus, agregué una linea a tu código y funcionó:

#use fast_io(c)
#define use_portb_kbd TRUE
#include <KBD.C>

Saludos y ojalá te sirva.
 
Última edición:
Alguien podria decirme si en el ORCAD se encuentro el componente de teclado matricial? o hay que crearlo? un saludo y gracias por adelantado. Si pudieran aconsejarme algun programa de simulación para circuitos digitales se lo agradeceria. Gracias
 
Dudo que encuentres el teclado matricial para el orcad, pero en el multisim, una vez hice una matriz de switches (cochinero de conexiones de por medio) para simularlo.
 
Lineal.
Me encuentro diseñando un teclado lineal y/o de matriz con retencion de datos.
A consecuencia de la descontinuacion del 74147 me veo obligado a realizar un teclado de matriz.

Realizaré un control de un teclado para manipulacion de datos con capacidad de 2 Bits para ser representado en BCD con 2 displays de 7 segmentos y un LCD de 16 pines (no conozco muy bien el LCD).

El teclado lineal lo dejaré a parte por que no se muy bien sobre los registros para retencion de datos y el uso de flip-flop. Tengo los diseños siguientes que he hecho, pero no retiene datos. (Teclado lineal adjunto).


Matricial.

Para el diseño de mi teclado de matriz, tengo el teclado 3x5 como el ilustrado en conexion paralelo.
Aunque tengo la opcion del 4x4 para utilizar el integrado 74922.

Del teclado matricial con el 74922, a dos displays, debo hacer la retención de un segundo display.

Adjunto mi segundo diseño con el tecado de matriz. El integrado 74922 retiene los datos en el primer display pero en el segundo no logro hacer el cambio y que retenga los dos digitos (ya que quiero que se marque el segundo digito tal y como los tecleo) mi duda es sobre los FF.

De aqui debo configurar un LCD para que me aparezcan los 2 Bits de los display.


El circuito aun no puedo hacerlo con un PIC desafortunadamente.
 

Adjuntos

  • teclado de matriz Sim!.JPG
    teclado de matriz Sim!.JPG
    180.5 KB · Visitas: 230
  • Tecado Lineal.!.JPG
    Tecado Lineal.!.JPG
    186.3 KB · Visitas: 176
  • Teclado 3x5 Paralelo.JPG
    Teclado 3x5 Paralelo.JPG
    23.3 KB · Visitas: 83
Última edición:
Hola Darzeck

Lo que hace falta en los circuitos que adjuntaste es una circuiteria para que detecte cuando una tecla fue presionada y como respuesta, que los datos se canalicen al siguiente Display.

Creo esto se puede lograr con un Flip-Flip y unas cuantas compuertas. Para hacer cambiar al Flip-Flip se puede utilizar la salida DA(xx) Del 74922. Esta señal se llama DATA AVAILABLE y se genera cada que se presiona una tecla.

(xx) es el número de PIN del integrado y está de acuerdo al paquete que utilizas.

saludos
a sus ordenes
 
He intentado hacer algunos arreglos para que me den el corrimiento al siguiente display, el que retengan la cifra no es mucho problema con los flip-flop de una entrada con su respectiva salida, pero en la entrada del teclado afectan al 1° display y el segundo a veces no tiene ningun cambio, e propósito es que pueda introducir dos datos continuos retenidos.

No he podido tener mucho avance en mi trabajo,
si de favor alguien me podria dar alguna bibliografia o ayudar en mi diseño.
Estaré agradecido.

Sin embargo me agradaria más la idea de algún libro, tengo el Tocci,
pero se me ha complicado un poco el entendimiento.

Pff!
 
Hola Darzack

De lo que encuentras en el Tocci, cuál es el diagrama que se te complica un poco el entendimiento ?.
Podrías adjuntar algún diagrama para analizarlo y ayudarte en el entendimiento ?.

Podrías también utilizar Flip-Flop’s tipo D como por ejemplo el 74LS273 y entre sus D’s y Q’s ir deslazando los datos.
Has una prueba con el circuito contenido en la imagen adjunta.
En lugar del DigiSwitch conecta las salidas de tu sistema de teclado y aplica las señales Reset y Clock.
Te serviría ese circuito ?

saludos
a sus ordenes

Perdón. Hay Un Error En La Secuencia, Lo Correcto es:
A- Pulso En Reset. B- Programar Número En DigiSwitch. C- Pulso En Clock. E- Volver a B. 6 Vueltas.
 

Adjuntos

  • Shift Numbers With 74LS273.jpg
    Shift Numbers With 74LS273.jpg
    387.6 KB · Visitas: 140
Última edición:
Si claro, es el 16f887 o el 16f877......que lo unico que cambia es el oscilador interno.

Aun continuo con el problema, no se que pase con la libreria o con esa familia de pics y la libreria o el proteus, que se yo. Pronto armare el circuito para ver si es la simulacion y pasar el dato, pero mientras podrian ayudarme. Gracias!

espero que esto les sirva este es mi codigo fuente; el programa es muy simple:
#include <16f877a.h>
#fuses XT,NOLVP,NOPROTECT,NOWDT
#use delay (clock=4000)
#define use_portb_kbd TRUE // trabaja en portb, puedes cambiarlo tambien en kbd.c
#include <lcd.c>
#include <kbd.c>
#use standard_io (b)
#use standard_io (d)

char k;
char l;
void main(void)
{
lcd_init();
kbd_init();
port_b_pullups(TRUE);
lcd_putc("\fBIENBENIDO\n");
delay_ms(1000);
lcd_putc("LEYENDO NUMEROS");
while (true)
{
k=kbd_getc();
if (k!=0)
{
l=k-48;
printf(lcd_putc,"\fEL NUMERO LEIDO ES: %u",l);
delay_ms(50);
}
}
return;
}
 
Aplique el circuito analizando un poco la aplicacion.

El número aparece en el 1° display, pasa al 2° y desaparece en el paralelo, en el de matriz los retiene.

Sigo con el de matriz como en un principio, ya se ha logrado que permanezcan en los displays los datos, lo que no consigo es que en el 2° aparezca si introduzco algun otro dato con la misma entrada (teclado: paralelo/matriz).

Adjunto los circuitos de prueba.
 

Adjuntos

  • Corrido de displays.JPG
    Corrido de displays.JPG
    70.3 KB · Visitas: 92
  • Corrido de displays (matrix).JPG
    Corrido de displays (matrix).JPG
    68.3 KB · Visitas: 99
Última edición:
Hola Darzeck

Prueba haciendo las conexiones que vienen marcadas en la imagen adjunta.
Tal vez se requiera intercalar un inversor en la línea verde.

saludos
a sus ordenes
 

Adjuntos

  • Desplazar a Tiempo.jpg
    Desplazar a Tiempo.jpg
    182.7 KB · Visitas: 107
Atrás
Arriba