Manejar teclado matricial y mostrar en lcd

HOLA A TODOS ..hace un par de meses hice un proyecto de decodificador de matricial pero de 4*4 con TTLs
aki tienen

primera vez q subo uno de mis proyectos:D
 

Adjuntos

  • TECLADO.zip
    308.2 KB · Visitas: 269
Mr. Carlos aqui te paso el circuito que tengo me prodria decir si tiene algo que se vea raro o que creas que puedo corregir y disculpa la molestia se que esta muy desorganizado (poco tiempo despues si me da tiempo lcorrijo la simu)
 

Adjuntos

  • PAP.pdf
    14.6 KB · Visitas: 139
Hola GABAVAGA

Para otra ocasión mejor adjunta el archivo que se genera con tu simulador. De otra forma tendría pasarlo al simulador para ver efectivamente como funciona lo cual me lleva tiempo.

Creo que en tu circuito haría la misma función una compuerta OR de 4 entradas en lugar del comparador de magnitud que utilizas para cuando el contador U1 llega a cero.

Por lo demás parece bien.

saludos
a sus ordenes
 
Aqui esta el archivo del simuador no lo puse primero asi por que segun note tu trabajas con circuit maker (muy profundo para mi jajajaja) es en proteus
 

Adjuntos

  • Nuevo Archivo WinRAR.rar
    20.8 KB · Visitas: 149
Hola GABAVAGA

Como te había mencionado, sería bueno poner una compuerta OR en lugar del comparador de magnitud.
Fíjate: U10, en la imagen adjunta, puede contar del 0 al 15 pero el decodificador U2 no puede mostrar en el Display más allá del 9. Podrías, en este caso, hacer un arreglo con un sumador y algunas compuertas un convertidor de binario natural a BCD de 2 Dígitos para que se pudieran mostrar también los números del 10 al 15.

Que te parece la idea de programar el número de pasos por medio de DipSwitch en lugar de ir avanzando paso por paso para programar el U10 ??.

Trabajo en CircuitMaker porque el ISIS de proteus que tengo es la versión Demo y no me deja guardar archivos; los puedo modificar o crear nuevos pero no guardar. Por eso te adjunto solo la imagen de mapa de BIT’s

saludos
a sus ordenes
 

Adjuntos

  • Borrame 8.jpg
    Borrame 8.jpg
    199.7 KB · Visitas: 153
Lo del dipswith lo habia pensado es que en la practica el profesor especifico que tenia que ser un boton push button qu enos permitiria contar e l numero de pasos.... Y en lo del display ya me di cuenta el profe dijo que podia ser de 0-9 o de 0-15... Fuen que ppostie el archivo incorreco para no complicarme con dos display sera de 0-9 =)
 
hola soy principiante en electrónica y tengo una duda sobre el teclado matricial :
mi duda es sobre si existe o no un conector especial para conectar el teclado matricial a mi protoboard, me conseguí un teclado matricial negro de 4x4 no tiene conectores solo agujeros, entonces mi duda es sobre como lo conecto a mi protoboard, ya se que podria soldarle unos cables a cada conector pero no quedaría muy estético y creo que una vez vi un proyecto de alguien que si lo tenia sujeto a su protoboard por eso quiero saber si existe algun tipo de conector especial( como se llama), ..... y mi otra duda es si los teclados de membrana son iguales? cual es la diferencia?, he visto algunas imágenes donde ponen teclados de membrana con cables que parecen los flat de computadora, los venden con todo o como debo pedirlo en la tienda?
Espero que puedan resolver mis dudas gracias
 
Saludos mugenn
En efecto el teclado matricial dispone de un conector, particularmente en mi región se le conoce colquialmente como "pinera". Físicamente es eso, una línea de pines conductores separados en funcion de la medida estandar y es común utilizarlos en los teclados matriciales, LCDs,...
Para corroborar la idea a través de una imagen, busca en google bajo la siguiente denominación "pin header". La parte de menor longitud es soldada al teclado y la de mayor longitud se conecta en el protoboard.

Sinceramente hasta ahora no he tenido la oportunidad de trabajar con teclados de membrana, la diferencia primordial sería su construcción/constitución
http://es.wikipedia.org/wiki/Teclado_de_membrana
http://www.ingtec.net/tiposde.htm
Sin embargo, en mi opinión un teclado de membrana podría ser matricial... Ya que el término matricial tiene que ver con el arreglo de los pulsadores
 
muchas gracias nosecomosellama , yo vivo en peru espero que aquí también se llame pinera, talves no pero con las imágenes que me diste a buscar ya puedo arreglármelas a la hora de comprar, de verdad muchas gracias.
Ahora solo me queda la duda del conector del teclado de membrana, espero que alguien pueda decirme si son flats y también como se conectarían a el teclado de membrana .
 
