Manejar teclado matricial y mostrar en lcd

Hola, hace tiempo hice un proyecto que creo cumplia con los requerimientos del tuyo. Utilice un 74147 que es un decodificador de prioridad de decimal a BCD, dos registros D de cuatro bits cada uno, un monoestable 74LS122, un flip-flop J-K en modo complemento (J=K=1), una compuerta OR de 4 entradas (puedes usar tres compuertas OR de dos entradas para hacer una de cuatro) y dos 74LS47/48. Cada una de las salidas del 74147 las enviamos a la OR y al mismo tiempo a las entradas de los dos registros D, cuyas entradas las colocamos en paralelo (A con A, B con B, etc). Como el 74147 no puede detectar el cero, el pulsador cero lo conectamos directamente a la OR, la OR aplica un pulso al monoestable 74LS122 cada vez que se oprime uno de los 10 pulsadores, el 74LS122 a su vez le aplica un pulso al J-K para que se complemente, el pulso del 74LS122 se aplica a ambos registros tipo D para que almacenen el numero en sus entradas, el complemento del J-K sirve para direccionar el pulso del monoestable de un registro a otro, asi los un registro a la vez recibe los pulsos del monoestable. Se puede usar un resistor y un capacitor para restablecer los registros cuando se encienda el circuito.
Nota: El 4511 es un decodificador de BCD a 7 seg/ latch y driver para display catodo comun.
DRTK no tendras un esquema de lo que explicaste porfavor

DRTK no tendras un esquema de lo que explicaste porfavor
 
Última edición:
hola MrCarlos me puedes ayudar me han dejado un proyecto un circuito q me registre el orden de llegada de un corredor y el carril en q se encontraba son 8 pulsadores uno para cada corredor espero y me puedas ayudar estaré muy agradecido
 
Hola Ricardo_c

Quiere decir que ninguno de los que aparecen en los enlaces que te mencioné en mi mensaje anterior te sirven ?

Vi otro mensaje Tuyo mencionando algo como esto:

carril 2 que seria en primer lugar, de ahí llega el del
carril 6 que seria en segundo lugar, de ahí llega el del
carril 1 que seria en tercer lugar, de ahí llega el del
carril 8 que seria en cuarto lugar, de ahí llega el del
carril 4 que seria en quinto lugar, de ahí llega el del
carril 3 que seria en sexto lugar, de ahí llega el del
carril 5 llega en sétimo lugar, y por ultimo el del
Carril 7 que seria en octavo lugar.

Tengo Un circuito que pudiera servirte (Turnero), estúdialo para que puedas modificarlo y poner los otros Display’s que mencionas en el mensaje desaparecido.

En este Turnero los Display’s tienen el número de corredor y según el turno en que llegue aparecerá en su respectivo Display. Esto es, los Display’s se llaman: Jugador 1, Jugador 2, Jugador 3,.... Etc. Así que si el Jugador 3 llega en segundo lugar aparecerá un 2 en el Display llamado Jugador 3.

Vi tambien en el mensaje desaparecido que hiciste un circuito pero se pasaba de 8 y no sabías como corregirlo, por favor adjúntalo para poder corregirlo.

Una vez que reciba tu diseño te pasaré este más los que tengo.

saludos
a sus ordenes
 
Última edición:
Saludos!! Alguien me podría explicar los algoritmos para la detección de fila en un teclado matricial?? Eh estado investigando pero no encuentro una explicación clara.
Por ejemplo revise el siguiente documento:

http://www.ate.uniovi.es/fernando/Doc2004/SED/Presentaciones/Conexion%20de%20Teclados.pdf

En la parte donde dice "Muestreo Secuencial" dice "La combinación que de lugar a un 0"....
¿De que combinación habla? y el método de inversión de Línea... se puede implementar en un PLD o es forzosamente en un PIC??
 
Hola num11

“La combinación que da lugar a un 0”

quiere decir que la combinación de una X con una Y.

En un papel dibuja Unas 7 líneas horizontales y cruza sobre ellas otras 7 líneas verticales.
Las horizontales las vamos a llamar Y y las verticales X.
Si por una Y mandas un Cero, cuando pongas en contacto una X tendrás en esa X un Cero.
Esa es una “Combinación que da lugar a un 0”.