Saludos amigos, necesito guardar un numero por lo menos que sea inferior a 999, después de haber sido leído del teclado matricial...

La idea es que el primer numero ingresado son las centenas el segundo las decenas y el tercero las unidades, no entiendo que pasa con las centenas porque muestra un valor extraño

Otro inconveniente seria si se quiere un numero que no lleve centenas ni decenas, entonces se debe escribir por ejemplo para el 8 -> 008. Debe existir otra forma de hacerlo

De antemano muchas gracias

El codigo es el siguiente:

Código:
#include <18f452.h>                                
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT  
#use delay (clock=4000000)
#define use_portb_kbd TRUE
#include<kbd.c>                                
#include<lcd.c> 
#include<stdlib.h> 
#use fast_io(b)
#use fast_io(d)

int i;
unsigned char k,c[3];
unsigned long cantidad,uni,dec,cen;

void main(void) {
  lcd_init();
  port_b_pullups(TRUE);
  delay_ms(80);
  lcd_putc("\fIngrese numero"); 
  for(i=0;i<=2;i++)
     {  
      do{k=kbd_getc();
         c[i]=(unsigned long)k;
         c[i]=c[i]-48;
        }while(k==0);
      
      //c[i]=c[i]-48;
      if(i==0)lcd_putc('\f');  
      //lcd_putc(k);     
      printf(lcd_putc,"%u",c[i]);
      //printf(lcd_putc,"%lu",a);
     }
     
  cen=100*(c[0]);
  dec=10*c[1];
  uni=c[2];
    
  cantidad=uni+dec+cen;
  delay_ms(500);
  printf(lcd_putc,"\nuni: %lu",uni);
  delay_ms(2000);
  printf(lcd_putc,"\ndec: %lu",dec);
  delay_ms(2000);
  printf(lcd_putc,"\ncen: %lu",cen);
  delay_ms(2000);
  lcd_putc('\f');  
  printf(lcd_putc,"numero: %lu",cantidad);
  
 }

Adjunto envio el codigo y la simulacion en ISIS.....
 

Adjuntos

  • prueba.rar
    49.6 KB · Visitas: 134
Última edición por un moderador:
Hola edacopa

Hay algunos detallitos en el codigo que pones en tu mensaje, pero primero es lo primero...

Usa el metodo de las calculadoras....

1. Asignas Cero a tu variable de control digamos "Num"
2. Invocas una rutina que muestre "Num" en el display LCD
2.1 Limpias el LCD
2.2 Asignas Temp = Num
2.3 Obtienes Dig = int(Temp / 100) ' obtienes las centenas
2.4 Obtienes Temp = Temp - Dig * 100
2.5 Muestras Dig en LCD
2.6 Obtienes Dig = int(Num / 10) ' obtienes las decenas
2.7 Obtienes Temp = Temp - Dig * 10
2.8 Muestras Dig en LCD
2.9 Muestras Temp en LCD ' obtienes las unidades
3. Lees una tecla y guardas el valor en Key
4. Si Key es la tecla "C" haces Num = 0
5. Si key es digito entonces Obtienes el binario de la tecla Key = Key - 48
5.1 Calculas Num = Num * 10 + Key
6. Continuas en el punto 2

La codificacion te la dejo, este es solo al algoritmo...

Saludos
 
Gracias por tu respuesta, no se si lo simulaste pero presenta problemas con las centenas..... Gracias

Por favor simularlo y ayudarme a encontrar el error....
 
Última edición:
Hola... lo estas simulando o estas probando el codigo directamente en un pic con LCD y demas accesorios?

EL algoritmo es perfecto ; )

Si tienes oportunidad sube el codigo que has escrito.

Saludos
 
Hola compañeros quiero pedirles su ayuda en un código de programación que tengo pero sospecho no funciona, el código esta hecho en mikroc pro for pic, ademas el teclado es de 3*4 y la idea para el cual fue hecho es de tener un sistema de alarma en el cual se le coloque una combinación de 4 números, estos quedan grabado en un arreglo y luego se verifica si son correctos entonces funciona y se prende la alarma.

Código:
char* leeClave(){
     //Método que lee del ADC (conversor análogo digital)  4 valores, los transforma a su equivalente del teclado y almacena en el
     //arreglo de chars 'cl' (clave). Regresa el apuntador al arreglo.
     char cl[4];
     unsigned short contLeer;
     unsigned int teclado;
     contLeer = 0;
           while(contLeer < 4){
                          /*
                            Este while espera a que se presione una tecla, checa qué tecla se presionó
                            y guarda ésta en el arreglo de chars 'clave'. Realiza este ciclo 4 veces.
                          */
                          while((teclado = ADC_Read(3)) <= 590){//Espera a que se presione una tecla
                          //prende LED para saber que está aquí
                          }
                          //apaga LED para saber que salimos
                          //Checa qué tecla se presionó
                          if (teclado > 590 && teclado <= 606){cl[contLeer]= 0xF2;}
                          else{
                                if (teclado > 606 && teclado <= 625){cl[contLeer] = 0x03;}
                                else{
                                     if (teclado > 625 && teclado <= 648){cl[contLeer] = 0x06;}
                                     else{
                                          if (teclado > 648 && teclado <= 677){cl[contLeer] = 0x09;}
                                          else{
                                               if (teclado > 677 && teclado <= 707){cl[contLeer] = 0xF1;}
                                               else{
                                                    if (teclado > 707 && teclado <= 733){cl[contLeer] = 0x02;}
                                                    else{
                                                         if (teclado > 733 && teclado <= 764){cl[contLeer] = 0x05;}
                                                         else{
                                                              if (teclado > 764 && teclado <= 797){cl[contLeer] = 0x08;}
                                                              else{
                                                                   if (teclado > 797 && teclado <= 829){cl[contLeer] = 0x00;}
                                                                   else{
                                                                        if (teclado > 829 && teclado <= 866){cl[contLeer] = 0x01;}
                                                                        else{
                                                                             if (teclado > 866 && teclado <= 910){cl[contLeer] = 0x04;}
                                                                             else{
                                                                                  if (teclado > 910 && teclado <= 950){cl[contLeer] = 0x07;}
                                                                             }
                                                                        }
                                                                   }
                                                              }
                                                         }
                                                    }
                                               }
                                          }
                                     }
                                }
                          }
                          //PORTB=cl[contLeer];
                          contLeer++;
                          //Espera a que se deje de presionar la tecla
                          while ((teclado = ADC_Read(3)) > 590){}
           }
           return cl;
}

quisiera saber si el código esta bien o de que forma lo arreglarían, saludos.
 
Última edición por un moderador:
lo que pasa es que , como muchos sabran, se manejan las teclas por cruze de filas y columnas y por ejemplo si mezclo columna 1 y fila 1, habilitaria el numero "1", pero si habilito tambien por ejemplo, fila 2 y columna 2, tengo 4 teclas, para solo 2 arreglos..
es decir, si yo conecto fila 1 a led rojo y fila 2 a led azul, no solo con el numero 1 y 2 se va a prender el LED rojo y el LED azul , respectivamente, sino tambien con el numero 3 y 4, y nose como quitar este problema..
es decir, con solo una tecla, elegir una funcion respectiva..
hay un PIC para esto o como lo hago la coneccion?

saludos
 
mmm mira te tocara utilizar una libreria del teclado externa donde te reconozca los números ya sea por interrupciones o por una matriz que tu ya hayas establecido como es tu teclado. entonces luego lo que tienes qe hacer tu programa si la tecla presionada es 2 prenda el led, sino este apagado.
 
lo que pasa es que , como muchos sabran, se manejan las teclas por cruze de filas y columnas y por ejemplo si mezclo columna 1 y fila 1, habilitaria el numero "1", pero si habilito tambien por ejemplo, fila 2 y columna 2, tengo 4 teclas, para solo 2 arreglos..
es decir, si yo conecto fila 1 a led rojo y fila 2 a led azul, no solo con el numero 1 y 2 se va a prender el LED rojo y el LED azul , respectivamente, sino tambien con el numero 3 y 4, y nose como quitar este problema..
es decir, con solo una tecla, elegir una funcion respectiva..
hay un PIC para esto o como lo hago la coneccion?

saludos

Averigua ¿ Que es ? y ¿ Para que sirve ? el contador en anillo.
 
Última edición:
Hola todos, estoy haciendo un proyecto que encontré en Internet. Es una cerradura electrónica codificada, pues bien ya compre todos los materiales y monte todo, lo ultimo que me falta es hacer la conexión del circuito con el teclado matricial y tengo un inconveniente porque en el plano del proyecto (Cekit. electrónica digital) aparece un teclado con 14 salidas, y el teclado que yo compre tiene 8 salidas no mas.
Aquí adjunto dos imágenes, una del teclado que compre, y la otra de una parte del plano del proyecto.
Porfavor les agradezco de antemano que me colaboren, todos sus comentarios y consejos me sirven de mucho.
gracias
 

Adjuntos

  • Teclado matricial.jpg
    Teclado matricial.jpg
    13.3 KB · Visitas: 92
  • Plano del diseno.jpg
    Plano del diseno.jpg
    154.8 KB · Visitas: 160
Atrás
Arriba