Así se inicia a construir un teclado matricial. Entre cada Y y X se coloca un interruptor normalmente abierto.
Luego vamos haciendo 0 cada línea Y; y, si se presiona un interruptor, entonces por la correspondiente X saldrá un cero.

saludos
a sus ordenes
 
Hola MrCarlos, gracias por responder... no entiendo muy bien la lógica que me comentas del "0", jeje, más bien sería mandar "1's" nop?? mmm... en fin, solo sería lógica negativa creo yo, mire, lo que pasa que yo he conectado mi teclado 4x4 y alimento las filas (4) con un voltaje de 5v pues para que funcione el cto, las columnas las conecto a leds pero siempre obtengo la misma salida en las columnas, no entiendo aún como podría detectar la fila si siempre estas estarán a "1",si mi teclado es el siguiente:

0 1 2 A
3 4 5 B
6 7 8 C
9 D E F

al apretar el 1, 4, 7 o D siempre obtengo la salida "11110100", donde los primeros 4 bits son las filas que habilito, y en los siguientes 4 bits el "1" indica la columna, que en este caso es la 2, si puedo detectar la columna pulsada, pero mi problema es al detectar la fila :unsure: :confused:
 
Hola num11

Dibujaste las líneas que te mencioné ?

Las líneas horizontales son las Filas, mencionadas por ti. (Este es el eje de las Y’s)
Las líneas verticales son las columnas. (Este es el eje de las X’s)

Dices: que mandar un 1. Yo digo: Si tambien se puede hacer con un 1.

Pero ese 1 lo debes enviar alternativamente por cada fila (Eje de las Y’s) y, por las columnas, según el botón que presiones aparecerá, o no, ese 1.
Fíjate en la imagen adjunta.
Por las Y’s vas a aplicar un 1 alternativamente desde Y1 hasta Y4.
Si presionaras el botón marcado con 9. cuando tengas ese 1 en Y3 ese 1 saldría por X2 solamente. Cierto ?
Has el experimento presionando otro botón y analiza el resultado.

El aplicar un 1 o un 0 es convencional pero debe estar de acuerdo al circuito que tengas conectado a las X’s.
Si requiere 1’s pues se aplican 1’s; si requiere 0’s pues se aplican 0’2. mientras tanto las otras Y’s deben tener lo contrario.

saludos
a sus ordenes
 

Adjuntos

Hola.... sip, de hecho si dibuje las filas como ud me mencionó jeje y creo que ya voy captando la idea ñ_ñ... muchas gracias, voy a intentar algunas cosillas y comento :p....

Hasta luego :D!!
 
Hola num11

Por lo que vengo leyendo (Mas detenidamente) es que quieres pener el 1 por las X's y detectar el boton cerrado por las Y's.

También se puede hacer así.

saludos
a sus ordenes
 
tengo un problema con un ciruito, este es muy sencillo.
solamente debe mostrar en una lcd lo que se escribe en el teclado, lo estoy haciendo en 16f877.
espero que me pueda hacer el favor de ayudarme, pero es urgente.
en c.
y no debe emitir sonido, utiliso teclado 4x3o 4x4 eso n importa, y la pantalla es 2x16, el teclado esta en el puerto d, y la lcd en el puerto b. gracias
 
tengo un problema con un ciruito, este es muy sencillo.
solamente debe mostrar en una lcd lo que se escribe en el teclado, lo estoy haciendo en 16f877.
espero que me pueda hacer el favor de ayudarme, pero es urgente.
en c.
utilizo teclado 4x3 o 4x4 eso no importa, y la LCD es 2x16, el teclado esta en el puerto d, y la lcd en el puerto b.

yo ya hice un programa, pero me genera error en la libreria kbd.c, la libreria que tengo es:

PHP:
///////////////////////////////////////////////////////////////////////////
////                             KBDD.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.                               ////
///////////////////////////////////////////////////////////////////////////

////////////////// The following defines the keypad layout on port D

// Un-comment the following define to use port B
//#define use_portb_kbd TRUE

// 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

#if defined use_portb_kbd
   #define set_tris_kbd(x) set_tris_b(x)
#else
   #define set_tris_kbd(x) set_tris_d(x)
#endif



//Keypad connection:   (for example column 0 is B2)
//                Bx:

#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 << 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)

#endif

#define ALL_ROWS (ROW0|ROW1|ROW2|ROW3)
#define ALL_PINS (ALL_ROWS|COL0|COL1|COL2)

Keypad layout;
char const KEYS[4][3] = {{'1','2','3'},
                         {'4','5','6'},
                         {'7','8','9'},
                         {'*','0','#'}};

#define KBD_DEBOUNCE_FACTOR 33    // Set this number to apx n/333 where
                                  // n is the number of times you expect
                                  // to call kbd_getc each second


void kbd_init() {
}

char kbd_getc( ) {
   static BYTE kbd_call_count;
   static short int 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;
       }

       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==3)
               col=0;
          }
       }
      kbd_call_count=0;
   }
  set_tris_kbd(ALL_PINS);
  return(kchar);
}
el programa que yo utilizo para mostrar la tecla presionada en el teclado es:

PHP:
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,XT
#use delay(clock=4000000)
#include <lcd.c>
#include <kbd.c>
# use fast_io (D)
# use fast_io (b)

void main() {
 char k;
 
set_tris_d (0xff);
set_tris_b (0x00);
  

   lcd_init();
   kbd_init();

   lcd_putc("\fListo...\n");

   while (TRUE) {
      k=kbd_getc();
      if(k!=0)
        if(k=='*')
        
          lcd_putc('\f');
          
        else
        
          lcd_putc(k);
         
   }
}
y mi diagrama de conexion esta adjunto en proteus 7.2
gracias por la ayuda, es la primera ve que utilizo este teclado, si mis errores son de conexion o de programacion espero que por favor me ayuden.

gracias
 

Adjuntos

pues primero, no se como se conecta un teclado, que resistencias utiliso, y no se como utilizar la livreria kbd.c en el puerto d, y el codigo que utilizo no se si esta bien, el codigo es el siguiente:
Código:
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,XT
#use delay(clock=4000000)
#include <lcd.c>
#include <kbd.c>
# use fast_io (D)
# use fast_io (b)

void main() {
char k;

set_tris_d (0xff);
set_tris_b (0x00);


lcd_init();
kbd_init();

lcd_putc("\fListo...\n");

while (TRUE) {
k=kbd_getc();
if(k!=0)
if(k=='*')

lcd_putc('\f');

else

lcd_putc(k);

}
}
gracias
 
estoy utilizando lo siguiente, un tecado matricial 4x3, la libreria kbd.c, una LCD 2x16, y su libreria en el puerto d, tengo el programa bien echo, lo que pasa es que no se la forma de conectar el teclado al pic para que me muestre todo en la lcd, y ademas, le agradeceria muchisimo si me pueden revisar el programa en busca de errores, el programa es:

Código:
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,XT
#use delay(clock=4000000)
#include <lcd.c>
#include <kbd.c>
# use fast_io (D)
# use fast_io (b)

void main() {
char k;

//set_tris_d (0xff);
//set_tris_b (0x00);


lcd_init();
kbd_init();

lcd_putc("\fListo...\n");

while (TRUE) {
k=kbd_getc();
if(k!=0)
if(k=='*')

lcd_putc('\f');

else

lcd_putc(k);

}
}
tambien voy a colocar el proteus que yo hice de esta conexion, para verificar que es lo que anda mal.


ELL ENLACE ANTERIOR NO SIRVE
 

Adjuntos

Hola que tal, soy nuevo en el foro y soy estudiante de electrónica. Me acaban de dejar un proyecto que consiste en un contador de pastillas y una de las partes involucradas es realizar el despliegue de un teclado matricial+registro en dos displays de 7 segmentos.

Sin embargo, es la primera vez que utilizo un telcado matricial de membrana y no se como es su funcionamiento, ademas adquirímos un CI 74c922 que es el codificador de este, mi duda es como hacer las conexiones físicas del teclado al codificador ya que no se como darle alimentación al teclado.

Anduve siguiendo la datasheet del 74c922 pero no me funcionó. Espero me puedan ayudar gracias.

Aqui la data sheet del CI que utilice.
http://www.datasheetcatalog.org/datasheets/120/243040_DS.pdf

El teclado que utilice.
 
Última edición: