# Manejar teclado matricial y mostrar en lcd



## pablex700 (Sep 4, 2006)

Hola necesito ayuda para programar un teclado matricial pero lo quiero manejar con las 6 lineas del puerto a y las dos primeras del puerto e porque tengo el hardware diseñado asi y en todo lado sale como programarlo pero con el puerto b pero de esta forma la necesito y no me sale yo creo q tengo problemas en emular las resistencias de pull up, como las q tiene el puerto b. El micro q uso es el PIC 16f877 y lo estoy programando en lenguaje c.

Espero q me ayuden, desde ya gracias


----------



## maunix (Sep 5, 2006)

pablex700, ¿cómo te podemos ayudar si no sabemos cuál es tu problema?

Solo dices que no te anda.. ¿pero qué es lo que no te anda? Una tecla? todas las teclas?


----------



## shougo (Sep 6, 2006)

No tienes por qué emular las resistencias de pull-up, simplemete las colocas por fuera, 10k (o un valor cercano) directo a Vcc. Lo malo de tu diseño es que no podrás trabajar el teclado por interrupciones ya que en el puerto A no existen las interrupciones de RB7-4 así que tendrás que estar siempre verificando si alguien ha pulsado una tecla o no.

De resto, debería de portarse idéntico... Revisa el registro ADCON1 para que tengas todos los pines del puerto A como E/S digitales.

Si no te sirve eso, pues descríbenos mejor tu problema para poder ayudar

Saludos


----------



## ben99 (Sep 6, 2006)

Caballero yo realize el teclado matricial y no fue necesario colocar las resistencias de pull up. pero si unas externas para colocar niveles logicos definidos en las entradas del pic.
Pero te digo que ra0,ra1,ra2,ra3 pueden ir a las columnas y ra5, re0,re1,re2 van a las filas de modo que pudes rotar unos en las filas y preguntar por las columnas.
las columnas deben de ir a tierra con unas resistencias de 10k.
Revisa el registro ADCON1 para que tengas todos los pines del puerto A como E/S digitales. 

amigo creo que asi te funcionaria. 

saludos


----------



## Antonio el Bailarin (Sep 7, 2006)

De acuerdo con Shougo y ben99. El pic16F877 configura el puerto A por medio del TRISA y ADCON1 (revisa el datasheet).
Respecto al puerto E, creo q no tienes q tocar nada, pero revisalo tambien.

Saludos


----------



## 25FMN (Dic 14, 2006)

hola a todos!!!
tengo que hacer un proyecto donde uso un teclado matricial. tengo que usar el 89c51 y no tengo ni idea de como programarlo. 
alguien me puede decir como hacerlo o darme algunas pistas sobre el tema???
muchas gracia de antemano


----------



## Braulio (Dic 15, 2006)

No soy un experto, pero tengo algo de experiencia en el tema:

Aquí una descripción de como hacerlo y al final un pequeño ejemplo para descargar.

https://www.forosdeelectronica.com/f24/teclado-matricial-pic-eeprom-4136/

Y aquí algunos comentarios.

https://www.forosdeelectronica.com/f25/teclado-display-7-segmentos-4494/

Espero que te sirva. Salu2:

BRAULIO


----------



## Ivan Alejandro Godoy (Dic 29, 2006)

Hola nuevamente. donde puedo sacar algun circuito con un teclado matricial que se conecte a un PIC,y de paso explique bien como funciona, con alguna rutina, algo. Gracias


----------



## El nombre (Dic 29, 2006)

Mira en http://www.x-robotics.com/
El amigo ionitron lo tiene todo.
Saludos
Bactering


----------



## carlos1242455 (Mar 23, 2007)

hola. espero y alguien tenga tiempo para ayudarme. Es que en la clase de digital 2 me pidieron diseñar un teclado matricial utilizando una memoria eprom, y  con ttl's pero la verdad no me quedo muy claro el como voy a integrar el teclado al circuito, ahorita estuve viendo el funcionamiento del teclado, y mas o menos me quedo la ideade como funciona, pero nisiquier se como funciona la memoria, espero y  me puedan ayudar. Por ciero elteclado es de 4x4.


----------



## Dano (Mar 23, 2007)

Modifica el título para que cumpla con las normas de convivencia.

Saludos


----------



## serge512 (May 9, 2007)

hola esta es la primera vez que escribo, y de verdad e encontrado mucha ayuda en este foro.
Necesito ayuda sobre como trabaja un teclado de matriz y luego, cual integrado de registros puedo usar para que muestre dos digitos en el display, se los agradezco.
esto sin microprocesadores.


----------



## Vichente (May 26, 2007)

El teclado matricial tiene tantas salidas/entradas (depende como se lo tome) como NxM botones donde N son las filas y M las columnas. Para ver como se detecta que tecla se ha presionado te dejo este link.

https://www.forosdeelectronica.com/about3531.htmlhttps://www.forosdeelectronica.com/f25/funcionamiento-tablero-matricial-2046/

Si no quieres usar un PIC puedes utilizar el siguiente circuito cuyo elemento fundamental es el 74C922

El tema es que es bastante caro este integrado pero te digo que hay otras formas más baratas pero son muy engorrosas a la hora del cableado.

Saludos y espero que te haya servido.


----------



## CUSCO (Jun 2, 2007)

hay una forma muy mas sencilla para hacerlo ,y solo tienes que usar 2 codificadores y un contador este metodo esta explicado en el libro de sistemas digitals de tocci yo lo hice pero lo adecu para que me mostrara 4 digitos y no tuve problemas .


----------



## ivan20 (Jun 21, 2007)

Hola. Me esta haciendo de mucha ayuda este diagrama del teclado matricial, solo que tengo una duda...de cuantos microfaradios son los capacitores. Por su comprension muchas gracias.


----------



## clocko (Oct 29, 2007)

bueno si alguien tiene la configuracion para hacer funcionar el teclado deberia ponerla para iluminarnos a todos con  ese conocimiento.


----------



## kobuk (Nov 14, 2007)

Hola, soy un novato en electronica y tengo una base muy baja de digital y necesitaria que me orientase alguien con un proyecto de electronica digital. Tengo que ensamblar un circuito que controle el acceso por teclado mediante un codigo de 4 digitos que pueda canviarlo en cualquier momento.

De momento lo unico que he podido averiguar por mis medios, puesto que el profesor no nos ayuda en nada, es que al introducir los 4 digitos con el teclado tengo que convertir el decimal a binario, eso ya no se como hacerlo. Luego supongo que deberia separar cada digito a un comparador que me diga si es correcta o no la contraseña encendiendo un led. Tampoco se como montar esto, porque digo yo que tendre que poner una memoria rom para guardar el codigo correcto a comparar. Como hago para luego poder cambiar este codigo.

Bueno esto es todo por el momento si me puede ayudar alguien se lo agradecere muchisimo, una vez tenga montado lo de antes si me da tiempo ya preguntare como hacer para poner un display para ver los digitos.

GRACIAS

P.D.: No me dejan usar pic's.


----------



## Romi87 (Nov 25, 2007)

Buenas!

En varios hilos de este foro he leido que para obtener los datos binarios de cada tecla de un teclado matricial puedo utilizar el 74C922 pero con el teclado que tengo i la conexion que me indica en el datasheet del integrado este, a la salida no obtengo el valor correspondiente. Por ejemplo, donde mi teclado tiene un 1, el integrado me saca un 3 binario.

Este es mi teclado 
	

	
	
		
		

		
			





Si alguien conoce un integrado que coincida con los valores de mi teclado o alguna forma de solucionarlo con el 74C922 le estare agradecido!

Gracias!


----------



## aguevara (Dic 4, 2007)

Ya checaste el datasheet del 74C922 ? ahi esta muy claro.

Este IC tiene 4 filas y 4 renglones llamados Y1 hasta Y4 para los renglones y X1 hasta X4 para las columnas de manera tal que si tu conectas el pin señalado como Y1 en tu primer renglon (teclas 1,2,3,A) y el pin señalado X4 en tu primer columna de izquierda a derecha (teclas 1,4,7 y *) entonces cuando tu oprimas la tecla "1" el IC te respondera con el numero binario 3.


----------



## Romi87 (Dic 5, 2007)

Gracias por la respuesta! Seguire provando porque mis numeros van en columnas de 3 i el IC los da en columnas de 4, no se si me explico muy bien.

De todas formas, gracias por tu interes y ayuda!


----------



## clocko (Dic 9, 2007)

pues en la foto que pusiste de tu teclado yo veo 4 columnas y 4 filas.


----------



## ARM8952 (Dic 10, 2007)

Saludos.
Una tecla por lo regular no dá el valor  que tiene marcado en el plastico. Por ejemplo la tecla ESC de un teclado de pc te va a dar un numero hexadecimal ya que ESC no es un valor numerico en si mismo.
Lo importante en un teclado es que cada tecla te dé un valor diferente entre cada una y dé el mismo valor siempre que teclees la misma.
Ya en tu programa debes leer el valor que te dá dicha tecla y hacer lo que quieras con ese valor. Puedes por ejemplo dar el valor 01h a la tecla que te entrega 03h; o el valor que tu quieras para lo que te sirva.


----------



## angel dominguez diego (Feb 8, 2008)

hola a todos lo miembros de la comunidad electronica, es la primera vez que visito la pagina y pues al estar perdiendome en ella, me agrado esta parte ya que tengo tambien que realizar un circuito, el cual nunca me habia encontrado. El circuito que se muestra me parece muy practico pero costoso (de todas maneras es muy bueno), creo yo ,si publicaran otro circuito integrado que sea barato y cubra las necesidades que satisfase el actual seria genial. Asi que te invito CUSCO que nos muestres el circuito que tienes, ya que de alguna manera nos ayudaras a conocer una posible solucion a nuestro problema. Confio en ti.
de todas maneras si encuentro una forma de utilizar un circuito que ayude a proporcionar datos a partir de una matriz se los enviare.


----------



## CUSCO (Feb 9, 2008)

hola quetal, no lo pude subir por que el archivo pesa 803 kb y solo me permiten subir 500kb 
pero bueno  aqui te dejo la direccion de una pagina en la que colgue el proyecto completo. http://usuarios.lycos.es/carlosyaco/controlador_electronico_dogital.htm
el titulo es "SISTEMA CONTROLADOR ELECTRONICO DIGITAL PARA MOTORES PASO A PASO Y MOTORES DE CONTINUA espero que te ayude hasta pronto.


----------



## CUSCO (Feb 22, 2008)

aqui te dejo el tutorial de teclado matricial espero te ayude hasta pronto.


----------



## carolinakor (Mar 30, 2008)

buenas tardes, tengo un proyecto que me exije que utilice un teclado numerico(0 a 9) o pulsadores para que se muestren en dos display el numero pulsado, el numero es de 2 digitos.
las condiciones son las siguientes:

1. al ser pulsado el numero debe mostrarse en el display.
2. al mostrarse debe mantenerse el numero en el display; es decir, no se debe mantener pulsado para que se muestre el numero.
3. al ingresar otro numero pues simplemente se borra el anterior y queda el que se ingreso, es decir; que no debe haber otro sistema que me borre los display.
4. debo utilizar registros. compuertas. etc
(no puedo usar switch)

como seria si hubiese un boton que me borrara los display  
muchas gracias   y espero una pronta respuesta


----------



## CUSCO (Mar 30, 2008)

Hola aqui te paso un pequeño tutorial espero te ayude, hasta pronto.


----------



## DRTK (Mar 30, 2008)

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.


----------



## OZKR_86 (Abr 1, 2008)

Hola estoy buscando la manera de realizar un teclado matrical de 4 x 3 y no he encontrado ningun diagrama quisiera saber si es posible hacerlo y donde puedo encontrar un diagrama o si es necesario comprarlo


----------



## macraig (Abr 1, 2008)

Si es posible hacerlo, con muchos interruptores en una matriz (valga la redundancia)...

aqui hay un diagrama:
http://www.atmel.com/dyn/resources/prod_documents/doc2532.pdf

Bueno, chao.


----------



## pic-man (Abr 1, 2008)

Revisa este enlace: Teclado Matricial 4x3. Ahi encontrarás el código y el diagrama para leer un teclado matricial con un pic16f628a.


----------



## Fogonazo (Abr 2, 2008)

Una alternativa

MM74C922 • MM74C923

http://www.ortodoxism.ro/datasheets/nationalsemiconductor/DS006037.PDF


----------



## axen (May 17, 2008)

hola a todos estoy recien llegado a esto de los microcontroladores, pero me encargaron que hiciera esta proyecto, que consisten en que introduciendo una contrasena con el teclado matricial active o desactive una carga mediante un circuito externo de potencia, todo el  proceso se debe visualizar en la lcd

quiero pedir ayuda a ver si me ueden ayudar con unas rutinas en c

espero su respuesta, ya que ando un poco urgido por esto utiliz pcw ccs

gracias companeros electronicos


----------



## Meta (May 18, 2008)

No te puedo ayudar, pero esto te podría dar ideas.

YouTube - LCD+teclado 3x4+16F84a

YouTube - PIC16F84 ÅŸifreli kilit

YouTube - ÅžEREFLÄ°KOÃ‡HÄ°SAR EML ÅžÄ°FRELÄ° KAPI


----------



## fitocondria (May 30, 2008)

A una compañera le voy a hacer un pwm controlado por teclado [0-9,enter] y display lcd 16x2 en un pic 16f877a o si lo quieres en atmel tambien se puede, mañana voy con ella a comprar las cosas.


----------



## Airoa Airon (Jun 4, 2008)

YouTube - Proyecto Lcd 2.0 con teclado.
Esta rutina la utilizo yo para el teclado.
solo quitale la parte que dice if(sound) eso es para que emita un sonido cuando la presiones, y   
la parte donde dice time es para saber cuanto tiempo tardarse en cada tecla

>aqui va conectado el teclado

```
#define r1 pin_b4
#define r2 pin_b5
#define r3 pin_b6
#define r4 pin_b7

>>>

int keypad(int sound, int time)
{
   
  output_e(0x01); 
  
     if (input (r1))
        {
        if (sound)
        {
        beep(100,200,50);}
        
        delay_ms(time);
        return 1;}
     if (input (r2))
        {
        if (sound)
        {
         beep(100,200,50);}
        
        delay_ms(time);
        return 4;}

     if (input (r3))
        {
        if (sound)
        {
        beep(100,200,50);}
        
        delay_ms(time);
        return 7;}

     if (input (r4))
{
        if (sound)
        {
       beep(100,200,50);}
        
        delay_ms(time);
        return 10;}
  output_e(0x02);       
 
     if (input (r1))
        {
        if (sound)
        {
         beep(100,200,50);}
        delay_ms(time);
        return 2;}
     if (input (r2))
        {
        if (sound)
        {
         beep(100,200,50);}
       delay_ms(time);
        return 5;}
     if (input (r3))
        {
      if (sound)
        {
         beep(100,200,50);}
         delay_ms(time);
        return 8;}
     if (input (r4))
        {
      if (sound)
        {
         beep(100,200,50);}
      delay_ms(time);
        return 11;}
  output_e(0x04);
  
     if (input (r1))
        {
      if (sound)
        {
       beep(100,200,50);}
        delay_ms(time);
        return 3;}
     if (input (r2))
        {
if (sound)
        {
        beep(100,200,50);}
        delay_ms(time);
        return 6;}
     if (input (r3))
        {
       if (sound)
        {
         beep(100,200,50);
        }
        delay_ms(time);
        return 9;}
     if (input (r4))
     {
         if (sound)
        {
         beep (100,200,50);
        }
        delay_ms(time);
        return 12;}
        
        return 0;
        }
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
y este un ejemplo de como lo utilizo en mi programa
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
while(true)
   {
   switch(keypad(1,100))
   {
   case 1:
   lcd_putc("\f|777|  ATRAS ");
   lcd_putc("\n Jugar al 777 ");
   opcion=1;
   break;
   case 3:
   lcd_putc("\f 777  |ATRAS| ");
   lcd_putc("\nRegresar al Menu");
   opcion=2;
   break;
   case 12:
   switch(opcion)
   {
   case 1:
   progress2(2,50);
   siete();
   case 2:
   return;
   default:
   break;
   }
   default:
   
   break;
   }
   
   }
```


----------



## darkcomet (Jun 8, 2008)

mira primero que todo di vas a utilizar un micro para ello es sencillo por ejemplo para el 16f877 empleas las interrupciones del puerto rb para saber que tecla del teclado matricial se pulso, luego vas almacenando cada valor en la eeprom y al final comparas y ademas debes tener uina tecla que te permita cambiar la clave y cuyo valor guardas en la eeprom de forma que cuando se pulse una tecla el micro sepa que es para cambiar la clave y no para introducirla como tal


----------



## luife (Jun 10, 2008)

bueno lo puedes hacer con compuertas... bueno para pasar de dedimal a BCD puedes utilizar el integrado 7447 para display anodo comun o el 7448 para catodo comun... tienes q utilizar memorias puedes hacerlas con compuertas (And) retroalimentandolas o puedes utilizar flip-flop... el comparador lo puedes hacer con compuertas exnor y and... o puedes utilizar el HD74Ls85 es un comparador... y le agregas el led de bueno


----------



## Guillermo Zambrano (Jul 9, 2008)

hola , quisiera saber si el 74C922 elimine el problema de rebote mecanico que produce los pulsadores del teclado matricial y si es asi por favor si pudiecen explicar los pines del 74Cp22 como por ejemplo el pin 5 (oscillator) el pin 6 (keybonce mask) el pin 12 (data available) y el pin 13 (output enable)


----------



## Manuel (Jul 9, 2008)

Hola amigos, tengo muchas dudas del teclado, al conectarlo al chip segun el circuito de cusco, no logro q me muestre los datos q necesito, q debo hacer en este caso compañeros? tengo otra duda, por que debo conectar las salidas del teclado a una and de 4 entradas y a una 7400?


----------



## wacalo (Jul 10, 2008)

Manuel: El trabajo enviado por cusco está impecable (circuito más explicaciones) yo no podría explicártelo mejor; por lo que solo puedo decirte que lo leas varias veces.
Solo te diré un par de cositas:
Por ejemplo cuando presionas el 9 (en ese preciso instante no pasa nada) recién cuando el contador (escaneador) apunta a la columna 2, manda un 0(cero) a la columna 2 y por tanto también a la fila 3, al poner un 0 en la fila 3 entonces AND4 manda un 0 y detiene los pulsos de clock, esto hace que los códigos de filas y columnas queden fijos mientras no se suelte la tecla. El código de fila (salidas de A1 y A0 azul) será: 10; el código de columna (salidas de A1 y A0 rojo) será: 01, por lo tanto el código total será: 1001 = 9.
Saludos


----------



## angel dominguez diego (Jul 10, 2008)

hola que tal manuel 
espero que te sirva esto
supongo que tu problema es que al teclear un dijito no te da el que necesitas y asi con todos, o quizas cuando lo vuelves a teclear te da otro numero bueno pues
en una terminal de el chip del que tu hablas que creo que es el decodificador,
se debe de poner un capacitor para que te puedan dar los datos correctos no estoy seguro cuel pin es pero para que salgas de dudaas debes de analizar la hoja de  datos o especificaciones (no se como le llames) del ese circuito intergrado

me gustaria de favor que alguien me pasara un buen circuuito para armar un amplificador de audio que me pueda dar uno bajos muy notables (chidos). amplificador para casa  
gracias


----------



## CUSCO (Jul 10, 2008)

Hola quetal wacalo realmente yo no lo podria explicar mejor,
el teclado lo simule en proteus y funciona perfectamente, 
tambien lo arme para un proyecto y no hubo problemas 
talvez el unico problemilla con que te podrias topar seria 
con los valores de los condensadores mañana a mas tardar 
te paso el circuito por que primero voy a tener que buscarlo
hasta mañana.


----------



## CUSCO (Jul 10, 2008)

dale una revisada a esta direccion talvez te sirva
https://www.forosdeelectronica.com/f25/teclado-matriz-display-registro-7518/


----------



## julio (Jul 11, 2008)

mira yo soy nuevo en este foro pero aqui te dejo este diagrama no es con un teclado matricial
pero te podria servir y es con 4 displays pero eso es lo de menos nada mas le quitas dos.
bueno pues ojala y les sirva


----------



## Manuel (Jul 11, 2008)

Gracias muchachos, fue de gran ayuda todas las explicaciones. Les deso suerte en todos sus proyectos


----------



## Guillermo Zambrano (Jul 12, 2008)

bueno si ya la habia rebvisado e incluso dan el circuito hecho pero lo que yo quisiera saber es saber el funcionamiento de dicho integhrado, para q esta los capacitores ? pero de todas formas gracias por tu interes ...


----------



## vdfe (Jul 17, 2008)

lo abre con livewire
cualquier duda la posteas


----------



## willow (Ago 19, 2008)

Buenas!

Estoy interesado en la realización de este tema pero utilizando PIC's. Me podríais aconsejar de webs donde poder buscar información al respecto o recomendarme algún link sobre el tema.

Básicamente estoy buscando habilitar una salida de un pic siempre y cuando se haya introducido previamente una clave de seguridad por teclado. También existe la posbilidad de cambiar dicha clave.

Gracias de antemano.


----------



## pepechip (Ago 19, 2008)

esta utiliza un pic 16f876

http://perso.wanadoo.es/chyryes/circuitos/cerradura.htm


----------



## willow (Sep 22, 2008)

Muchas gracias. Ya la conocía, pero gracias de todos modos.


----------



## jaiser (Oct 7, 2008)

Saludos, tengo problemas con un teclado matricial 4x3 que estoy usando con un pic 16F877. Este lo manejo por el convertidor A/D y me muestra los valores adecuados en una pantalla lcd, pero cuando los envio por puerto serial cambia el valor leido en el teclado. Les agradezco mucho si me pueden ayudar.

Adjunto el programa el programa en c y la simulacion esta en proteus y el foro no permite subir estos archivos, agradezco a los moderadores del foro si pueden hacer algo al respecto.

Gracias.


----------



## jaiser (Oct 27, 2008)

He resuelto el problema, habia que hacer dos cambios, uno era ajustando los valores de las resistencias, lo que amplificadora las ventanas de valores del teclado dando mayor flexibilidad al sistema. El otro era que la variable que estaba obteniendo estaba definida como tipo char y al tratar de convertirla en un entero carga su valor en la tabla asci, por supuesto al operar matematicamente con esta variable tenia errores.


----------



## jaiser (Oct 27, 2008)

Aqui esta el archivo del programa en ccs


----------



## griseleishon (Dic 2, 2008)

Estoy realizando un proyecto y en mi diseño de hardware, decidí utilizar el puerto C del pic16f877 para controlar un teclado matricial de 3x3. ¿Es esa una buena elección?


----------



## ericklarva (Dic 2, 2008)

Hola griseleishon, de normal cualquier puerto es bueno para aplicaciones como la del teclado. Ahora bien debes visualizar las diferentes opciones que traen los pines individuales de cada puerto.
Por ejemplo, el puerto A en muchos PICs poseen entradas para el conversor AD, el puerto C posee pines para comunicación de datos como el I2C, SPI, USART, etc. El puerto D por ejemplo esta diseñado para una comunicación de protocolo paralelo. Y así como esto hay muchos más dependiendo del PIC y del número de pines que posea.
Para manejar un teclado necesitas resistencias PULL-UP que te mantengan "fijo" un voltaje ( nivel lógico 1) a la salida. El puerto C no posee internamente estas PULL-UPs por lo que tendrías que poner por fuera las resistencias.
Si no usas el puerto B tal vez sería más sencillo para el teclado, ya que este puerto incorpora la opción de PULL-UPs.
En pocas palabras, el puerto B está diseñado para trabajar con un teclado matricial.
Espero que esto te pueda ser de utilidad.
Saludos


----------



## ELIUSM (Dic 2, 2008)

Te tengo un código en assembler para teclados matriciales. Lamentablemente es para teclados de 4x4, pero fíjate que eso puede darte totalmente lo mismo, porque para adaptar el programa, lo unico que tienes que hacer es no conectar la fila 4 y la columna 4 (digo, conectar físicamente).

En el programa se usa el PORTB, por lo que es eso lo unico que debes cambiar.

Este programa es bastante "tonto" también, lo cual puede ser ventajoso cuando le asignas letras o símbolos diferentes a cada tecla del teclado, en vez de los números ordenados, como es siempre.
El programa es fácil de entender también.


```
;Configuración del PIC 16F84A
STATUS	EQU	0x03
PORTA	EQU	0x05
PORTB	EQU	0x06
TRISA	EQU	0x85
TRISB	EQU	0x86

;Variables para el programa
PDel0	EQU	0x0C
PDel1	EQU	0x0D

RESULT	EQU	0x0E
CONTCL	EQU	0x0F
CLAVES	EQU	0x10

;Inicialización de puertos del PIC 16F84A
	bsf		STATUS, 5		;Banco 1
	clrf	TRISA			;Todo el perto A OUT
	movlw	0x0F
	movwf	TRISB			;0,1,2,3=IN 4,5,6,7=OUT
	bcf		STATUS, 5		;Banco 0

;Vaciar puertos
	clrf	PORTA
	clrf	PORTB
;Inicializar vaiable para el programa
	movlw	B'00011111'
	movwf	CONTCL

INTERR
	movlw	0xF0			;Activar el RB para INT
	movwf	PORTB
	btfsc	PORTB,0			;Para recibir señal: esta subrrutina
	goto	SCANTEC			; se encarga de llamar al decodificador
	btfsc	PORTB,1			; de caracteres si detecta alguna
	goto	SCANTEC			; tecla presionada.
	btfsc	PORTB,2
	goto	SCANTEC
	btfsc	PORTB,3
	goto	SCANTEC
	goto	INTERR

UNINT
	btfsc	PORTB,0			;Para ninguna señal: esta subrrutina
	goto	UNINT			; se encarga de asegurarse que ya no
	btfsc	PORTB,1			; haya ninguna tecla apretada para
	goto	UNINT			; continuar con el programa. Si no se
	btfsc	PORTB,2			; usara, el programa leería miles de
	goto	UNINT			; veces el mismo caracter, pero
	btfsc	PORTB,3			; normalmente se quiere leerlo una
	goto	UNINT			; sola vez.
	return

SCANTEC						;Subrutina que asigna valores para
	clrf	PORTB			; cada tecla diferente del teclado.
	call	DEMORA			;Llamar a Antirrebote de teclado (50ms)
	clrw					;Vaciar Work

	bsf		PORTB,4			;Activar primera fila
	btfsc	PORTB,0			;Si RB0 = 1, entonces
	movlw	0x01			;el resultado será = 1
	btfsc	PORTB,1			;Si RB1 = 1, entonces
	movlw	0x02			;el resultado será = 2
	btfsc	PORTB,2			; ...
	movlw	0x03
	btfsc	PORTB,3
	movlw	0x0C
	call	UNINT
	bcf		PORTB,4			;Desactivar primera fila

	bsf		PORTB,5			;Activar segunda fila
	btfsc	PORTB,0			;Leer y asignar valores
	movlw	0x04
	btfsc	PORTB,1
	movlw	0x05
	btfsc	PORTB,2
	movlw	0x06
	btfsc	PORTB,3
	movlw	0x0D
	call	UNINT
	bcf		PORTB,5			;Desactivar segunda fila

	bsf		PORTB,6			;Activar tercera fila
	btfsc	PORTB,0			;Leer y asignar valores
	movlw	0x07
	btfsc	PORTB,1
	movlw	0x08
	btfsc	PORTB,2
	movlw	0x09
	btfsc	PORTB,3
	movlw	0x0E
	call	UNINT
	bcf		PORTB,6			;Desactivar tercera fila

	bsf		PORTB,7			;Activar cuarta fila
	btfsc	PORTB,0			;Leer y asignar valores
	movlw	0x0A
	btfsc	PORTB,1
	movlw	0x00
	btfsc	PORTB,2
	movlw	0x0B
	btfsc	PORTB,3
	movlw	0x0F
	call	UNINT
	bcf		PORTB,7			;Desactivar cuarta fila

	movwf	RESULT			;Mover valor final a RESULT


;Demora de 50ms a 4Mhz para antirrebote de botones del teclado
DEMORA  movlw     .55       ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        return              ; 2+2 Fin.

END

;El teclado matricial está conectado de la sgte forma:
;			PORTB,4		PORTB,5		PORTB,6		PORTB,7
;PORTB,0	1			2			3			C
;POERB,1	4			5			6			D
;PORTB,2	7			8			9			E
;PORTB,3	A			0			B			F

;Está claro que el puerto B es capaz de hacer interrupciones
;justamente para ser usadas en un teclado matricial. Aquí
;no se usan. Puede tener algunas ventajas. Además, en este
;programa, uno puede asignar valores arbitrarios a cada tecla
;del teclado, y eso es útil, ya que no cualquier teclado
;matricial tiene los números en el mismo órden que el que uso
;aquí.
```

Saludos!


----------



## griseleishon (Dic 3, 2008)

De hecho elegí el puerto C del pic16f877, porque tiene salida un buffer ST cuando lo usas como salida. El puerto b, a pesar de que le puedo activar las resistencias de pull up, preferí dejarlo para mi bus de datos, porque lo voy a conectar a varias TTLs y éste tiene un buffer TTL.


----------



## ericklarva (Dic 3, 2008)

griseleishon, como te comenté el puerto B está preparado para usar un teclado matricial. Pero si ya has decido utilizar el puerto C para tu teclado, adelante solo ten en consideración las resistencias, ya que sin estas puedes tener disparos erráticos en tu programa.
Saludos


----------



## griseleishon (Dic 4, 2008)

Ya terminé el programa y me veo en un caos.
Al compilarlo no tuvo problemas, así que pensé que estaría bien, pero al simularlo con Mplab sim, me he dado cuenta de que el puerto E no actúa como salida, no sé que hice mal.

Mi proyecto, es un probador de compuertas TTL.
la compuerta se elige por medio de un teclado matricial de 3x3, pero de esas 9 teclas, solo se usan 8.

busqué en el manual del pic16f877 y encontré algo refente al registro Adcon1.


```
BCF STATUS, RP0 ;
BCF STATUS, RP1 ; Bank0
CLRF PORTA ; Initialize PORTA by
; clearing output
; data latches
BSF STATUS, RP0 ; Select Bank 1
MOVLW 0x06 ; Configure all pins
MOVWF ADCON1 ; as digital inputs
MOVLW 0xCF ; Value used to
; initialize data
; direction
MOVWF TRISA ; Set RA<3:0> as inputs
; RA<5:4> as outputs
; TRISA<7:6>are always
; read as ’0’.
```

por lo que entendí, supuse que debo utilizar el adcon1, para indicarle al pic que su puerto E será utilizado como salida digital, TTL, pero no sé como hacer eso.


----------



## ericklarva (Dic 4, 2008)

En el código que posteaste está la solución  tu problema moviéndole el valor 0x06 al ADCON1. Solo debes cerciorarte de estar en el Banco 1 para mover este valor.
MOVLW 0x06 ; Configure all pins
MOVWF ADCON1 ; as digital inputs 
Saludos.


----------



## griseleishon (Dic 4, 2008)

Ya lo hice y no me sale


----------



## ericklarva (Dic 4, 2008)

MMM, tendrías que postear tu programa para poder entender donde pueda estar la falla.
Saludos


----------



## griseleishon (Dic 4, 2008)

```
list p=16f877
include p16f877.inc
__CONFIG _CP_OFF&_WDT_OFF&_DEBUG_OFF&_CPD_OFF&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_XT_OSC



;__config 0x3F18
cblock 0x20
TECLA     ;valor de tecla pulsada
SN        ;valor de tecla si/no
CONT    ;para retardo
LCD_ApuntaCaracter    ; posición del carácter a visualizar respecto del comienzo
LCD_ValorCaracter    ; Código ASCII del carácter a visualizar
;Caract
LCD_Dato
LCD_GuardaDato
LCD_GuardaTRISD
LCD_Auxiliar1
LCD_Auxiliar2
R_ContA                        ; Contadores para los retardos.
R_ContB
R_ContC

endc

LCD_CPorLinea    EQU    .16

#DEFINE  LCD_PinRS    PORTE,0
#DEFINE  LCD_PinRW    PORTE,1
#DEFINE  LCD_PinEnable    PORTE,2
#DEFINE  LCD_BusDatos    PORTD


;::::::::::::::::::::::::::::::::::::::::::::::::::::



org 0x00

        MOVLW     b'00000000'
        MOVWF     INTCON     ; deshabilitamos GIE y T0IE
        BCF        STATUS,RP0

INI

        bsf STATUS,RP0             ; Cambio a banco 1

    ;PUERTO C, CONTROL DE TECLADO MATRICIAL
        movlw 0x38                 ; RC3, RC4 y RC5 como entradas: columnas
        movwf TRISC             ; y RC2, RC1 y RC0 como salidas: filas
    
    ;PUERTOS A Y B PARA TTL TESTER, SE CONFIGURARÁN DEPENDIENDO DE LO QUE SE REQUIERA
    ;PUERTO D PARA BUS DE DATOS DE LCD
        clrf TRISD                 ; Puerto D como salida
    ;PUERTO E PARA CONTROL DE LCD
    ;E0 RS
    ;E1 R/W
    ;E2 EN
        bsf STATUS,RP0             ; Cambio a banco 1
        clrf TRISE                 ; Puerto E como salida
    ;
    BCF STATUS, RP1 ; Bank0
    ;CLRF PORTA ; Initialize PORTA by
    ; clearing output
    ; data latches
    BSF STATUS, RP0 ; Selecciona Banco 1
    MOVLW 0x06 ; Configura los pines de PTOA y PTOE
    MOVWF ADCON1 ; como i/o digital 
    MOVLW 0x00 ;
    MOVWF TRISE; PUERTO E COMO SALIDA DIGITAL 

    
    ;INICIALIZAR LCD CON BUS DE 8 BITS

INI_LCD    
    call LCD_Inicializa

    ;ESCRIBIR EL LA LCD: ELIJA COMPUERTA
Inicio
    movlw    Mensaje0                ; Carga la posición del mensaje inicial.
    call    LCD_Mensaje                ; Visualiza el mensaje.

PRINCIPAL
        call  TTL                ; Llamar a rutina de teclado
        goto  PRINCIPAL         ; Ejecución cíclica del programa

;LEE TECLADO

TTL 
        clrf TECLA                 ; Limpiar variable TECLA
        movlw b'00000110'         ; Poner un cero en la primer
        movwf PORTC             ; fila del puerto C (RC0)

CHECA_COL
        btfss    PORTC,3             ; Si al 1er columna es "0"
        goto     ANTIRREBOTES         ; salta a la rutina ANTIRREBOTES
        incf     TECLA,f             ; Si es "1" incrementa TECLA
        btfss     PORTC,4             ; Si la 2da columna es "0"
        goto     ANTIRREBOTES         ; salta a la rutina ANTIRREBOTES
        incf     TECLA,f             ; Si es "1" incrementa TECLA
        
        
        ;para que despues de revisar teclas, si ni ha habido alguna 
        ;pulsación regrese a revisar la tecla 0 o recorra el 0 en las filas

        movlw     d'5'
        subwf     TECLA,w
        btfsc     STATUS,Z        ; si ha revisado todas las teclas y nunguna ha sido pulsada
        goto     TTL                ; reiniciará la revisión del teclado
        bsf     STATUS,C        ; si no ha terminado con la revisión del teclado
        rlf     PORTC,f            ; rotará el 0 a la siguiente fila
        goto     CHECA_COL        ; revisará las columnas

ANTIRREBOTES
    C1     btfss     PORTC,3
        goto     C1
    C2     btfss     PORTC,4
        goto     C2
        movf     TECLA,w
        call     COMPUERTA
    ;    goto     SI_NO
    ;    return

; Mensaje: ¿Revisar otra?
    movlw    Mensaje13                ; Carga la posición del mensaje inicial.
    call     LCD_Borra                ;
    call    LCD_Mensaje                ; Visualiza el mensaje.
    call     Retardo_500ms

SI_NO
        clrf     SN                 ; Limpiar variable SN
        movlw    b'00000110'     ; Poner un cero en la primer
        movwf     PORTC             ; fila del puerto C (RC0)

CHECA_COLSI
        btfss     PORTC,5         ; Si la columna es "0" (TECLA SI: PRESIONADA)
        goto      TTL                ; regresa a leer el teclado
        incf     SN,F
        movlw     d'2'
        subwf     SN,w
        btfsc     STATUS,Z
        goto     TTL
        bsf     STATUS,C
        rlf     PORTC,f
        btfss     PORTC,5         ; Si la columna es "0" (TECLA NO: PRESIONADA)
        goto      final            ; sale del programa
        goto    CHECA_COLSI        ; ningún botón ha sido pulsado, regresa a revisar teclado
            

        
COMPUERTA
    
    addwf    PCL,F    ; Salta a la configuración adecuada.

;Tabla
    goto    AND
    goto    NOT
    goto    NOR
    goto    OR
    goto    NAND
    goto    XOR

AND

    movlw    0x0D
    bsf     STATUS,RP0             ; Cambio a banco 1
    movwf    TRISA    ; configurar las entradas y salidas de la compuerta AND
    bcf     STATUS,RP0             ; Cambio a banco 0
    movlw     0x9B    ;
    bsf     STATUS,RP0             ; Cambio a banco 1
    movwf    TRISB    ;
    bcf     STATUS,RP0             ; Cambio a banco 0

;Escribe AND en la LCD

    movlw    Mensaje1                ; Carga la posición del mensaje.
    call    LCD_Mensaje                ; Visualiza el mensaje.
    call    Retardo_500ms

;------------------------------
;REVISA COMPUERTA AND1 DEL INTEGRADO

    bcf     PORTA,3
    bcf        PORTA,2
    btfsc     PORTA,1
    call     E1
    bcf        PORTA,3
    bsf        PORTA,2
    btfsc    PORTA,1
    call    E1
    bsf        PORTA,3
    bsf        PORTA,2
    btfss    PORTA,1
    call    E1

;-----------------
;REVISA COMPUERTA AND2 DEL INTEGRADO

    bcf     PORTA,0
    bcf        PORTB,7
    btfsc     PORTB,6
    call     E2
    bcf        PORTA,0
    bsf        PORTB,7
    btfsc    PORTB,6
    call    E2
    bsf        PORTA,0
    bsf        PORTB,7
    btfss    PORTB,6
    call    E2

;----------------------    
;REVISA COMPUERTA AND3 DEL INTEGRADO

    bcf     PORTB,0
    bcf        PORTB,1
    btfsc     PORTB,2
    call     E3
    bcf        PORTB,0
    bsf        PORTB,1
    btfsc    PORTB,2
    call    E3
    bsf        PORTB,0
    bsf        PORTB,1
    btfss    PORTB,2
    call    E3

;------------------------
;REVISA COMPUERTA AND4 DEL INTEGRADO

    bcf     PORTB,3
    bcf        PORTB,4
    btfsc     PORTB,5
    call     E4
    bcf        PORTB,3
    bsf        PORTB,4
    btfsc    PORTB,5
    call    E4
    bsf        PORTB,3
    bsf        PORTB,4
    btfss    PORTB,5
    call    E4
    goto      fin_comp


OR
    movlw    0x0D
    bsf     STATUS,RP0             ; Cambio a banco 1
    movwf    TRISA    ; configurar las entradas y salidas de la compuerta OR
    movlw     0x9B    ;
    movwf    TRISB    ;
    bcf     STATUS,RP0             ; Cambio a banco 1

    movlw    Mensaje2                ; Carga la posición del mensaje.
    call    LCD_Mensaje                ; Visualiza el mensaje.
    call Retardo_500ms

;-----------------------------------
;REVISA COMPUERTA OR1 DEL INTEGRADO

    bcf     PORTA,3
    bcf        PORTA,2
    btfsc     PORTA,1
    call     E1
    bcf        PORTA,3
    bcf        PORTA,2
    btfss    PORTA,1
    call    E1
    bsf        PORTA,3
    bsf        PORTA,2
    btfss    PORTA,1
    call    E1

;-----------------------------------
;REVISA COMPUERTA OR2 DEL INTEGRADO

    bcf     PORTA,0
    bcf        PORTB,7
    btfsc     PORTB,6
    call     E2
    bcf        PORTA,0
    bcf        PORTB,7
    btfss    PORTB,6
    call    E2
    bsf        PORTA,0
    bsf        PORTB,7
    btfss    PORTB,6
    call    E2

;-----------------------------------
;REVISA COMPUERTA OR3 DEL INTEGRADO

    bcf     PORTB,0
    bcf        PORTB,1
    btfsc     PORTB,2
    call     E3
    bcf        PORTB,0
    bcf        PORTB,1
    btfss    PORTB,2
    call    E3
    bsf        PORTB,0
    bsf        PORTB,1
    btfss    PORTB,2
    call    E3

;-----------------------------------
;REVISA COMPUERTA OR4 DEL INTEGRADO
    
    bcf     PORTB,3
    bcf        PORTB,4
    btfsc     PORTB,5
    call     E4
    bcf        PORTB,3
    bcf        PORTB,4
    btfss    PORTB,5
    call    E4
    bsf        PORTB,3
    bsf        PORTB,4
    btfss    PORTB,5
    call    E4
    goto    fin_comp


NOT
    movlw    0x0A
    bsf     STATUS,RP0             ; Cambio a banco 1
    movwf    TRISA    ; configurar las entradas y salidas de la compuerta NOT
    movlw     0x95    ;
    movwf    TRISB    ;
    bcf     STATUS,RP0             ; Cambio a banco 1

    movlw    Mensaje3                ; Carga la posición del mensaje.
    call    LCD_Mensaje                ; Visualiza el mensaje.
    call Retardo_500ms

    bcf     PORTA,3
    btfss    PORTA,2
    call     E1

;-----------------------------------
;REVISA COMPUERTA NOT1 DEL INTEGRADO
    bcf     PORTA,1
    btfss    PORTA,0
    call     E1

;-----------------------------------
;REVISA COMPUERTA NOT2 DEL INTEGRADO
    bcf     PORTB,7
    btfss    PORTB,6
    call     E2

;-----------------------------------
;REVISA COMPUERTA NOT3 DEL INTEGRADO
    bcf     PORTB,0
    btfss    PORTB,1
    call     E3

;-----------------------------------
;REVISA COMPUERTA NOT4 DEL INTEGRADO
    bcf     PORTB,2
    btfss    PORTB,3
    call     E4

;-----------------------------------
;REVISA COMPUERTA NOT5 DEL INTEGRADO    
    bcf     PORTB,4
    btfss    PORTB,5
    call     E5

;-----------------------------------
;REVISA COMPUERTA NOT6 DEL INTEGRADO
    bcf     PORTB,6
    btfss    PORTB,7
    call     E6
    goto    fin_comp

NAND
    movlw    0x0D
    bsf     STATUS,RP0             ; Cambio a banco 1
    movwf    TRISA    ; configurar las entradas y salidas de la compuerta OR
    movlw     0x9B    ;
    movwf    TRISB    ;
    bcf     STATUS,RP0             ; Cambio a banco 1

    movlw    Mensaje4            ; Carga la posición del mensaje.
    call    LCD_Mensaje            ; Visualiza el mensaje.
    call Retardo_500ms

;-----------------------------------
;REVISA COMPUERTA NAND1 DEL INTEGRADO

    bcf     PORTA,3
    bcf        PORTA,2
    btfss     PORTA,1
    call     E1
    bcf        PORTA,3
    bsf        PORTA,2
    btfss    PORTA,1
    call    E1
    bsf        PORTA,3
    bsf        PORTA,2
    btfsc    PORTA,1
    call    E1

;-----------------------------------
;REVISA COMPUERTA NAND2 DEL INTEGRADO

    bcf     PORTA,0
    bcf        PORTB,7
    btfss     PORTB,6
    call     E2
    bcf        PORTA,0
    bsf        PORTB,7
    btfss    PORTB,6
    call    E2
    bsf        PORTA,0
    bsf        PORTB,7
    btfsc    PORTB,6
    call    E2

;-----------------------------------
;REVISA COMPUERTA NAND3 DEL INTEGRADO

    bcf     PORTB,0
    bcf        PORTB,1
    btfss     PORTB,2
    call     E3
    bcf        PORTB,0
    bsf        PORTB,1
    btfss    PORTB,2
    call    E3
    bsf        PORTB,0
    bsf        PORTB,1
    btfsc    PORTB,2
    call    E3

;-----------------------------------
;REVISA COMPUERTA NAND4 DEL INTEGRADO

    bcf     PORTB,3
    bcf        PORTB,4
    btfss     PORTB,5
    call     E4
    bcf        PORTB,3
    bsf        PORTB,4
    btfss    PORTB,5
    call    E4
    bsf        PORTB,3
    bsf        PORTB,4
    btfsc    PORTB,5
    call    E4
    goto     fin_comp

NOR
    movlw    0x06
    bsf STATUS,RP0             ; Cambio a banco 1
    movwf    TRISA    ; configurar las entradas y salidas de la compuerta OR
    movlw     0xF6    ;
    movwf    TRISB    ;
    bcf STATUS,RP0             ; Cambio a banco 0

    movlw    Mensaje5                ; Carga la posición del mensaje.
    call    LCD_Mensaje                ; Visualiza el mensaje.
    call Retardo_500ms

;-----------------------------------
;REVISA COMPUERTA NOR1 DEL INTEGRADO

    bcf     PORTA,3
    bcf        PORTA,2
    btfss     PORTA,1
    call     E1
    bcf        PORTA,3
    bsf        PORTA,2
    btfsc    PORTA,1
    call    E1
    bsf        PORTA,3
    bsf        PORTA,2
    btfsc    PORTA,1
    call    E1

;-----------------------------------
;REVISA COMPUERTA NOR2 DEL INTEGRADO

    bcf     PORTA,0
    bcf        PORTB,7
    btfss     PORTB,6
    call     E2
    bcf        PORTA,0
    bsf        PORTB,7
    btfsc    PORTB,6
    call    E2
    bsf        PORTA,0
    bsf        PORTB,7
    btfsc    PORTB,6
    call    E2

;-----------------------------------
;REVISA COMPUERTA NOR3 DEL INTEGRADO

    bcf     PORTB,0
    bcf        PORTB,1
    btfss     PORTB,2
    call     E3
    bcf        PORTB,0
    bsf        PORTB,1
    btfsc    PORTB,2
    call    E3
    bsf        PORTB,0
    bsf        PORTB,1
    btfsc    PORTB,2
    call    E3

;-----------------------------------
;REVISA COMPUERTA NOR4 DEL INTEGRADO

    bcf     PORTB,3
    bcf        PORTB,4
    btfss     PORTB,5
    call     E4
    bcf        PORTB,3
    bsf        PORTB,4
    btfsc    PORTB,5
    call    E4
    bsf        PORTB,3
    bsf        PORTB,4
    btfsc    PORTB,5
    call    E4

    movlw    Mensaje5                ; Carga la posición del mensaje.
    call    LCD_Mensaje                ; Visualiza el mensaje.

XOR
    movlw    0x0D
    bsf     STATUS,RP0             ; Cambio a banco 1
    movwf    TRISA    ; configurar las entradas y salidas de la compuerta OR
    movlw     0x9B    ;
    movwf    TRISB    ;
    bcf     STATUS,RP0             ; Cambio a banco 1

    movlw    Mensaje6                ; Carga la posición del mensaje.
    call    LCD_Mensaje                ; Visualiza el mensaje.
    call Retardo_500ms

;-----------------------------------
;REVISA COMPUERTA XOR1 DEL INTEGRADO

    bcf     PORTA,3
    bcf        PORTA,2
    btfss     PORTA,1
    call     E1
    bsf        PORTA,3
    bcf        PORTA,2
    btfsc    PORTA,1
    call    E1
    bsf        PORTA,3
    bsf        PORTA,2
    btfss    PORTA,1
    call    E1

;-----------------------------------
;REVISA COMPUERTA XOR2 DEL INTEGRADO

    bcf     PORTA,0
    bcf        PORTB,7
    btfss     PORTB,6
    call     E2
    bsf        PORTA,0
    bcf        PORTB,7
    btfsc    PORTB,6
    call    E2
    bsf        PORTA,0
    bsf        PORTB,7
    btfss    PORTB,6
    call    E2

;-----------------------------------
;REVISA COMPUERTA XOR3 DEL INTEGRADO

    bcf     PORTB,0
    bcf        PORTB,1
    btfss     PORTB,2
    call     E3
    bsf        PORTB,0
    bcf        PORTB,1
    btfsc    PORTB,2
    call    E3
    bsf        PORTB,0
    bsf        PORTB,1
    btfss    PORTB,2
    call    E3

;-----------------------------------
;REVISA COMPUERTA XOR4 DEL INTEGRADO

    bcf     PORTB,3
    bcf        PORTB,4
    btfss     PORTB,5
    call     E4
    bsf        PORTB,3
    bcf        PORTB,4
    btfsc    PORTB,5
    call    E4
    bsf        PORTB,3
    bsf        PORTB,4
    btfss    PORTB,5
    call    E4
    goto     fin_comp

fin_comp
    return

;** FIN SUBRUTINA REVISIÓN DE TTLs **

;***Subrutina de Inicialización de LCD
LCD_Inicializa
    bsf        STATUS,RP0                ; Configura las líneas conectadas al pines RS,
    bcf        LCD_PinRS                ; R/W y E.
    bcf        STATUS,RP0
    bcf        LCD_PinEnable
    bsf        STATUS,RP0
    bcf        LCD_PinRW
    bcf        STATUS,RP0
    bsf        STATUS,RP0
    bcf        LCD_PinRW                ; En caso de que esté conectado le indica
                                    ; que se va a escribir en el LCD.
    bcf        STATUS,RP0
    bcf        LCD_PinEnable            ; Impide funcionamiento del LCD poniendo E=0.
    bcf     LCD_PinRS                ; Activa el Modo Comando poniendo RS=0.
    call    Retardo_200ms
    movlw    b'00111000'    
    call    LCD_Envia                ; Escribe el dato en el LCD.
    call    Retardo_5ms    
    movlw    b'00110000'    
    call    LCD_Envia
    call    Retardo_200micros
    movlw    b'00110000'    
    call    LCD_Envia
    call    Retardo_200micros        ; Este retardo es necesario para simular en PROTEUS.
    movlw    b'00110000'                ; Interface de 8 bits.
    call    LCD_Envia
    call    Retardo_20micros        ; Este retardo es necesario para simular en PROTEUS.
    
; Ahora configura el resto de los parámetros: 

    call    LCD_2Lineas8Bits5x7        ; LCD de 2 líneas y caracteres de 5x7 puntos, bus de 8.
    call    LCD_Borra                ; Pantalla encendida y limpia. Cursor al principio
    call    LCD_CursorOFF            ; de la línea 1. Cursor apagado.
    call    LCD_CursorIncr            ; Cursor en modo incrementar.
    return

;Subrutinas para inicializacion LCD

LCD_CursorOFF                        ; Pantalla encendida y cursor apagado.
    movlw    b'00001100'
    goto    LCD_EnviaComando

LCD_Borra                            ; Borra toda la pantalla, memoria DDRAM y pone el 
    movlw    b'00000001'                ; cursor a principio de la línea 1.
    goto    LCD_EnviaComando

LCD_CursorIncr                        ; Cursor en modo incrementar.
    movlw    b'00000110'
    goto    LCD_EnviaComando

LCD_2Lineas8Bits5x7                    ; Define la pantalla de 2 líneas, con caracteres
    movlw    b'00111000'                ; de 5x7 puntos y conexión al PIC mediante bus de
    goto    LCD_EnviaComando        ; 8 bits. 

LCD_EnviaComando
    bcf        LCD_PinRS                ; Activa el Modo Comando, poniendo RS=0.
    goto    LCD_Envia

Caract
    bsf        LCD_PinRS                ; Activa el "Modo Dato", poniendo RS=1.

LCD_Envia
    movwf    LCD_GuardaDato            ; Guarda el dato a enviar.
    bsf        STATUS,RP0                ; Acceso al Banco 1.
    movf    TRISD,W                    ; Guarda la configuración que tenía antes TRISD.
    movwf    LCD_GuardaTRISD
    clrf    TRISD                    ; Puerto D como salida.
    bcf        STATUS,RP0                ; Acceso al Banco 0.
;
    movf    LCD_GuardaDato,W        ; Recupera el dato a enviar.
    movwf    LCD_BusDatos            ; Envía el dato al módulo LCD.
    
    bcf        STATUS,RP0                
    bsf        LCD_PinEnable            ; Permite funcionamiento del LCD mediante un pequeño
    nop
    bcf        STATUS,RP0
    bcf        LCD_PinEnable            ; pulso y termina impidiendo el funcionamiento del LCD.
    bsf        STATUS,RP0                ; Acceso al Banco 1. Restaura el antiguo valor en
    movf    LCD_GuardaTRISD,W        ; la configuración del Puerto B.
    movwf    TRISD
    bcf        STATUS,RP0                ; Acceso al Banco 0.
    btfss    LCD_PinRS                ; Debe garantizar una correcta escritura manteniendo 
    call    Retardo_20ms            ; 2 ms en modo comando y 50 µs en modo cáracter.
    call    Retardo_50micros
    return    



; ***SUBRUTINAS DE MENSAJES***

LCD_Mensaje
    movwf    LCD_ApuntaCaracter        ; Posición del primer carácter del mensaje.
    movlw    Mensajes                ; Halla la posición relativa del primer carácter
    subwf    LCD_ApuntaCaracter,F    ; del mensaje respecto de etiqueta "Mensajes".
    decf    LCD_ApuntaCaracter,F    ; Compensa la posición que ocupa "addwf PCL,F".

LCD_VisualizaOtroCaracter
    movf    LCD_ApuntaCaracter,W
    call    Mensajes                ; Obtiene el código ASCII del carácter apuntado.
    movwf    LCD_ValorCaracter        ; Guarda el valor de carácter.
    movf    LCD_ValorCaracter,F        ; Lo único que hace es posicionar flag Z. En caso
    btfsc    STATUS,Z                ; que sea "0x00", que es código indicador final    
    goto    LCD_FinMensaje            ; de mensaje, sale fuera.

LCD_NoUltimoCaracter
    call    Caract            ; Visualiza el carácter ASCII leído.
    incf    LCD_ApuntaCaracter,F    ; Apunta a la posición del siguiente carácter 
    goto    LCD_VisualizaOtroCaracter    ; dentro del mensaje.

LCD_FinMensaje
    return

;Tabla de contenido de mensajes

Mensajes
    addwf    PCL,F
Mensaje0                            ; Mensaje de inico                            
    DT "ELIJA COMPUERTA", 0x0E        ; Terminación de mensaje
Mensaje1                            ; Mensaje compuerta AND
    DT "AND", 0x08                    ; Terminación de mensaje
Mensaje2                            ; Mensaje compuerta OR
    DT "OR", 0x08                    ; Terminación de mensaje
Mensaje3                            ; Mensaje compuerta NOT
    DT "NOT", 0x08                    ; Terminación de mensaje
Mensaje4                            ; Mensaje compuerta NAND
    DT "NAND", 0x08                    ; Terminación de mensaje
Mensaje5                            ; Mensaje compuerta NOR
    DT "NOR", 0x08                    ; Terminación de mensaje
Mensaje6                            ; Mensaje compuerta XOR
    DT "XOR", 0x08                    ; Terminación de mensaje
Mensaje7                            ; Mensaje compuerta E1
    DT "Error Compuerta1", 0x0F        ; Terminación de mensaje
Mensaje8                            ; Mensaje compuerta E2
    DT "Error Compuerta2", 0x0F        ; Terminación de mensaje
Mensaje9                            ; Mensaje compuerta E3
    DT "Error Compuerta3", 0x0F        ; Terminación de mensaje
Mensaje10                            ; Mensaje compuerta E4
    DT "Error Compuerta4", 0x0F        ; Terminación de mensaje
Mensaje11                            ; Mensaje compuerta E5
    DT "Error Compuerta5", 0x0F        ; Terminación de mensaje
Mensaje12                            ; Mensaje compuerta E6
    DT "Error Compuerta6", 0x0F        ; Terminación de mensaje
Mensaje13                            ; Mensaje compuerta E6
    DT "¿Revisar otra?", 0x0E        ; Terminación de mensaje
FinMensajes

;Errores
E1    
    movlw    Mensaje7            ; Carga la posición del mensaje.
    call    LCD_Borra            ;borra LCD
    call    LCD_Mensaje            ; Visualiza el mensaje.
    call     Retardo_500ms
    return

E2    
    movlw    Mensaje8                ; Carga la posición del mensaje.
    call    LCD_Borra            ;borra LCD
    call    LCD_Mensaje            ; Visualiza el mensaje.
    call Retardo_500ms
    return

E3
    movlw    Mensaje9                ; Carga la posición del mensaje.
    call    LCD_Borra            ;borra LCD
    call    LCD_Mensaje            ; Visualiza el mensaje.
    call Retardo_500ms
    return

E4    
    movlw    Mensaje10            ; Carga la posición del mensaje.
    call    LCD_Borra            ;borra LCD
    call    LCD_Mensaje            ; Visualiza el mensaje.
    call Retardo_500ms
    return

E5    
    movlw    Mensaje11            ; Carga la posición del mensaje.
    call    LCD_Borra            ;borra LCD
    call    LCD_Mensaje            ; Visualiza el mensaje.
    call Retardo_500ms
    return

E6    
    movlw    Mensaje12                ; Carga la posición del mensaje.
    call    LCD_Borra            ;borra LCD
    call    LCD_Mensaje            ; Visualiza el mensaje.
    call Retardo_500ms
    return


;***RETARDOS***

; RETARDOS de 4 hasta 10 microsegundos ---------------------------------------------------
;
; A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4 MHZ,
; la llamada a subrutina "call" tarda 2 ciclos máquina, el retorno de subrutina
; "return" toma otros 2 ciclos máquina y cada instrucción "nop" tarda 1 ciclo máquina.
;
Retardo_10micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
    nop                            ; Aporta 1 ciclo máquina.
Retardo_5micros                    ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
Retardo_4micros                    ; La llamada "call" aporta 2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.
;
; RETARDOS de 20 hasta 500 microsegundos ------------------------------------------------
;
Retardo_500micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    movlw    d'164'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_200micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    movlw    d'64'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_100micros                ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'31'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_50micros                ; La llamada "call" aporta 2 ciclos máquina.
    nop                            ; Aporta 1 ciclo máquina.
    movlw    d'14'                ; Aporta 1 ciclo máquina. Este es el valor de "K".
    goto    RetardoMicros        ; Aporta 2 ciclos máquina.
Retardo_20micros                ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'5'                ; Aporta 1 ciclo máquina. Este es el valor de "K".

RetardoMicros
    movwf    R_ContA                ; Aporta 1 ciclo máquina.
Rmicros_Bucle
    decfsz    R_ContA,F            ; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar).
    goto    Rmicros_Bucle        ; Aporta (K-1)x2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.

Retardo_200ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'200'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_100ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'100'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_50ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'50'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_20ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'20'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_10ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'10'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_5ms                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'5'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_2ms                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'2'                ; Aporta 1 ciclo máquina. Este es el valor de "M".
    goto    Retardos_ms            ; Aporta 2 ciclos máquina.
Retardo_1ms                        ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'1'                ; Aporta 1 ciclo máquina. Este es el valor de "M".

Retardos_ms
    movwf    R_ContB                ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
    movlw    d'249'                ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
    movwf    R_ContA                ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
    nop                            ; Aporta KxMx1 ciclos máquina.
    decfsz    R_ContA,F            ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
    goto    R1ms_BucleInterno    ; Aporta (K-1)xMx2 ciclos máquina.
    decfsz    R_ContB,F            ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
    goto    R1ms_BucleExterno     ; Aporta (M-1)x2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.


Retardo_500ms                    ; La llamada "call" aporta 2 ciclos máquina.
    movlw    d'5'                ; Aporta 1 ciclo máquina. Este es el valor de "N".

Retardo_1Decima
    movwf    R_ContC                ; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
    movlw    d'100'                ; Aporta Nx1 ciclos máquina. Este es el valor de "M".
    movwf    R_ContB                ; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
    movlw    d'249'                ; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
    movwf    R_ContA                ; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno          
    nop                            ; Aporta KxMxNx1 ciclos máquina.
    decfsz    R_ContA,F            ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
    goto    R1Decima_BucleInterno    ; Aporta (K-1)xMxNx2 ciclos máquina.
    decfsz    R_ContB,F            ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
    goto    R1Decima_BucleExterno    ; Aporta (M-1)xNx2 ciclos máquina.
    decfsz    R_ContC,F            ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
    goto    R1Decima_BucleExterno2    ; Aporta (N-1)x2 ciclos máquina.
    return                        ; El salto del retorno aporta 2 ciclos máquina.

    final
            end
```


----------



## ericklarva (Dic 4, 2008)

```
banksel TRISA; Cambio a banco 1

;PUERTO C, CONTROL DE TECLADO MATRICIAL
movlw 0x38 ; RC3, RC4 y RC5 como entradas: columnas
movwf TRISC ; y RC2, RC1 y RC0 como salidas: filas

;PUERTOS A Y B PARA TTL TESTER, SE CONFIGURARÁN DEPENDIENDO DE LO QUE SE REQUIERA
;PUERTO D PARA BUS DE DATOS DE LCD
clrf TRISD ; Puerto D como salida
;PUERTO E PARA CONTROL DE LCD
;E0 RS
;E1 R/W
;E2 EN
clrf TRISE ; Puerto E como salida
MOVLW 0x06 ; Configura los pines de PTOA y PTOE
MOVWF ADCON1 ; como i/o digital
banksel PORTA;Cambio a banco 0
```
Pruebalo de esta forma y checas que sucede.
Saludos


----------



## Galox79 (Feb 2, 2009)

Hola respecto del mismo tema, yo lo hice con el mismo MPU pero en el puerto d y tengo problemas puesto que no me reconoce el teclado directamente. No lo registra


----------



## ben99 (Feb 2, 2009)

mas detalles de tu problema compa

saludos


----------



## Galox79 (Feb 3, 2009)

creo que mi hardware essta ok, con las pull/ups externas y todo pero no se ssi mi soft no reconoce el tecladola rutina de mi teclado es:


```
;**************************** Librería "TECLADO2.INC" ***********************************
;
; Librería de subrutinas para la gestión de un teclado organizado en una matriz de 4 x 4 y 
; conectado al Puerto B según la disposición siguiente:
;
;	 	  RC4  RC5  RC6  RC7
;		   ^    ^    ^    ^
;		|----|----|----|----|
;	RC0 -->	|  0 |  1 |  2 |  3 |
;		|----|----|----|----|
;	RC1 -->	|  4 |  5 |  6 |  7 |
;		|----|----|----|----|
;	RC2 -->	|  8 |  9 | 10 | 11 |
;		|----|----|----|----|
;	RC3 -->	| 12 | 13 | 14 | 15 |
;		|----|----|----|----|
;
; Los números que se han dibujado dentro de cada cuadrado son el orden de las teclas
; que no tienen por qué coincidir con lo serigrafiado sobre ellas. El paso del número de orden
; de la tecla al valor que hay serigrafiado sobre la misma se hace con una tabla de conversión.
;
; ZONA DE DATOS **********************************************************************
;
	CBLOCK
	Tecl_TeclaOrden				; Orden de la tecla a chequear.
	Caracter_Hex
	ENDC
Tecl_UltimaTecla	EQU	d'15'		; Valor de orden de la última tecla utilizada.

; Subrutina "Teclado_LeeHex" ************************************************************
;
; Cada tecla tiene asignado un número de orden que es contabilizado en la variable
; Tecl_TeclaOrden. Para convertir a su valor según el tipo de teclado en concreto se
; utiliza una tabla de conversión. 
; A continuación se expone la relación entre el número de orden de la tecla y los
; valores correspondientes para el teclado hexadecimal utilizado.
;
;	    ORDEN DE TECLA:		TECLADO HEX. UTILIZADO:
;		 0   1   2   3 			1  2  3  A
;		 4   5   6   7 			6  5  4  B
;		 8   9  10  11 			7  8  9  C
;		12  13  14  15 			E  0  F  D
;
; Así, en este ejemplo, la tecla "7" ocupa el orden 8, la tecla "F" ocupa el orden 14 y la
; tecla "9" el orden 10.

; Si cambia el teclado también hay cambiar de tabla de conversión.
;
; Entrada:	En (W) el orden de la tecla pulsada.
; Salida:	En (W) el valor hexadecimal para este teclado concreto.
;

	ORG	0x00E0

Tecl_ConvierteOrdenEnHex			; Según el teclado utilizado resulta:
	addwf	PCL,F
	DT	1h,2h,3h,0Ah		; Primera fila del teclado.
	DT	4h,5h,6h,0Bh		; Segunda fila del teclado
	DT	7h,8h,9h,0Ch		; Tercera fila del teclado.
	DT	0Eh,0h,0Fh,0Dh		; Cuarta fila del teclado.
Teclado_FinTablaHex
;;
;	ORG	0x0750
Teclado_LeeHex
	call	Teclado_LeeOrdenTecla	; Lee el Orden de la tecla pulsada.
	btfss	STATUS,C		; ¿Pulsa alguna tecla?, ¿C=1?
	goto	Tecl_FinLeeHex		; No, por tanto sale.
	call	Tecl_ConvierteOrdenEnHex	; Lo convierte en su valor real mediante tabla.
	movwf	Caracter_Hex
	call	Teclado_EsperaDejePulsar
	bsf	STATUS,C		; Vuelve a posicionar el Carry, porque la
Tecl_FinLeeHex				; instrucción "addwf PCL,F" lo pone a "0".
	return
;
;
; Esta tabla se sitúa al principio de la librería con el propósito de que no supere la
; posición 0FFh de memoria ROM de programa. De todas formas, en caso que así fuera 
; visualizaría el siguiente mensaje de error en el proceso de ensamblado:
;
;	IF (Teclado_FinTablaHex > 0xFFF)
;		ERROR	"Atención: La tabla ha superado el tamaño de la página de los"
;		MESSG	"primeros 256 bytes de memoria ROM. NO funcionará correctamente."
;	ENDIF
;;	
; Subrutina "Teclado_Inicializa" --------------------------------------------------------
;
; Esta subrutina configura las líneas del Puerto B según la conexión del teclado realizada
; y comprueba que no hay pulsada tecla alguna al principio.

Teclado_Inicializa
	bsf	STATUS,RP0		; Configura las líneas del puerto:
	movlw	b'11110000'		; <RC7:RC4> entradas, <RC3:RC0> salidas
	movwf	PORTD
	bcf	STATUS,RP0		; Acceso al banco 
	return
; Subrutina "Teclado_EsperaDejePulsar" --------------------------------------------------
;
;Permanece en esta subrutina mientras siga pulsada la tecla.
;
Teclado_Comprobacion	EQU	b'11110000'

Teclado_EsperaDejePulsar
	movlw	Teclado_Comprobacion	; Pone a cero las cuatro líneas de salida del 
	movwf	PORTD			; Puerto B.
Teclado_SigueEsperando
	call	Retardo_20ms		; Espera a que se estabilicen los niveles de tensión.
	movf	PORTD,W			; Lee el Puerto B.
	sublw	Teclado_Comprobacion	; Si es lo mismo que escribió es que ya no pulsa 
	btfss	STATUS,Z		; tecla alguna.
	goto	Teclado_SigueEsperando
	return
;
; Subrutina "Teclado_LeeOrdenTecla" -----------------------------------------------------
;
; Lee el teclado, obteniendo el orden de la tecla pulsada. 
;
; Salida:	En (W) el número de orden de la tecla pulsada. Además Carry se pone a "1" si
;		se pulsa una tecla ó a "0" si no se pulsa tecla alguna.
;
Teclado_LeeOrdenTecla:
	clrf	Tecl_TeclaOrden		; Todavía no ha empezado a chequear el teclado.
	movlw	b'11111110'		; Va a chequear primera fila.
Tecl_ChequeaFila			; (Ver esquema de conexión).
	movwf	PORTD			; Activa la fila correspondiente.
	call	Retardo_1ms		; Espera a que se estabilicen los niveles de tensión.
Tecl_Columna1
	btfss	PORTD,4			; Chequea la 1ª columna buscando un cero. 
	goto	Tecl_GuardaValor	; Sí, es cero y por tanto guarda su valor y sale.
	incf	Tecl_TeclaOrden,F	; Va a chequear la siguiente tecla.
Tecl_Columna2				; Repite proceso para las siguientes 
	btfss	PORTD,5			; columnas.
	goto	Tecl_GuardaValor
	incf	Tecl_TeclaOrden,F
Tecl_Columna3		
	btfss	PORTD,6
	goto	Tecl_GuardaValor
	incf	Tecl_TeclaOrden,F
Tecl_Columna4		
	btfss	PORTD,7
	goto	Tecl_GuardaValor
	incf	Tecl_TeclaOrden,F
;
; Comprueba si ha chequeado la última tecla, en cuyo caso sale. Para ello testea si
; el contenido del registro Tecl_TeclaOrden es igual al número de teclas del teclado.
;
Tecl_TerminaColumnas
	movlw	Tecl_UltimaTecla
	subwf	Tecl_TeclaOrden,W	; (W) = (Tecl_TeclaOrden)-Tecl_UltimaTecla.
	btfsc	STATUS,C		; ¿C=0?, ¿(W) negativo?, ¿(Tecl_TeclaOrden)<15?
	goto	Tecl_NoPulsada		; No, se ha llegado al final del chequeo.
	bsf	STATUS,C		; Sí. Va a chequear la siguiente fila.
	rlf	PORTD,W			; Apunta a la siguiente fila.
	goto	Tecl_ChequeaFila	
Tecl_NoPulsada
	bcf	STATUS,C		; Posiciona C=0, indicando que no ha pulsado
	goto	Tecl_FinTecladoLee	; tecla alguna y sale.
Tecl_GuardaValor
	movf	Tecl_TeclaOrden,W	; El orden de la tecla pulsada en (W) y sale.
	bsf	STATUS,C		; Como hay tecla tecla pulsada, pone C=1. 
Tecl_FinTecladoLee
	return
```

no se si deberia agregar algun otro retardo, cuando lo simulo en proteus no hay problema pero en el circuito falla y no le encuentro error


----------



## manza (Mar 17, 2009)

hola estoy haciendo esta practica necesito pulsar un boton y que el numero en el display se quede enclavado


----------



## chikyn (Abr 4, 2009)

hola gente quisiera saber si alguien tiene alguna rutina para manejo de un teclado en c (ccs) , he probado varias q andan dando vueltas por ahi pero no he podido hacer andar ninguna. el teclado q uso es de 3*4 y el pic 18f252.
muchas gracias desde ya


----------



## nachoacos (Abr 15, 2009)

hola a todos!

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, mi circuito y mi código es el siguiente. 


```
#include <18F452.h>

#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES PUT                      //Power Up Timer
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOCPD                    //No EE protection
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads

#use delay(clock=4000000,RESTART_WDT)
#use fast_io(c)

#include <KBD.C>

char a;

void main()
{
   port_b_pullups(TRUE);
   kbd_init();
   
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_oscillator(False);
   
   set_tris_c(0x00);
   
   while(1)
   {
      a=kbd_getc();
      if (a!=0)
      {
         if(a=='1')
            output_c(0x01);
         if(a=='2')
            output_c(0x02);
         if(a=='3')
            output_c(0x03);
         if(a=='4')
            output_c(0x04);
         if(a=='5')
            output_c(0x05);
         if(a=='6')
            output_c(0x06);
         if(a=='7')
            output_c(0x07);
         if(a=='8')
            output_c(0x08);
         if(a=='9')
            output_c(0x09);
         if(a=='*')
            output_c(0x0A);
         if(a=='0')
            output_c(0x00);
         if(a=='#')
            output_c(0x0B);
      }  
   }

}
```


----------



## Moyano Jonathan (Abr 15, 2009)

Che esa libreria anda bien porque no intentas con armar el circuito directamente. El proteus tiene varios bugs al simular los programas, por eso es màs recomendable armar el circuito en proto.


----------



## nachoacos (Abr 20, 2009)

OK, deja lo intento, Gracias!


----------



## Moyano Jonathan (Abr 20, 2009)

Dale ya si no anda en proto revisamos el programa


----------



## JackFlash (Jun 10, 2009)

Hola, estoy realizando un proyecto pero no he podido.
En un teclado matricial controlado por un pic, necesito detectar varias teclas pulsadas a la vez, cosa q no he podido.
se detecta si las teclas pulsadas estan en la misma fila pero en la misma columna ya no.

Les dejo el ckto
EL puerto D (abajo) es el que manda el corrimiento de un "0" 
-El "0" de la fila 3 se pierde con el "1" de la fila 2 al apretar simultaneamente esos botones.

Se puede evitar esto? ya sea por programa o circuito.

de antemano gracias


----------



## DOSMETROS (Jun 10, 2009)

El tema está en cómo lo estás barriendo. Fijate eso.

Saludos!


----------



## JackFlash (Jun 12, 2009)

mm...
y como lo arreglo?


----------



## joan2009 (Oct 18, 2009)

puedes utilizar un teclado de una calculadora
o un telefono y funciona


----------



## x3ro (Nov 4, 2009)

Amigos estoy realizando un proyecto de un control de acceso. necesito como manejo o la rutina del teclado en C para pic, 18f2550, todo esto para utilizarlo con una eeprom haciendo un estilo de cerradura. espero me peuden ayudar en algo. y gracias 

posdata: ya busque en el foro no encontre nada


----------



## Chico3001 (Nov 4, 2009)

No vas a encontrar nada por 2 razones... la primera no existen 2 aplicaciones completamente iguales... la segunda no todos usan el mismo microprocesador...

Sin embargo y como la rutina es en C supongo que ya sabes que las modificaciones necesarias son minimas, asi que puedes buscarla en este tema....

https://www.forosdeelectronica.com/f24/ccs-c-programas-hechos-mplab-proyecto-completo-20784/

saludos...


----------



## Juan89 (Nov 30, 2009)

Buenas Tardes a todos los que estan leyendo:

Tengo una duda que no me deja dormir, y menos cuando tengo que entregar mi proyecto el jueves, hahahaa, bueno la cosa es esta,:

Tengo un teclado matricial 4x3 y su respectivo decodificador, y total, me da el numero en binario, solo del 1 al 9, 

Sin embargo, lo que quiero es que al apretar un numero en el teclado matricial, el valor binario (en los leds) se mantenga hasta que aprete otro numero,.

Intenté con un latch de 4 Bits, pero no lo sostiene.  El decodificador tiene una salida, que yo nombre: detener, que se esta en ALTO (1) cuando se apreta una tecla, y BAJO, cuando se suelta, o cuando no hay nada apretado, esto para la entrada ENABLE del latch. No se si me puedan ayudar por favor, se los agradeceria bastante, ya no se si no se usar el latch de 4-bit, o hay alguna otra manera de mantener el valor fijo , hasta que otra tecla se aprete. De antemano muchas, muchas gracias.


----------



## tecnogirl (Dic 1, 2009)

Lo que describes parece correcto. Prueba por separado el chip latch (puede que este defectuoso). Saludos.


----------



## leysecarene (Dic 20, 2009)

Podes utilizar resistencias de 270 ohms de las paitas de salida hacia las de entrada y resistencias de 100K de las patitas de entrada hacia atierra, osea de pull-down. ami me funciono perfectamente.


----------



## ambiet (Feb 25, 2010)

Buenas tardes, tengo un problema con un circuito que necesito para la practica de sistemas digitales es un temporizador conectado a un teclado matricial 4x4, realmente no se como hacer eso, el circuito no debe llevar ningun pic ni dada muy avanzado solo estamos limitados a contadores registros bidireccionales y compuertas logicas, de verdad si alguien me pudiese ayudar se lo agradeseria muchisimo; ya he revisado en el foro y no hay ni un diagrama que me ayude con esto, Gracias!!!!!!!!!


----------



## MrCarlos (Feb 25, 2010)

Hola Ambient

El temporizador para que sería ? como se utilizaría, el temporizador, conectado a un teclado matricial 4x4. ?
Para qué ? Qué función desempeña, el temporizador, con respecto al teclado matricial 4x4 ?.

saludos
a sus ordenes


----------



## saiwor (Feb 25, 2010)

https://www.forosdeelectronica.com/f27/lean-esto-antes-publicar-mensaje-aqui-9002/

de verda leiste las normas....


----------



## ambiet (Feb 28, 2010)

hola que tal, es un poco enredado de explicar, la cuestion es la siguiente el temporizador tengo que trabajar a base de contadores 74LS194 son registros bidireccionales de 4 bit su salidas van conectadas a unos contadores, eso jun to con el teclado matricial me harian un supuesto temporizador, como??? alli el dilema, segun lo que entiendo unir las salidas del teclado y mandarlas a las entradas de los registros para que cuando yo introduzca un numero en el teclado este dato lo recibe el registro y de los regisros a los contadores de alli segun el dato introducido este debe contar hacia arriba o hacia abajo. 

es enredado lo se por eso pedi ayuda!!!


----------



## MrCarlos (Mar 1, 2010)

hola ambient

Pues sí que esta muy confuso, sobre todo que por mas que leo tu mensaje no logro descubrir ni imaginarme donde ó cómo se hace un temporizador con ese circuito integrado mencionado en tu mensaje.

saludos
a sus ordenes


----------



## tecnogirl (Mar 3, 2010)

ambiet dijo:


> ... el temporizador tengo que trabajar a base de contadores 74LS194 son registros bidireccionales de 4 bit su salidas van conectadas a unos contadores, eso jun to con el teclado matricial me harian un supuesto temporizador, como??? alli el dilema, segun lo que entiendo unir las salidas del teclado y mandarlas a las entradas de los registros para que cuando yo introduzca un numero en el teclado este dato lo recibe el registro y de los regisros a los contadores de alli segun el dato introducido este debe contar hacia arriba o hacia abajo ...


 
ambiet: Tu mismo estas dando la solucion. Efectivamente, el circuito que describes es un tipo de temporizador digital cuyo periodo de operacion depende del valor introducido por el teclado a cada contador (preset o precarga) via el teclado y de la frecuencia del Clock que conectes a la cadena de contadores que hagan un "conteo regresivo".

Saludos


----------



## dpancheins (Mar 3, 2010)

Estuve revisando alguno de los proyectos que realicé mientras estaba en la U, la respuesta más sensilla a tu pregunta talves la encuentres en el archivo que adjunto, es una aplicación en donde muestro en una LCD la tecla que pulso del teclado.

Espero que te sirva, es muy básico pero te ayudará en proyectos más complicados.


----------



## saikosbk (Abr 12, 2010)

Disculpa por que no checas desde lo simple iniciando prender un led
yo tengo problemas con ese pic dado que no me responde en la simulacion de proteus y con otros pic (como el 16f84) si me responde copiaando el mismo codgo solo que cambiando el #include <18f452.> a <16f84.h>


----------



## sammaael (Abr 15, 2010)

Hola a todos. Tengo el siguiente problema que me esta rompiendo la cabeza. Tengo una libreria para controlar un teclado matricial 4x3 pero algo extraño esta pasando con el. El problema es el siguiente, Mi programa deberia recoger el valor de la tecla preisonada y mostrarla en el puerto A del pic 16f84A. Cada vez que presiono un tecla sin importar cual sea el unico valor que leo en el puerto A es 9??? La verdad no tengo idea que pasa.
Espero que me puedan ayudar aca dejo el programa principal y la libreria que controla el teclado. Muchas gracias por su ayuda


```
;**************************** Librería "TECLADO.INC" ***********************************

	CBLOCK
	Tecl_TeclaOrden					; Orden de la tecla a chequear.
	ENDC

Tecl_UltimaTecla	EQU	d'11'		; Valor de orden de la última tecla utilizada.

; Subrutina "Teclado_LeeHex" ************************************************************
;
; Cada tecla tiene asignado un número de orden que es contabilizado en la variable
; Tecl_TeclaOrden. Para convertir a su valor según el tipo de teclado en concreto se
; utiliza una tabla de conversión. 
; A continuación se expone la relación entre el número de orden de la tecla y los
; valores correspondientes para el teclado hexadecimal más utilizado.
;
;	    ORDEN DE TECLA:		TECLADO HEX. UTILIZADO:
;		 0   1   2			1  2  3 
;		 3   4   5 			4  5  6 
;		 6   7  8   			7  8  9 
;		 9  10  11 			A  0  B 
;
; Así, en este ejemplo, la tecla "7" ocupa el orden 8, la tecla "F" ocupa el orden 3 y la
; tecla "9" el orden 10.

; Si cambia el teclado también hay cambiar de tabla de conversión.
;
; Entrada:	En (W) el orden de la tecla pulsada.
; Salida:	En (W) el valor hexadecimal para este teclado concreto.
;
Teclado_LeeHex
	call	Teclado_LeeOrdenTecla	; Lee el Orden de la tecla pulsada.
	btfss	STATUS,C				; ¿Pulsa alguna tecla?, ¿C=1?
	goto	Tecl_FinLeeHex			; No, por tanto sale.
	call	Tecl_ConvierteOrdenEnHex	; Lo convierte en su valor real mediante tabla.
	bsf		STATUS,C				; Vuelve a posicionar el Carry, porque la
Tecl_FinLeeHex						; instrucción "addwf PCL,F" lo pone a "0".
	return
;
Tecl_ConvierteOrdenEnHex			; Según el teclado utilizado resulta:
	addwf	PCL,F
	DT	1h,2h,3h				; Primera fila del teclado.
	DT	4h,5h,6h				; Segunda fila del teclado
	DT	7h,8h,9h				; Tercera fila del teclado.
	DT	0Ah,0h,0Bh				; Cuarta fila del teclado.
Teclado_FinTablaHex
;
; Esta tabla se sitúa al principio de la librería con el propósito de que no supere la
; posición 0FFh de memoria ROM de programa. De todas formas, en caso que así fuera 
; visualizaría el siguiente mensaje de error en el proceso de ensamblado:
;
	IF (Teclado_FinTablaHex > 0xFF)
		ERROR	"Atención: La tabla ha superado el tamaño de la página de los"
		MESSG	"primeros 256 bytes de memoria ROM. NO funcionará correctamente."
	ENDIF
	
; Subrutina "Teclado_Inicializa" --------------------------------------------------------
;
; Esta subrutina configura las líneas del Puerto B según la conexión del teclado realizada
; y comprueba que no hay pulsada tecla alguna al principio.

Teclado_Inicializa
	bsf		STATUS,RP0				; Configura las líneas del puerto:
	movlw	b'01110000'				; <RB7:RB4> entradas, <RB3:RB0> salidas
	movwf	PORTB
	bcf		OPTION_REG,NOT_RBPU		; Habilita resistencia de Pull-Up del Puerto B.
	bcf		STATUS,RP0				; Acceso al banco 0.
;	call	Teclado_EsperaDejePulsar
;	return
;
; Subrutina "Teclado_EsperaDejePulsar" --------------------------------------------------
;
;Permanece en esta subrutina mientras siga pulsada la tecla.
;
Teclado_Comprobacion	EQU	b'01110000'

Teclado_EsperaDejePulsar:
	movlw	Teclado_Comprobacion	; Pone a cero las cuatro líneas de salida del 
	movwf	PORTB					; Puerto B.
Teclado_SigueEsperando
	call	Retardo_20ms			; Espera a que se estabilicen los niveles de tensión.
	movf	PORTB,W					; Lee el Puerto B.
	sublw	Teclado_Comprobacion	; Si es lo mismo que escribió es que ya no pulsa 
	btfss	STATUS,Z				; tecla alguna.
	goto	Teclado_SigueEsperando
	return
;
; Subrutina "Teclado_LeeOrdenTecla" -----------------------------------------------------
;
; Lee el teclado, obteniendo el orden de la tecla pulsada. 
;
; Salida:	En (W) el número de orden de la tecla pulsada. Además Carry se pone a "1" si
;			se pulsa una tecla ó a "0" si no se pulsa tecla alguna.
;
Teclado_LeeOrdenTecla:
	clrf	Tecl_TeclaOrden			; Todavía no ha empezado a chequear el teclado.
	movlw	b'01111110'				; Va a chequear primera fila.
Tecl_ChequeaFila					; (Ver esquema de conexión).
	movwf	PORTB					; Activa la fila correspondiente.
;	call	Retardo_1ms

Tecl_Columna1
	btfss	PORTB,4					; Chequea la 1ª columna buscando un cero. 
	goto	Tecl_GuardaValor		; Sí, es cero y por tanto guarda su valor y sale.
	incf	Tecl_TeclaOrden,F		; Va a chequear la siguiente tecla.
Tecl_Columna2						; Repite proceso para las siguientes 
	btfss	PORTB,5					; columnas.
	goto	Tecl_GuardaValor
	incf	Tecl_TeclaOrden,F
Tecl_Columna3		
	btfss	PORTB,6
	goto	Tecl_GuardaValor
	incf	Tecl_TeclaOrden,F

;
; Comprueba si ha chequeado la última tecla, en cuyo caso sale. Para ello testea si
; el contenido del registro Tecl_TeclaOrden es igual al número de teclas del teclado.
;
Tecl_TerminaColumnas
	movlw	Tecl_UltimaTecla
	subwf	Tecl_TeclaOrden,W		; (W) = (Tecl_TeclaOrden)-Tecl_UltimaTecla.
	btfsc	STATUS,C				; ¿C=0?, ¿(W) negativo?, ¿(Tecl_TeclaOrden)<11?
	goto	Tecl_NoPulsada			; No, se ha llegado al final del chequeo.
	bsf		STATUS,C				; Sí. Va a chequear la siguiente fila.
	rlf		PORTB,W					; Apunta a la siguiente fila.
	goto	Tecl_ChequeaFila	
Tecl_NoPulsada
	bcf		STATUS,C				; Posiciona C=0, indicando que no ha pulsado
	goto	Tecl_FinTecladoLee		; tecla alguna y sale.
Tecl_GuardaValor
	movf	Tecl_TeclaOrden,W		; El orden de la tecla pulsada en (W) y sale.
	bsf		STATUS,C				; Como hay tecla tecla pulsada, pone C=1. 
Tecl_FinTecladoLee
	return
```

y el progrma es este


```
INCLUDE	"p16f84a.inc"
	
	
	CBLOCK	0x0C
	ENDC
		
	ORG	00
	goto	configuracion
	ORG	05
	
	
configuracion


	call	Teclado_Inicializa
	BSF	STATUS,RP0
	clrf	PORTA
	BCF	STATUS,RP0
	
	CLRF	PORTA
	CLRW
	
inicio
	clrf	PORTA
	clrw
	call	Teclado_LeeHex
	btfss	STATUS,C
	goto	inicio
	call	Teclado_EsperaDejePulsar
	call	Retardo_100ms
	movwf	PORTA
	call	Retardo_2s
	call	Retardo_2s
	goto	inicio


	INCLUDE	"TECLADO3x4.inc"
	INCLUDE	"RETARDOS.inc"
	END
```

Perdon amigos el abuso pero la verdad que ya me duele la cabeza y no consigo arreglarlo. denuevo muchas gracias

Bueno despues de perder mi ultima neurona que me quedaba encontre cual era el problema
Al parecer la libreria esta correcta... mi problema era que despues de llamar a la rutina Teclado_LeeHex la cual devuelve en W el valor de la tecla pulsada hacia otra llamada a Retardo_100ms la cual tambien ocupa W para realizar una cuenta...
Solucion: Guardar el valor obtenido de la rutina de teclado en una variable y luego utilizarla asi me olvidode lo que pasa con W 

mmmmm avergonzado me despido jajjajaj

NOTA: Por buscar un arbol en medio del bosque no vi ninguno...


----------



## miguelb (May 12, 2010)

Hola a todos soy estudiante de 4to semestre de electrónica y como deber de sistemas digitales necesito elaborar un circuito digital que mediante el uso de un teclado matricial 4x4 y un display de 16 segmentos, visualice en el display de 16 segmentos la tecla que tenga presionada en el teclado matricial 4x4, por favor me podrían guiar como puedo hacerlo, ya que no tengo idea que integrados se necesitan ni para poder armar el circuito en algún simulador.
Desde ya gracias por su ayuda.


----------



## Kenlly (May 12, 2010)

Hola a todos, estoy tratando de utilizar la herramienta KeyPad matrix del Pic Simulator IDE pero no lo logro, en mi codigo escaneo las filas una a una pero aunque presione cualquier tecla el pic de Microcontroller view no se inmuta aunque manda un 1 a un pin si tal tecla se presiona, no veo que la herramienta se configure mas que elegir que pin asignar  a las filas y las columnas, que pudiera estar mal?, Gracias de antemano.


----------



## MrCarlos (May 13, 2010)

Hola miguelb

En el Software CircuitMaker, que es un simulador, viene  un circuito de ejemplo parecido al que estás requiriendo.
Solo hay que cambiar el tipo de Display y decodificador que trae por los que tu requieres. El archivo se llama “4x4.ckt”
Para obtener el software entra a Google.com y busca el: circuit maker 2000, aparecerán barios enlaces, de algunos podrás bajar e instalar ese software en tu PC.

saludos
a sus ordenes


----------



## Victronica (May 13, 2010)

Hey muchachos.

Quiero hacer una alarma casera, pero no me funciona la libreria del teclado en proteus pero si lo he visto que funciona, quiero saber si sí les ha funcionado en el circuito, creo que hay que descomentarial una linea en la lebreria del teclado para que funcione por puerto B, pero nada.

Espero que me ayuden, Gracias.


----------



## miguelb (May 13, 2010)

Gracias ya lo encontre en CircuitMaker, pero no se cual es el decodificador a usar para el display de 16 segmentos, me podria ayudar??? y que decodificador esta usando para ese display de 7 segmentos ya que ese no es el 74ls47???


----------



## electroandres (May 13, 2010)

sino lo que podrias hacer es diseñartelo, pero ya seria mucho mas trabajo y mas $...


----------



## MrCarlos (May 13, 2010)

Hola miguelb

El circuito integrado conectado al Display de 7 segmentos en el circuito que te mencioné (4x4.ckt) no es un decodificador sino un Flip-Flop tipo D cuádruple; el Display es HEXagecimal de 7 segmentos. Nota que solo tiene 4 entradas mientras que el Display BCD tiene 7 entradas.

Creo que no hay un decodificador para Display de 16 Segmentos; aquí mismo, en el foro, alguien recomendó uno en algún tema que trata también de Display de 16 segmentos, lo puedes localizar por medio del buscador del foro.

Pero como tienes un teclado de 4x4 solo puedes obtener resultados del 0 al 15 así que puedes utilizar los de siempre, 7447 ó 7448.

Ve si te sirve el circuito contenido en la imagen adjunta.

saludos
a sus ordenes


----------



## andrealiz (Jun 14, 2010)

Hola!!  estoy haciendo un teclado matricial (sin usar pic), y bueno simulando en proteus debo conectar un reloj en una de las entradas de una compuerta AND de dos entradas. En el propetus pues el reloj es un dibujito de pulsos, pero no te dice componentes que utilizaras ni nada.. ahora que lo estoy armando en mi protoboard quisiera saber si puedo usar el N555 (que tengo uno guardado de un montaje anterior) pero no se si servira... y en el caso que si sirva, como lo conecto?? osea me refiero a los pines que trae el 555 con la entrada de la AND. Les agradezco de antemano si me pueden ayudar por favor!! 

Andrea Liz


----------



## Ricardo_c (Jul 29, 2010)

DRTK dijo:


> 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


----------



## MrCarlos (Jul 29, 2010)

Hola Ricardo_c

En los siguientes enlaces hay unos circuitos parecidos al que menciona DRTK (30/May/2008).

Mensajes #2, #4, #10, #16,https://www.forosdeelectronica.com/f25/teclado-lineal-8-teclas-mostrar-numeros-display-30789/ 
Mensaje #2,https://www.forosdeelectronica.com/f27/codificacion-teclado-38762/ 
Mensaje #5,https://www.forosdeelectronica.com/f27/circuito-muestre-display-pulsado-teclado-matricial-4x4-36577/ 
saludos
a sus ordenes


----------



## Ricardo_c (Jul 29, 2010)

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


----------



## MrCarlos (Jul 30, 2010)

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


----------



## num11 (Oct 9, 2010)

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


----------



## MrCarlos (Oct 10, 2010)

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


----------



## num11 (Oct 10, 2010)

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


----------



## MrCarlos (Oct 10, 2010)

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


----------



## num11 (Oct 10, 2010)

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

Hasta luego !!


----------



## MrCarlos (Oct 11, 2010)

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


----------



## 18f2550 (Oct 17, 2010)

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


----------



## Scooter (Oct 17, 2010)

¿Y cual es ese problema?
Nos dices el enunciado completo pero no el problema ese sencillo en el que te atascas.


----------



## 18f2550 (Oct 17, 2010)

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:


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


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


----------



## 18f2550 (Oct 17, 2010)

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:

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


----------



## Scooter (Oct 18, 2010)

Los teclados matriciales se suelen conectar sin resistencias, por ejemplo las filas a salidas y las entradas a las columnas.


----------



## 18f2550 (Oct 18, 2010)

tienen un ejemplo de la forma de conexion, les agradeceria mucho si lo pueden publicar, para asi poder guiarme mucho mejor

gracias


----------



## 18f2550 (Oct 18, 2010)

ayuda por favor


----------



## R-Mario (Oct 18, 2010)

Asi lo conectas con las resistencias, esto por si no tienes resistencias de sujecion en tu micro

http://www.automatismos-mdq.com.ar/blog/2009/07/leer-un-teclado-matricial.html

POrque no buscan tantito en internet


----------



## 18f2550 (Oct 18, 2010)

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:


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


----------



## cobain1288 (Oct 19, 2010)

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.


----------



## antiworldx (Oct 19, 2010)

Posteate el diagrama que tu conexionaste.


----------



## cobain1288 (Oct 20, 2010)

Ok ya pude hacer funcionar el teclado matricial, ahora lo que necesito es hacer que se desplieguen dos números en dos displays, para esto necesito guardar los datos en un registro.

Lo que no se es que tipo de registro usar si uno en serie o paralelo. La idea que tenemos es poner un registro en serie para que los datos se pasen cuando haya un clock. Sin embargo el clock que estamos utilizando es del decoder la salida data available.


----------



## cobain1288 (Oct 20, 2010)

Ya pude solucionar mi problema.


----------



## jaimepsantos (Oct 20, 2010)

Dinos como, nos puede servir en un futuro,,!!!
Saludos!!!


----------



## snakewather (Oct 21, 2010)

Por lo menos comparte tu diagrama y la soucion a tus problemas que hiciste para solucionarlo?


----------



## LxL (Oct 23, 2010)

Alguien sabe que CI Usar para un teclado... Que sea de la familia 74LS... O cualquiera


----------



## loloco (Oct 26, 2010)

Muy buen aporte, gracias por la ayuda.


----------



## yohis960 (Nov 16, 2010)

Hola a todos!! Bueno tengo que sacar un programa sencillo donde el usuario ingrese una clave de 4 dígitos y de ahí haga otra cosa si la clave es correcta (eso es lo de menos por el momento)...si el usuario no digita nada en el teclado el programa automáticamente pone un "#" para que la clave sea incorrecta después de un tiempo...El problema es que no quiere capturar el dato ni nada, de una pone los asteriscos y sale que está mal, iba a utilizar la eeprom interna pero primero quiero que salga la clave bien, ahí está el programa, estoy utilizando mplab y las conexiones del lcd y teclado están bien hechas porque ya hemos probado otros programas por opciones en el teclado y estan bn, es el problema de la clave el que no sirve :S les agradecería mucho la ayuda


----------



## ricber (Nov 17, 2010)

Hola,
en esta instruccion if(kdatos[0]==12&kdatos[1]==34) que seria el 12 y el 34,


----------



## Lvcios (Nov 21, 2010)

Como puedo saber si el teclado esta funcionando como debe? Bueno, en proteus conecto el teclado al pic pero solo se pone en 1 todo el puerto b y al pulsar una tecla no pasa nada. Es problema del proteus o alguna otra cosa?


----------



## Lvcios (Nov 21, 2010)

Bueno, trate de hacer algo pero no me sale. Tengo problemas con la conexión de teclado creo, o no se si es en la programación. Quiero mostrar en el lcd la tecla que acabo de pulsar. Según mi lógica el programa esta bien pero al simular en el proteus no pasa nada, solo se queda en el primer mensaje el lcd "Pulse una tecla" y cuando pulso la tecla no sale nada en el lcd.


```
#include <18F4550.h>           //Libreria del PIC
#fuses XT,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN //Configuracion de los fuses:
#use delay (clock=4000000)    //Configuramos oscilador a 4Mhz
#include <lcd.c>   //Libreria para la lcd
#include <kbd.c>   //Libreria para teclado matricial
#use fast_io(A)
#use fast_io(B)



//---------- PROGRAMA PRINCIPAL ----------------

void main ()
{
   char tecla;
   set_tris_b(0xff);
   port_b_pullups(true);
   kbd_init();
   lcd_init();
   lcd_putc("\fPulse una tecla\n");
   delay_ms(300);
   for(;;)
   {
   tecla = kbd_getc();
   printf(lcd_putc,"Tecla pulsada: %c" tecla);
   delay_ms(100);
   }
}
```

El esquema de proteus es el siguiente:






El código lo hice yo, el esquema también. Quiero mostrar lo que se pulsa en el lcd, con el manejo del lcd no tengo mucho problema, incluso ya hasta hice un contador con lcd . Pero este teclado matricial si me esta dando dolores de cabeza. 
Por favor que alguien me explique. 
Gracias de antemano.


----------



## sangreaztk (Nov 21, 2010)

Y donde haces la asignación de los pines para el teclado matricial?????????????

Ya leíste la librería kbd.c????????????????

Saludos hermano politécnico......... je!


----------



## Lvcios (Nov 21, 2010)

Estudiaré la libreria para ver que puedo captar. Gracias.


----------



## mike666 (Nov 21, 2010)

Buenas tardes señores electronicos;
Tengo una duda con un teclado matricial 4x4 y su decodificador 922

Resulta que tomo el 1er PIN que sale del teclado del lado izquierdo  y lo conecto al 
Y1, tomo del PIN 2 y lo conecto al Y2 del 922 y asi en secuencia hasta llegar al 
PIN 8 y entrada X4, utilizo capacitores de .1mf y 1 mf en en OSC y KBM respectivamente,
conecto LEDS en las salidas para ver el resultado de las teclas y nomas no me salen los numeros que deben de salir y ya he hecho varias conexiones y nomas nada,


Por cierto, se que este teclado tiene una bronca, que si presionas 1 te sale 0,
si presionas 2 te sale 1 y asi sucesivamente, pero eso es lo que quiero que salga.

Ahi si alguien me echara la mano se lo agradeceria bastante, gracias y saludos

922 datasheet

http://www.datasheetcatalog.org/datasheets/120/243040_DS.pdf

e imagen del teclado que uso


----------



## MrCarlos (Nov 21, 2010)

Hola mike666

Es muy probable que el teclado que estás utilizando no sea el adecuado para el 922 que mencionas.
Verifica con un Ohmetro qué Y conecta con qué X para poder determinar como se conectaría al 922.
Dale una visitada a este enlace, tal vez encuentres algo que te ayude.
https://www.forosdeelectronica.com/f25/circuito-matricial-mostras-letras-numeros-46078/#post392762 
saludos
a sus ordenes


----------



## mike666 (Nov 21, 2010)

Gracias Mr. Carlos, ya me puse en contacto con un profesor y me dio esta tabla
PIN  Symbol
1     ROW 2
2     ROW 3
3     COL  1
4     ROW  4
5     COL 2 
6     COL 3
7     COL 4
8     ROW 1

Tomando a partir de la izquierda.

Gracias por su respuesta y pues hay circulen la tablita
Buenas noches:  atte Mike


----------



## dep0256 (Nov 23, 2010)

Amigo tengo el mismo problema que tu, tengo echo el programa pero a la hora de pulsar una tecla no se me refleja en la lcd. Te agradeceria si lograste resolver tu programa me lo envies para poder ver cual era el error. de ante mano muchas gracias



Lvcios dijo:


> Bueno, trate de hacer algo pero no me sale. Tengo problemas con la conexión de teclado creo, o no se si es en la programación. Quiero mostrar en el lcd la tecla que acabo de pulsar. Según mi lógica el programa esta bien pero al simular en el proteus no pasa nada, solo se queda en el primer mensaje el lcd "Pulse una tecla" y cuando pulso la tecla no sale nada en el lcd.
> 
> 
> ```
> ...





Amigo tengo el mismo problema que tu, tengo echo el programa pero a la hora de pulsar una tecla no se me refleja en la lcd. Te agradeceria si lograste resolver tu programa me lo envies para poder ver cual era el error. de ante mano muchas gracias


----------



## Lvcios (Nov 23, 2010)

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.

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

```
#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.


```
#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 . 

Así queda finalmente el esquema:





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.


----------



## drriv (Nov 24, 2010)

hola, he estado buscando asuntos referentes a teclados matriciales, y me doy cuenta que las aplicaciones se dan mas con microcontroladores, no se puede usarlas directamente como elementos de salida asi como por ejemplo en un ingresador de password con flip-flop?, estaba practicando en proteus el modo de configuracion del teclado pero el error es que al presionar cualquiera de las teclas de la misma columna mi salida es uno, es decir:

  vcc    - 1 2 3               (las "rayitas" que estan debajo del 7 8 9 son salidas)
           - 4 5 6
           - 7 8 9 
              '  '  '
si presiono el 2 la salida es 1, lo mismo pasaria si presiono el 5 o el 8, entonces como sabe el flip-flop que tecla pulso?


----------



## Scooter (Nov 24, 2010)

Puedes usar uno con pocos componentes:
www.forosdeelectronica.com/f16/teclado-matricial-sin-escaneo-41901/
Luego puedes poner un codificador o lo que quieras.


----------



## kiws (Nov 24, 2010)

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


----------



## yoysoloyo (Dic 17, 2010)

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.


----------



## felicris (Dic 22, 2010)

@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


----------



## lepre3 (Dic 22, 2010)

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:


```
#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");
      }
   }
}
```


----------



## juandamendez (Dic 31, 2010)

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.



```
#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++;    
                    }
    
    
}


}
```


----------



## Chvase (Ene 8, 2011)

Lvcios dijo:


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






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!


----------



## Lvcios (Ene 8, 2011)

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!


----------



## Chvase (Ene 10, 2011)

Lvcios dijo:


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


----------



## leonalej (Ene 21, 2011)

gracias *dpancheins*. hace un tiempo que quiero saber cómo se hace para leer del teclado. Saludos


----------



## gmua (Ene 29, 2011)

juandamendez dijo:


> 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_.



nachoacos dijo:


> 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._


----------



## CarthagineS (Feb 23, 2011)

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


----------



## antiworldx (Feb 23, 2011)

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.


----------



## Scooter (Feb 23, 2011)

Pones un conector de 8 pines y listo.


----------



## Darzeck (Mar 17, 2011)

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.


----------



## MrCarlos (Mar 17, 2011)

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


----------



## Darzeck (Mar 19, 2011)

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!


----------



## MrCarlos (Mar 20, 2011)

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.


----------



## leonidas314 (Mar 21, 2011)

Chvase dijo:


> 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;
}


----------



## Darzeck (Mar 21, 2011)

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.


----------



## MrCarlos (Mar 21, 2011)

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


----------



## Darzeck (Mar 21, 2011)

Funciona como deseo, bien.

Ahora, tiene un dato retardado, que se queda en la memoria aun cuando hago el "clear" o "reset" del MR.
Debo introducir un dato de mas, para que aparezca en el display, ¿esto a que se debe?... 

Lo he probado con 2 y en el adjunto muestro con 4 displays y va de arriba hacia abajo el corrimiento.

Olvidé lo del inversor. Ya lo coloqué y funciona correctamente.
Gracias por la ayuda brindada.


----------



## Darzeck (Mar 31, 2011)

Quiero compartir el diseño que termine ya hace algunas noches con un teclado paralelo.
Esto es por si le puede llegar a servir a alguien.

El diseño adjunto.

El funcionamiento, descrito al principio.
Se inserta un digito y se muestra en el display, al siguiente digito, se recorre en el display.
El Flip-Flop cuenta con un push para el reset.
Los pulsos se mandan con 7408 al CLK del flip-flop.


----------



## Darzeck (Mar 31, 2011)

Esto probando el circuito del teclado paralelo y me salieron unos problemas en mi montaje.

Los pulsos no son mandados correctamente por el AND, estoi usando un 7421.

Me imagino que ese es el problema principal, por que el teclado funciona con el 1, 4, 8, 9 y los dempas tienen un fallo.

Alguna sugerencia en lo que intento componer un poco mi circuito.


----------



## Darzeck (Abr 1, 2011)

Solucioné lo de la entrada de los digitos con un pulso (monoastable) para filtrar el "ruido" y asi conseguir que la entrada de pulsos fuera fiel.

=D


----------



## teban2pac (Abr 21, 2011)

oye diskulpa me podrias pasar tu diagrama eske yo tengo k hacer una calculadora y estoy utilizando el mismo teklado que usaste teclado de membrana y tambien tengo el decodifcador 74922 pero no logro k me funcione lo quiero a hacer en dos displays de catodo comun muchas gracias saludosss....


----------



## dabopeyton (Abr 23, 2011)

Galox79 dijo:


> creo que mi hardware essta ok, con las pull/ups externas y todo pero no se ssi mi soft no reconoce el tecladola rutina de mi teclado es:
> 
> 
> ```
> ...



amigo una pregunta esa rutina es para .bas, pbp, asm? mi duda es esa xq necesito configurar un teclado matricial en proton y me piden guardarlo en .basic


----------



## teban2pac (Abr 27, 2011)

oie diskulpa kamarada el diagrama que hiciste sii me puede funcionar kon un teclado matricial de membrana eske e batallado y no me funciona tambien use el decodificador 74922 para el teclado y estoy usando un deocodificador 7448 para display de 7 segementos eske a mi me encargaron hacer una calculadora y keria saber si me puede funcioanr tu diagrama para el teclado saludoss


----------



## teban2pac (Abr 27, 2011)

oie diskulpa yo tambien tengo dudas sobre mi teclado pero el mio es de membrana y yo ya lo konecte con su respectivo decodifador 74c922 pero a la salida no me nada me podrias pasar tu diagrama para verificar donde tengo mi error yo tengo k hacer una calculadora saludoss.......


----------



## Darzeck (Abr 27, 2011)

Que tal teban2pac.

Podría esto ayudarte de alguna manera, pero esto también depende del diseño de tu calculadora.



teban2pac dijo:


> me puede funcionar kon un teclado matricial de membrana...



Me imagino que tu teclado de membrana es un 4x4, si es asi, el [74922] hace todo el trabajo.
Asi mismo puedes ver en el diagrama las conexiones.



teban2pac dijo:


> usando un deocodificador 7448 para display de 7 segementos


Estas utilizando de cátodo común, no hay ningun problema.
Para tus operaciones, debes de hacer arreglos correspondientes para los corrimientos y el trabajo de las operaciones, recuerda que en los displays no puedes colocar los valores superiores al 9 [ 0-9 ]



teban2pac dijo:


> me encargaron hacer una calculadora y keria saber si me puede funcioanr tu diagrama para el teclado...



Puede que te funcione.
La parte de los flip-flops es para retencion y corrimiento, utilizas los [74273] que son de tipo D, pero dependen de tu diseño.


----------



## mike666 (Abr 28, 2011)

teban2pac dijo:


> oie diskulpa yo tambien tengo dudas sobre mi teclado pero el mio es de membrana y yo ya lo konecte con su respectivo decodifador 74c922 pero a la salida no me nada me podrias pasar tu diagrama para verificar donde tengo mi error yo tengo k hacer una calculadora saludoss.......



Ahí te mando un RAR  del diagrama, espero te sirva.saludos


----------



## teban2pac (Abr 30, 2011)

oie perdon por haberte kontestado eske staba komprando el material y donde lo kompro se tardan en traermelo!!! diskulpa en el programa k hicste tu diagrama los ceros k stan en un rekuadro azul k signifikan es tierra???


----------



## teban2pac (Abr 30, 2011)

oie diskulpa no me funciona el tecladoo nose donde este mi error ya lo konecte komo viene y simplemente nomas no me sale tendras una imagen de komo armaste tu tecladoo en mi teclado viene 1 y asi hasta el 8 y dice k el 1 va a row 2 k viene siendo Y2 en el pin 2 del 74922 asii lo konecte y no me salee nada =(


----------



## mike666 (Abr 30, 2011)

teban2pac dijo:


> oie diskulpa no me funciona el tecladoo nose donde este mi error ya lo konecte komo viene y simplemente nomas no me sale tendras una imagen de komo armaste tu tecladoo en mi teclado viene 1 y asi hasta el 8 y dice k el 1 va a row 2 k viene siendo Y2 en el pin 2 del 74922 asii lo konecte y no me salee nada =(



las conexiones que tengo son:

Teclado-Pin           922-pin
1............................2
2............................3
3............................12
4............................4
5............................10
6............................8
7............................7
8............................1

Conecta 4 led en forma binaria a las salidas del 922 y conectale los capacitores donde te pida, recuerda que es debe ser uno muy pequeño como de .01pf  y otro como de 10mf si mal no recuerdo, las salidas te deben dar de 1 hasta el 16, no es exacto, ya que los símbolos en mi caso me cuentan como números, te mando unas imagenes, algo borrosas  pero espero te sirvan de algo


----------



## teban2pac (Abr 30, 2011)

oie diskulpa los capcitores van entre la 5 y la 6 vdd del 74922


----------



## mike666 (Abr 30, 2011)

si, yo puse de 0.01mf y 1mf.
bueno recuerdo si es de 0.01 ó .1


----------



## teban2pac (Abr 30, 2011)

sii ya 5 y 6 los juntos y despues los mando a tierra peroo no me sale nadaa =( !!!


----------



## mike666 (Abr 30, 2011)

esta configuración es para el teclado sólido que puse al principio, no sé honestamente si te vaya a funcionar, revisaré las últimas conexiones que tengo y a veré en que te puedo ayudar


----------



## teban2pac (Abr 30, 2011)

a ok!!! pero un chavo me dijo k siii funcionaba igual k un teclado normal nada mas k el tecklado membrana es mas fragil de usar me dijo k son las mismas konecxioness k el diagrama k me pasaste!!!


----------



## mike666 (Abr 30, 2011)

mira, estas son las conexiones restantes del 922, 
pin 9-GND
pin 18-VCC
pin  13 GND

hice un pequeño video sobre como trabajan las teclas y la salida con LEDS


----------



## teban2pac (Abr 30, 2011)

oie diskulpa los leds los pones donde van las salidas del 74922 donde va A B C D sin resistencias y a tierra vdd


----------



## mike666 (Abr 30, 2011)

de izquierda a derecha comenzando en el pin 17:
1-2-4-8
les soldé resistencia como de 360 ohms y si van a GND


----------



## teban2pac (Abr 30, 2011)

espero que sii!! eske tambien staba chekando aki mismo en el foro de komo konectarlos a un display de 7 segmentos y tampoko me funciono en el diagrama viene un CI 74ls273 k es un flipflop https://www.forosdeelectronica.com/f25/teclado-matricial-bdc-lcd-53263/#post489162 tu haz usado este programa eske nose k signifiken los 0 k van en un rekuadro de kolor azull kreo k es tierra


----------



## mike666 (Abr 30, 2011)

generalmente, en los programas rojo es voltaje y azul tierra


----------



## teban2pac (Abr 30, 2011)

sii es tierraa !!! ya lo konecte igual pero nada mas para un display para k me funcione peroo no me da nada me marka un 0 en el display y al momento k kiero poenerle un numero en el teklado no me da nada  =(


----------



## mike666 (Abr 30, 2011)

pero para el Display, me parece que tienes que ponerle primero un decodificador

y pues tambien me parece que necesitas primero hacer un arreglo de 2 flip flops y estos van a los decodificadores y de ahi a los displays


----------



## teban2pac (Abr 30, 2011)

sii ahii en el diagrama viene un flipflop k kreo k es pa ke decodifke los valores k salen del 74922 y despues esos valores los mandas al 7448


----------



## Darzeck (May 1, 2011)

Que tal teban2pac.



teban2pac dijo:


> los ceros k stan en un rekuadro azul k signifikan... tierra???




Si te refieres a los "Logic State" Si, es a tierra.


----------



## juancaca (May 11, 2011)

Hola amigos del foro

Alguien me puede colaborar con un codigo en pic basic pro el cual me multiplexe un CI74154, yo se que este integrado no prende varias salidas a la vez, pero se que por multiplexacion se puede hacer que parescan que prenden varias salidas a la vez, estoy utilizando un teclado matricial de 8x4, un pic 16f883.

Lo que quiero hacer es que cuando presione una de las teclas prenda una de las salidas y cuando presione cualquiera de las otras teclas tambien se parescan que estan encendidas.
Yo tengo trabajando el teclado y visualizando cada salida del CI74154 cada vez que oprimo una tecla.

Espero me pueda colaborar, adjunto la foto del esquematico.

Cordial saludo

Codigo del programa


```
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 26/04/2011 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
'ensayo teclado
 
anselh=0
trisa=0
porta=%00011111
 
A var portb.4
B var portb.5
C var portb.6
D var portb.7
UNO VAR portc.0
DOS VAR portc.1
TRES VAR portc.2
CUATRO VAR portc.3
CINCO VAR portc.4
SEIS VAR portc.5
SIETE VAR portc.6 
OCHO VAR portc.7
 
main: 
teclado:
low a
if UNO=0 then PORTA=0
if dos=0 then PORTA=1
if tres=0 then porta=2
if cuatro=0 then porta=3
if cinco=0 then porta=4
if seis=0 then porta=5
if siete=0 then porta=6
if ocho=0 then porta=7
high a
low b
if UNO=0 then porta=8
if dos=0 then porta=9
if tres=0 then porta=10
if cuatro=0 then porta=11
if cinco=0 then porta=12
if seis=0 then porta=13
if siete=0 then porta=14
if ocho=0 then porta=15
high b
low c
if UNO=0 then porta=16
if dos=0 then porta=17
if tres=0 then porta=18
if cuatro=0 then porta=19
if cinco=0 then porta=20
if seis=0 then porta=21
if siete=0 then porta=22
if ocho=0 then porta=23
high c
low d
if UNO=0 then porta=24
if dos=0 then porta=25
if tres=0 then porta=26
if cuatro=0 then porta=27
if cinco=0 then porta=28
if seis=0 then porta=29
if siete=0 then porta=30
if ocho=0 then porta=31
high d
pause 10
goto teclado
end
```


----------



## ELKINMAYID (May 22, 2011)

Buenas
soy nuevo en el foro y necesito ayuda para hacer el sigueinte proyecto
con un 89c51 necesito mostrar en una lcd de 16x2 un numero que sea oprimido en el teclado 4x4....
hasta el momento he buscado informacion de como funciona la lcd, incluso vi un codigo en asm de un "hola mundo" y lo simule en proteus, pero no me funciona.. les agradeceria si me ayudan


----------



## Chvase (May 23, 2011)

Sabes.......con el 16f877a no hay ningun problema con esa libreria, de hecho yo tengo hasta dos librerias que puedo usar.......

Debido a que se hicieron algunas modificaciones al 16f887, que segun es el hermano mayor del 16f877a, a la hora de la migracion viene el problema, ya que tienes que configurar los pines del puerto B para poder utilizar las interrupciones en el teclado. Esa parte se me ha complicado, y a la fecha no eh podido hacer adnar el teclado en el 887, que para mi es un dispositivo muy poderoso, ya que no hay necesidad de colocarle un oscilador, ya que lo tiene internamente, aparte de ser mas economico, todo funciona perfectamente hasta que queires configurar el teclado, si alguien sabes como configurarlo lo agradecere.

no soy un experto en el 877a pero si necesitan algo no duden en preguntar.


----------



## tavotlokot (May 26, 2011)

Tengo un problema.
Me compila bien el código el CCS pero en el Proteus no hace nada el teclado.
Le pongo cualquier dígito y no sale nada.
A ver si pueden ayudarme.


```
#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");
      }
   }
}
```


----------



## GABAVAGA (May 30, 2011)

una cosa a la hora de hacer el montaje np hay problema que el 74c922 se de la familia cmos y el resto sea ttl


----------



## MrCarlos (May 30, 2011)

Hola GABAVAGA

En las hojas de datos del MM74C922 dice que este es de la familia CMOS y que es compatible con la familia LPTTL, que quien sabe qué será. es probable que quiera decir *L*ow *P*ower *TTL.*

saludos
a sus ordenes


----------



## GABAVAGA (May 31, 2011)

bueno... problema es q necesito crear mediante compuertas un decodificador o un metodo que me permita decodificar  o conocer el numero qeu ha sido pulsado en un teclado matricial 3x4 sin usar el 74c922 o cuanquier key encoder  intente hacer las ecuaciones logicas y ok no son muchas pero a la hora de construir el circuito queda demasiado mostro  y no puedo simplificar con mapas k xq son siete ¡¡¡¡ variables con el otro metodo en el que se agrupan el nuimero de unos tampoco porque siempre es el mismo numero (5unos)...... si alguin sabe un metodo por fa ayuda


----------



## alva edison (Jun 1, 2011)

andrealiz dijo:


> Hola!!  estoy haciendo un teclado matricial (sin usar pic), y bueno simulando en proteus debo conectar un reloj en una de las entradas de una compuerta AND de dos entradas. En el propetus pues el reloj es un dibujito de pulsos, pero no te dice componentes que utilizaras ni nada.. ahora que lo estoy armando en mi protoboard quisiera saber si puedo usar el N555 (que tengo uno guardado de un montaje anterior) pero no se si servira... y en el caso que si sirva, como lo conecto?? osea me refiero a los pines que trae el 555 con la entrada de la AND. Les agradezco de antemano si me pueden ayudar por favor!!
> 
> Andrea Liz





Hola Andrea, no se si ya solucionaste tu duda con respecto al N555, en caso de que no; debes saber si usaras flanco de subida y de bajada. Te tengo una propuesta, porque no me das tu correo y yo te envio un pdf donde te explican como usarlo y ademas del circuito a usar,  pero me gustaria que me compartieras como usar el teclado sin el pic. He intentando y no he podido. 

Si deseas, mi correo es 










, me envias un inbox y nos ponemos en contacto, o me pones un mensajito por el mismo foro.  Espero tu respuesta.

Por el momento solo te puedo adjuntar esto!!! el peso del articulo me impide subirlo al foro


----------



## MrCarlos (Jun 1, 2011)

Hola GABAVAGA

Entonces el que te envié por el otro tema no te sirvió?. El que viene de ejemplo en el CircuitMaker.

Ve si este te sirve.

saludos
a sus ordenes


----------



## Scooter (Jun 1, 2011)

Se puede con cuatro transistores y ocho resistencias iguales:
https://www.forosdeelectronica.com/f16/teclado-matricial-sin-escaneo-41901/


----------



## divedwin (Jun 1, 2011)

to tengo e mismo problema con el pic 18f2550 es el mismo código ejemplo. no hace nada en la simulación y me salen muchas advertencias en el proteus.......


```
#include <18f2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOMCLR
#use delay(clock= 4M)

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

//Configuración requerida para utilizar el bootloader
#define LOADER_END 0x7FF
#define LOADER_SIZE 0x6FF
#build(reset=LOADER_END+1, interrupt=LOADER_END+9)
#org 0, LOADER_END {} // nothing will replace the bootloader memory space
// Fin de la configuración



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");
      }
   }
```


----------



## gmua (Jun 2, 2011)

tavotlokot dijo:


> YO TENGO UN PROBLEMA,ME COMPILA BIEN EL CODIGO EL CCS PERO EN EL PROTEUS NO HACE NADA EL TECLADO LE PONGO CUANLQUIERDIGITO Y NO SALE NADA. AVER SI PUDIERAN AYUDARME:



Qué versión del CCS C estás usando?

Porque el código que muestras (creo que es el del libro *Compilador C CCS y Simulador PROTEUS* p.77) me funcionó perfectamente después de agregar la línea *#define use_portb_kbd TRUE* que tu también agregaste.

Lo que no he podido hacer es que me funcione el LCD con la versión 4.114, por eso te pregunto la versión que usas.

A mi me ha funcionado bien con la *4.106*.

_Saludos_.


----------



## gmua (Jun 2, 2011)

divedwin dijo:


> to tengo e mismo problema con el pic 18f2550 es el mismo codigo ejemplo. no hace nada en la simulacion y me selen muchas advertencias en el proteus.......



Hola *divedwin*, tu código solo necesita unas pequeñas modificaciones:


```
#include <18F2550.h>
[COLOR="Red"][B]#fuses XT,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOUSBDIV,NOVREGEN,NOMCLR,NOPBADEN[/B][/COLOR]
[COLOR="Red"][B]#use delay(clock= 1M)[/B][/COLOR]

[COLOR="Red"][B]#define LCD_DATA_PORT getenv("SFR:PORTC")[/B][/COLOR]
#include <lcd.c>
[COLOR="Red"][B]#define use_portb_kbd TRUE[/B][/COLOR]
#include <kbd.c>

//Configuración requerida para utilizar el bootloader
#define LOADER_END 0x7FF
#define LOADER_SIZE 0x6FF
#build(reset=LOADER_END+1, interrupt=LOADER_END+9)
#org 0, LOADER_END {} // nothing will replace the bootloader memory space
// Fin de la configuración

void main()
{
    char k;
    int x;
    
    lcd_init();
    kbd_init();
    [COLOR="Red"][B]//port_b_pullups(TRUE);[/B][/COLOR]
    
    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(1000);
            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");
        }
    }
[COLOR="Red"][B]}[/B][/COLOR]
```

*#fuses XT,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOUSBDIV,NOVREGEN,NOMCLR,NOPBADEN*
En esta línea lo mas importante es XT y NOPBADEN, porque estás usando un cristal de 4 MHz y no quieres que estén habilitados las entradas A/D del puerto B.

*#use delay(clock= 1M)*
Esta línea solo la cambié porque simulándolo a 4 MHz, el Proteus se me alenta mucho porque se sobrecarga el CPU.

*#define LCD_DATA_PORT getenv("SFRORTC")*
Con esta línea defines que el LCD irá conectado en el puerto C.

*#define use_portb_kbd TRUE*
Con esta línea defines que el Teclado irá conectado en el puerto B.

*//port_b_pullups(TRUE);*
Esta línea la comenté por que el circuito no me responde bien con las pull-ups internas habilitadas, así que las puse manualmente en el Proteus.

*}*
Te faltó un bracket 

Para simularlo en el ISIS de Proteus puedes conectar el circuito como la imagen que adjunté.

_Saludos_.

*PD*: _Como lo comenté en mi post anterior, yo no he podido hacer funcionar el LCD en el ISIS de Proteus si compilo el código con el CCS C versión 4.114_


----------



## godlc (Jun 4, 2011)

hola compañero, realmente hacer esto es relativamente facil.

te dejo este tuto para que te guies y aprendas algo si no teda yo tengo eso hecho y montado en proteus suerte.

http://es.scribd.com/doc/53592868/8/Contrasena-con-LCD-y-Teclado-4x4


----------



## GABAVAGA (Jun 11, 2011)

mrcarlos dijo:


> hola gabavaga
> 
> entonces el que te envié por el otro tema no te sirvió?. El que viene de ejemplo en el circuitmaker.
> 
> ...



una pregunta mr. Carlos me lo podrias enviar en el circuit maker Q INTENTE HACERLO EN PROTEUS Y NO ME FUNCIONA


----------



## MrCarlos (Jun 11, 2011)

Hola GABAVAGA

Espero que el que adjunto sea el que estás requiriendo.
Me podrías enviar el que tienes en ISIS de Proteus ?.
Si lo haces, envíamelo en el formato que se genera con ese simulador. Me serviría más.

saludos
a sus ordenes


----------



## GABAVAGA (Jun 11, 2011)

si ese es el problema es que el profe nos pide que el teclado tenga la configuracion de un teclado de telefono 123-456-789-*0#   siendo * y # a y b


----------



## MrCarlos (Jun 11, 2011)

Hola GABAVAGA

Entonces vas a reacomodar los botones. Cierto ?.

Seguramente no pudiste adjuntar tu archivo de ISIS de Proteus.

saludos
a sus ordenes


----------



## GABAVAGA (Jun 11, 2011)

Una pregunta como hago para modificar la posicion de los botones =/


----------



## MrCarlos (Jun 11, 2011)

Hola GBAVAGA

Haciendo DRAG con el Mouse.

Posiciona el cursor del Mouse sobre el componente que pretendes Mover.
Presiona el botón derecho del Mouse sin soltarlo arrastra(Drag) ese componente hasta donde lo quieras re-localizar.

También, es conveniente, quitar todos los alambres y mover los componentres y despues volver a conectar todo.

saludos
a sus ordenes.


----------



## GABAVAGA (Jun 11, 2011)

Si eso lo hago en el programa pero como hago para hacerlo en la diseÑo xq si lo monto en el proto el deco y las nor siguen teniendo la misma funcion y me van a dar los resultados en el display como estan en la simulacion que me pasaste no?


----------



## MrCarlos (Jun 12, 2011)

Hola GABAVAGA

Sí, efectivamente así es; cambies a donde cambies los botones, la figura en el Display será la misma que cuando estaban en el arreglo original. Siempre y cuando cada botón quede conectado a la X y a la Y donde estaban conectados.

Si lo que quieres es que cuando se presione el botón correspondiente a la A aparezca en el Display un asterisco(*)
Se tiene que hacer una circuiteria para lograrlo. *Pero cómo mostrarías ese asterisco en un Display de 7-Segmentos ?. y Este otro # ?.*
Tendrías que utilizar otro tipo de Display.
Lo mismo ocurre cuando presionas el botón correspondiente a la B.

Otra cosa: si quieres que además de que aparezcan esas figuras en el Display (*, #) obtener el código ASCII de esos caracteres hay que hacer otra circuiteria para lograrlo.

Así están conectados los botones:
Botón -> Conectado Entre X y Y:
0 -> X0-Y0
1 -> X1-Y0
2 -> X2-Y0
3 -> X3-Y0
4 -> X0-Y1
5 -> X1-Y1
6 -> X2-Y1
7 -> X3-Y1
8 -> X0-Y2
9 -> X1-Y2
A -> X2-Y2 Sé más explicita: qué quieres que haga el circuito cuando presionas el Botón “A” ?.
B -> X3-Y2 Sé más explicita: qué quieres que haga el circuito cuando presionas el Botón “B” ?.

El Nombre de los botones A y B se pueden cambiar, en CircuitMaker, entrando a “Device Properties”, “Propiedades del Dispositivo”.

saludos
a sus ordenes


----------



## GABAVAGA (Jun 12, 2011)

el problema es quo no vamos a usar borones individuales sino que es un teclado completo es decir solo tenemos un pin por columna y uno por fila


----------



## MrCarlos (Jun 12, 2011)

Hola GABAVAGA

No entiendo, qué es “borones” ?.
Solo supongo que es botones.

Dices: un pin por columna y uno por fila.
Así es el que te envié en mi mensaje #11.

Solo que para que no se vea un montón de alambres lo dibujé así como está.
Los nombres de los conectores que inician con Y son las filas.
Los nombres de los conectores que inician con X son las columnas.

Hazlo en tu simulador:

Inserta todos los botones que requieres y adjudícales su nombre.
Acomódalos como me mencionaste en tu mensaje #6
1 2 3.
4 5 6.
7 8 9.
* 0 #.
A la izquierda de esa Matriz inserta 3 conectores que nombrarás Y0, Y1, Y2.
En la parte baja de esa Matriz Inserta 3 conectores que nombrarás X0, X1, X2, X3.

Ahora conecta los botones a cada terminal de acuerdo al dibujo de mi mensaje #11.
Puedes mover los conectores para que no se vea tantos alambres cruzados.

Te debería quedar +/- como el que viene en la imagen adjunta.

No me has respondido si se deben ver en el Display el Asterisco(*) y el símbolo de Número(#)

saludos
a sus ordenes


----------



## GABAVAGA (Jun 13, 2011)

Yo creo que no me explique bien todos los numeros 
1-2-3 misma fila 
4-5-6 misma fila
7-8-9 misma fila 
*-0-#misma fila
1-4-7-* misma colomna
2-5-8-0 misma columna
3-6-9- # misma columna
asi es como debe ser xq es un teclado que ya esta armado no es que yo lo voy a armar con pulsadores,  si yo pudiera armar el teclado fino porque el ejemplo de circuit majer que me mandaste en el otro tema me servia ...=/( solo tenia que modificar la posicion de los cables


----------



## MrCarlos (Jun 13, 2011)

Hola GABAVAGA

pues entonces arribita de tu mensaje #14 está el circuito del teclado matricial 3x4.

saludos
a sus ordenes


----------



## MrCarlos (Jun 14, 2011)

Hola GABAVAGA

Espero hayas solucionado lo del teclado, si no, aquí puede estar la solución:

Vaya, cambiaste todo el contenido de tu mensaje #14. antes decía:
“Ha ok.... No se debe mostrar el * se debe mostrar a”.
No me llego ese cambio que hiciste.

pero, como dicen: no hay mal que por bien no venga.
Ahora entiendo lo que quieres. Creo.

Se requiere hacer un decodificador para que las salidas D8, D4, D2, D1 del Flip-Flop 74LS74 sean procesadas y a las salidas de ese decodificador conectar, en este caso, el Display HEXagecimal Llamado “Ahora Da” .

Reacomodando los botones como te sugerí y conectándolos en una matriz X, Y te daría:
*Con*(Presionando): * *Da:* 0 *Debe Dar:* A.
Sigue las demas columnas, aunque no es necesario.
*Con:* *Da:* *Debe Dar:*
* --> 0 ----> A
0 --> 1 ----> 0
# --> 2 ----> B
7 --> 4 ----> 7
8 --> 5 ----> 8
9 --> 6 ----> 9
4 --> 8 ----> 4
5 --> 9 ----> 5
6 --> A ----> 6
1 --> C ----> 1
2 --> D ----> 2
3 --> E ----> 3

En la imagen adjunta viene ese decodificador y los botones reconectados como tu lo mencionaste.
Espero esto te ayude a continuar con tu proyecto.

En el archivo .ZIP está contenido el circuito que fue desarrollado con el simulador CircuitMaker.

saludos
a sus ordenes


----------



## GABAVAGA (Jun 30, 2011)

Muchas gracias  ya monte otro circuito y en la simulacion todo bn pero a la hora de la verdad noooooooooooooooo funciono =( ahora me toca un motor paso a paso =( muero


----------



## MrCarlos (Jun 30, 2011)

Hola GABAVAGA

Seguramente conectaste algo mal o no lo conectaste a la hora de la verdad.

Ese motor que mencionas cuantos alambres tiene?... Que tipo es ?... Cual es la secuencia para un giro CW y para el otro sentido CCW ?.
Creo que tienes otro mensaje tratando de esto mismo; mejor vamonos para allá.
https://www.forosdeelectronica.com/f29/motor-paso-paso-selecionar-numero-pasosunipolar-58841/#post518504
Pero No acabo de ver que enviaron tus mensajes a Moderación.

Mejor responde aquí.

saludos
a sus ordenes


----------



## diego666 (Jul 3, 2011)

Hola mira este video talves y te puede ayudar.....


----------



## GABAVAGA (Jul 5, 2011)

es de seis alambres . unipolar.... el rpoblemasç es que tengo que poder selecciona rel numero de pasos que de el motor =/


----------



## MrCarlos (Jul 5, 2011)

Hola GABAVAGA

Te pregunte varias cosas pero me respondiste solo algunas.
“Ese motor que mencionas cuantos alambres tiene?... Que tipo es ?... Cual es la secuencia para un giro CW y para el otro sentido CCW ?.”

Pues bien; si tu sabes cual es la secuencia, que se le aplican a los 6 alambres, para que gire en un sentido y en el otro solo tienes que contar esos cambios que le aplicarías a esas terminales y por medio de un comparador de magnitud determinar si ya han pasado los pulsos requeridos.

saludos
a sus ordenes


----------



## GABAVAGA (Jul 5, 2011)

si disculpa MR carlos la secuencia para Cwaso 1:1000-paso 2:0100-paso 3:0010-paso 4: 0001- siendo esta la distribucion bobina 1 a-b bobina dos c-d.... los otros dos cables son un punto comun a vcc.  
y para Ccw: paso 1:0001-paso 2: 0010-paso3:0100-paso 4:1000
y gracias creo que ya lo tengo deja que haga la simu a ver que tan mal esta
la ponga mañana a eso de las 6pm cuando llegue de clase ahora me voy a dormir me toca parar,e al amanecer


----------



## BKAR (Jul 5, 2011)

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


----------



## GABAVAGA (Jul 6, 2011)

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)


----------



## MrCarlos (Jul 6, 2011)

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


----------



## GABAVAGA (Jul 7, 2011)

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


----------



## MrCarlos (Jul 7, 2011)

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


----------



## GABAVAGA (Jul 11, 2011)

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


----------



## mugenn (Jul 27, 2011)

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


----------



## nosecomosellama (Jul 27, 2011)

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


----------



## mugenn (Jul 30, 2011)

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 .


----------



## edacopa (Ago 25, 2011)

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:


```
#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.....


----------



## Tratante (Ago 25, 2011)

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


----------



## edacopa (Ago 26, 2011)

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


----------



## Tratante (Ago 26, 2011)

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


----------



## darxin (Sep 12, 2011)

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.


```
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.


----------



## LoTrOx (Oct 30, 2011)

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


----------



## deluxmigue (Oct 30, 2011)

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.


----------



## Fogonazo (Oct 30, 2011)

LoTrOx dijo:


> 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?
> ...



Averigua ¿ Que es ? y ¿ Para que sirve ? el contador en anillo.


----------



## BKAR (Oct 30, 2011)

LoTrOx dijo:


> ...hay un PIC para esto o como lo hago la coneccion?
> 
> saludos



si pregunats por PIC... claro que si ,es mas se puede hacer eso y mucho mas..
bueno cheka aki..

_https://www.forosdeelectronica.com/f25/decodificador-teclado-matricial-3x4-57372/index2.html#post521098_

plantea como esta resuelto eso de las filas y columnas para que no se cruzen...

y plasmalo en tu pic... también se puede hacer con el ADC..pero eso es diferente


----------



## lubeck (Oct 30, 2011)

amigo BKAR...

no se te olvide escribir correctamente...
eso de k o q no es bien visto...
saludos...


----------



## BELTRANCESAR (Nov 12, 2011)

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


----------



## danielquiroga (Nov 13, 2011)

Buenas noches cesar, la conexion es de la siguiente manera

los 4 primeros pines de izquierda a derecha son los de las columnas, los siguientes cuatro de las filas, de forma ascendete es decir desde uno a cuatro.

Si lo vas a conectar utilizando los pullups del puerto B entonces la conexion seria el primer pin a RB0 y asi sucesivamente hasta que llegues al pin RB7.

Te adjunto la imagen del teclado, para que te quede mas claro, si no me hice entender.


----------



## deluxmigue (Nov 13, 2011)

hola. revisa el pdf del teclado que compraste, yo compre la ves pasada uno para un proyecto y me bloqueaba el programa por lo que no lo conectaba como hiba el teclado. -.-


----------



## BELTRANCESAR (Nov 13, 2011)

Gracias, Pero entonces de los 12 pines solo conecto 8, y los otros 4 ?


----------



## mdchaparror (Nov 13, 2011)

No, El teclado del documento no es matricial como el que compraste y no funciona igual que el matricial ya que como dice en el documento es un arreglo de pulsadores.
Te tocaría ajustar el programa del pic para el teclado que compraste.
Como ya mencionaron los 8 pines del teclado matricial son de las 4 filas y las 4 columnas
mira este link
https://www.forosdeelectronica.com/f24/teclado-matricial-pic-eeprom-4136/


----------



## BELTRANCESAR (Nov 13, 2011)

Hola, es que este proyecto no es con PIC's  es a base de compueras CMOS


----------



## mdchaparror (Nov 13, 2011)

A un poco diferente con cualquier microcontrolador seria mas fácil, no sabría como ayudar con compuertas .

El teclado matricial toca estarlo escaneando para saber cual tecla se oprimió, no estoy seguro que te sirva para el proyecto que estas haciendo te tocaría cambiar toda la lógica  ya que este funciona muy diferente al del documento que mostraste.  
exitos


----------



## MrCarlos (Nov 13, 2011)

Hola BELTRANCESAR

Efectivamente. 
El teclado para: (Cekit. electrónica digital) es llamado LINEAL.
El que compraste: el teclado que yo compre es llamado MATRICIAL.

Puesto que desconozco el circuito a donde está conectado el teclado LINEAL(Cekit. electrónica digital) No puedo recomendarte algo para utilizar el teclado MATRICIAL el teclado que yo compre .

Es muy probable que se pueda substituir el que requiere tu circuito por el que compraste pero... Cómo?.
Habría que ver el tu circuito para luego definir el cómo hacerlo.

Por otra parte, donde adquiriste ese teclado, no te lo pueden cambiar ?.

El teclado que requiere tu circuito es como el de la Figura 1(Adjunta) y es el que viene en la imagen que adjuntaste(Figura 2) Nota que este es más comprensible en la figura 3(Adjunta).

El teclado MATRICIAL que compraste es como el de la figura 4(Adjunta).
Para hacer que éste de las salidas del teclado LINEAL:
Convertir a Binario natural las salidas del teclado MATRICIAL.
Con esa conversión hacer un circuito que cambie de Binario natural a decimal 1 de 10.
De esta forma tienes las mismas, más o menos, que con el teclado LINEAL.

Utilizas, para el desarrollo de tus proyectos, algún simulador ?.

saludos
a sus ordenes


----------



## BELTRANCESAR (Nov 13, 2011)

Hola, gracias por tu respuesta, pues lamentablemente no tengo simulacion del circuito, porque yo utilizo Proteus y no tiene ese teclado lineal. detodas maneras adjunto el proyecto para ser mas claro.
muchisimas gracias


----------



## MrCarlos (Nov 15, 2011)

Hola BELTRANCESAR

Y dónde puedo ver ese adjunto que mencionas?

saludos
a sus ordenes


----------



## baterod3 (Nov 22, 2011)

Hola tengo un programita en PBP para controlar teclado de 3x4 con pic 16f877a, pero al parecer no funciona correctamente las teclas se traban o resultan otros numeros q no son los q presiono, espero me pueden ayudar a resolver este incoveniente aquí les adjunto los archivos y la simulacion en proteus....gracias por ayudarme....


----------



## JUAN0238 (Dic 3, 2011)

hola a todos
estoy trabajando con un teclado matricial y un LCD, y el manejo basico de estos elementos lo entiendo bien, lo que sucede es q tengo que hacer ahora que el teclado funcione de forma similar al de un celular
es decir que si oprimo  dos veces seguidas la tecla '2', me salga la letra 'b', y asi en general, esta salida debo visualizarla en una LCD, pero el problema esta en que no se exactamente como modificar la libreria del teclado para poderle agregar más caracteres y q funcione como el de un celular

estoy usando un teclado 4x4, y la libreria la tengo ya adaptada para este teclado
solo necesito saber como agregarle mas caracteres
gracias por la atencion
adjunto una imagen del teclado, asi como de la libreria para keypad 4x4



ahora si adjunto la libreria para el teclado 4x4


----------



## elfrancho (Dic 5, 2011)

si la libreria funciona y el teclado funciona no tenes que modificarla.  Vas a tener que escribir todo eso en tu codigo. Yo lo haria de la siguiente manera:

Cuando apretas el 2, pone una "A", subis una bandera y seteas un timer para rebalse en 200 ms, cuando rebalsa el timer bajas la bandera..

De esta manera si apretas por segunda vez, checkeas si esa bandera esta en 1, si es asi cambias el caracter por una B. Caso contrario (si el timer ya bajo) significa que estas queriendo poner otra letra A..


Se entiende?


----------



## JUAN0238 (Dic 6, 2011)

gracias y ps la verdad si entiendo lo q me explica pero me surge otra duda y es q si lo hago con banderas como haria en caso de querer ingresar más de dos caracteres en cada tecla, como por ejemplo en lo celulares  que con la tecla '9', puede imprimir los caracteres "W,X,Y,Z" además del número 9
y pues como entiendo la explicacion que me has dado solo funcionaria para variarla entre dos caracteres

no se si talvez yo este interpretando mal la informacion pero agradezco si me puede aclarar esta duda


----------



## elfrancho (Dic 6, 2011)

Bueno, en vez de una bandera usas un byte y lo vas incrementando por cada pulsación!

En caso de "rebalsar" el timer, volvés a 0 ese byte !


----------



## JUAN0238 (Dic 10, 2011)

gracias por la colaboracion pero ahora necesito saber 
como hago para que solo imprima el caracter 1 segundo despues de haber pulsado la ultima tecla,
es decir si pulso 2 veces el '2' no tiene que mostrarme la 'A', y solo un segundo despues de haber terminado la pulsacion debe mostrarme la LCD el caracter 'B'

no se si me entienda lo que quiero hacer pero ps es basicamente que si sigo oprimiendo teclas en periodos menores a 1 segundo no me muestre ninguna en la LCD, y al dejarlas de pulsar si, asi por ejemplo si pulse 3 veces el siete y me detuve luego por mas de un segundo la LCD imprima una 'R', pero si la oprimo 4 veces una 'S', y así para cada tecla 

Gracias


----------



## Luqqas Towers (Dic 10, 2011)

No se si en la programación que usan tienen BOOLEANS , pero podrías utilizar eso.

PD: Podrías decirme que programa utilizas para programar pics en C detalladamente ? Posiblemente le eche un vistazo y te pueda dar una mano , se de programación en c.


----------



## JUAN0238 (Dic 11, 2011)

claro
especificamente yo uso  PIC C COMPILER


----------



## suarezheredia (Dic 21, 2011)

I NEED HELPPPPPP!!

No me funciona para nada el teclado matricial 4x3 usando la libreria KBD.c descomente la linea necesaria para usar el puerto B y nada, tambien habilito las res. pull up internas del PIC pero nada, he revisado el cableado y no funciona absolutamente nada, se supone que deberia ver cada tecla presionada en una LCD 16x2, la cual si me funciona por que tambien muestro datos provenientes de un sensor de gas y de luminosidad.

PD: No uso Proteus, lo hago directo en el protoboard!


----------



## gmua (Ene 7, 2012)

suarezheredia dijo:


> I NEED HELPPPPPP!!
> 
> No me funciona para nada el teclado matricial 4x3 usando la libreria KBD.c descomente la linea necesaria para usar el puerto B y nada, tambien habilito las res. pull up internas del PIC pero nada, he revisado el cableado y no funciona absolutamente nada, se supone que deberia ver cada tecla presionada en una LCD 16x2, la cual si me funciona por que tambien muestro datos provenientes de un sensor de gas y de luminosidad.
> 
> PD: No uso Proteus, lo hago directo en el protoboard!



- Porqué no nos pones el contenido del archivo *MQ6_KEYPAD.h*

- No nos dices que PIC estás utilizando, ni como lo estás conectando.

- Ya probaste con el ejemplo que le puse a *divedwin*, ese mismo ejemplo lo acaban de armar los 25 alumnos de mi materia de Aplicaciones de Microcontroladores, solo modificamos un poco la librería para usarla con un teclado de 4x4.

Saludos.

*PD:* _En la línea: *printf(lcd_putc,"/f Car=%c",k);* está al revés tu diagonal._


----------



## tu jefa (Ene 8, 2012)

Hola *divedwin*, tu código solo necesita unas pequeñas modificaciones:


*//port_b_pullups(TRUE);*
Esta línea la comenté por que el circuito no me responde bien con las pull-ups internas habilitadas, así que las puse manualmente en el Proteus.

Exactamente el comando esta mal aplicado al colocar la instrucción "true" le estas diciendo que "todo" el puerto b este pullup y lo que en realidad solo se aplica a los pines configurados como entradas. 

set_tris_b=(0b00001111);

port_b_pullups(0b00001111);

ó

set_tris_b=(0b11110000);

port_b_pullups(0b11110000);

saludos.


----------



## callecuatro1976 (Ene 11, 2012)

hola yo lo solucione usando el segundo ejemplo de coneccion, estan en los driver de kbd como se conecta cada pin del teclado


----------



## eldieguitocrackk (Feb 19, 2012)

Bueno, despues de que mi primer post se marchase directo a moderación..he estado investigando sobre la simulación que debo llevar a cabo,la cual es un teclado matricial, que me de en display el numero que seleccione en binario..tengo varias dudas, que agradeceria me ayudaran a resolver:

Conecto el teclado a un decodoficador, el que he visto en montajes por aqui..pero..hay alguna forma de pasar el numero del teclado que elija a binario y este salir en un display? supongo que necesitare al menos 4 displays para sacar el mayor numero por pantalla (9 --> 1001).

Tambien tengo la duda de como alimentar el montaje y si tengo que "programar" algo en el teclado matricial. Uso Proteus. Gracias.


----------



## Fogonazo (Feb 19, 2012)

Tienes a tu disposición varios post sobre la *decodificación de un teclado * y mediante varios métodos, PIC, IC aplicado, Etc.

¿ Cual es la idea de insistir en abrir un nuevo tema ?
¿ Leíste algo del IC que mencionas ?
¿ Investigaste algo sobre contadores en anillo ?


*MM74C922 / MM74C923 16-Key Encoder • 20-Key Encoder*


----------



## eldieguitocrackk (Feb 19, 2012)

Mmm como ya creo que has podido comprobar mi nivel de electrónica no es tanto como para poder entender todo eso que me dices.Insisto en el tema porque realmente necesito la ayuda y eso.No se si es que molesta o que, pero si necesito ayuda y acudo a un foro donde presupongo que me podrian ayudar/guiar sobre el asunto...Contadores de anillo?IC?..lo siento pero ya digo que no tengo ese nivel.


----------



## miguelus (Feb 19, 2012)

eldieguitocrackk dijo:


> Mmm como ya creo que has podido comprobar mi nivel de electrónica no es tanto como para poder entender todo eso que me dices.Insisto en el tema porque realmente necesito la ayuda y eso.No se si es que molesta o que, pero si necesito ayuda y acudo a un foro donde presupongo que me podrian ayudar/guiar sobre el asunto...Contadores de anillo?IC?..lo siento pero ya digo que no tengo ese nivel.



Parece que hoy todo el mundo anda buscando lo mismo. 

En otro Pos el compañero IngLouis andaba buscando algo parecido... 

Te contesto con lo mismo...

Busca la respuesta a IngLouis 
Tema ... Contador con 10 push button

He dejado un diseño con lo que solicitaís.
Está hecho con Proteus, utiliza el archiconocido 74C922.

Sal U2


----------



## eldieguitocrackk (Feb 19, 2012)

Gracias por la ayuda miguelus, he conseguido realizar un montaje con simulacion, que me funciona perfectamente, pero el orden de los numeros en el teclado, al pulsarlos...no se corresponden en el orden natural de los numeros, he estado probando entre conexiones de las filas y columnas del teclado con el decodificador y no se...no me cuadra el orden.¿Que puedo hacer?


----------



## BKAR (Feb 19, 2012)

si cambias alguna columna o fila.. modificarías todo el patrón que lleva toda esta fila o columna
o bien en la salida puedes poner una lógica de compuertas para obtener el resultado que quieres...

cuando se me entro las ganas a mi decodificador para matricial...tambien llegue al 74c922
pero cuando pregunte el precio en la tienda uff!! me desanime[derrepente no sea tu caso]
asi que me arme 
_mi teclado matricial TTL_
como también la misma idea para algo loco como esto:_https://www.forosdeelectronica.com/f27/tablero-ajedrez-electronico-32599/index3.html#post583756_


----------



## Waldo Armando (Feb 20, 2012)

Sabes si tienes un micro sea Pic o Atmel, se lo puede programar para qu funcione como un decodificador de teclado maticial, y para tu suerte existe software como en Css que ya tienen echo ese programa, solo es utilizar esa funcion y no se mostrarlo en un display, lcd o lo que sea. Pero sabes uuna cosa es mas facil hacerlo con un pic, suficiente el 16F84a, pero si quieres manejar mas datos, podrias usar el 16f877a, que tiene mucha aplicaciones, y es muy recomendable para trabajar.

La idea esta en que tu, primero decidas que microcontrolador quieres programar, te sugiero Atmel 89c52 o los pics de la serie 16Fxxx, me avisas y te doy pautas de que sofwares utilizasar y como puedes progamarlo.



Ver el archivo adjunto Teclado matricial.rarPara que veas un ejemplo te mano un software.


----------



## Hornner (Abr 13, 2012)

Me podrian dar una idea de como por medio de un teclado controlar por ejemplo el accionamiento de un rele .Quiero que al presionar una combinacion de numeros,por ejemplo 50, se realize el accionamiento.
 Tengo un conocimiento basico de programacion,solo he hecho un contador utilizando el teclado y mostrando los numeros del 0 al 9 en un display de 7 segmentos.Espero su ayuda.

Gracias.


----------



## BKAR (Abr 13, 2012)

q cosas???
si puedes mediante teclado mandar una tabla a un displasy de 7 segmentos
como no puedes gobernar un solo pin???

eso es lo primero que pense... ni siquiera se en que has echo tu código ni nada


----------



## Hornner (Abr 14, 2012)

Gracias por la respuesta.

Mi problema es que no se como hacer para que cuando yo realize cierta digitacion de dos cifras,el pic me active un led,algo parecido a una cerradura que necesita una clave de 2 digitos para abrirse.

Espero haberme explicado mas.

Gracias.


----------



## xtudioxcreativo (Abr 21, 2012)

buenas a todos quisiera saber como hago para realizar la expansion de 32 teclas con el 74c922. De verdad me interesa, lo he montado en proteus y en el protoboard pero no me funciona quisiera saber en que estoy fallando. Conecto el segundo matriz de 16 teclas pero no funciona. Por favor ayuda es que necesito porque es parte de mi proyecto de grado.


----------



## blasters (May 15, 2012)

Estoy haciendo uso de este teclado matricial en si son puros push haciendo una matriz de 3x4 el problema es que necesito que al presionar un digito se visualize en el lcd el visualizarlo no hay problema el problema es como usarlo en el puerto B ademas del codigo no uso la libreria que tiene por defecto ccs c ya que no puedo usarla o no se usarla ya que el simulador proteus no la ejecuta y solo los pines se quedan en 1 del puerto b y no captura nada hice el algoritmo basico para rastrear una tecla pero me atore y al presionar una tecla sale el valor pero no el que presiona y si presiono no se que elementos involucrados hacen un bucle infinito

Mi objetivo es que al presionar un boton el elemento presionado ya sea 1 se visualize luego otro y se visualize a la siguiente posicion del lcd mostrando el anterior asi hasta 5 digitos o por lo menos 2 ya yo vere
Me ayudaria vuestra ayuda de antemano gracias esperosea rapida la respuesta gracias
Y si pueden reducir el codigo seria perfecto gracias
Codigo:


```
#include <16f887.h> 
#use delay(clock=4000000) 
#fuses XT,NOWDT,NOPUT,NOMCLR,NOPROTECT,NOCPD,NOBROWNOUT,NOIESO,NOFCMEN,NOLVP 
#include <lcd.c> 
#use standard_io(c)
#use standard_io(d)
#use standard_io(b)

void main() 
{ 
int8 i;
int8 columna,fila,coordenada;
int a,s,x=7,z;
int co[3]={0x01,0x02,0x04};                   //Columna valor
int c [3]={pin_b0,pin_b1,pin_b2};             //Columna
int fi[4]={0x10,0x20,0x40,0x80};              //Fila valor
int f [4]={pin_b4,pin_b5,pin_b6,pin_b7};      //Fila

//int M [12]={0x11,0x12,0x14,0x21,0x22,0x24,0x41,0x42,0x44,0x81,0x82,0x84}; //Valores teclas     

set_tris_d(0x00);
set_tris_c(0x00);
set_tris_b(0x07);
lcd_init();
output_b(0x00);
printf(lcd_putc"\f");
printf(lcd_putc"   Contrasena");

while(TRUE)
{
output_b(0x07);

output_c(0x01);
if(input_b()!=0x07)
{
for(a=0;a<=2;a++)
{
if(input(c[a])==0)                    //Escanea columnas
{
columna=co[a]; 
z=c[a];                         //Guarda el valor de la columna
}
}

output_high(pin_b4);        //Escanea filas
if(input(z)==1)
{
fila=fi[s];
}
output_high(pin_b5);        //Escanea filas
if(input(z)==1)
{
fila=fi[s];
}
output_high(pin_b6);        //Escanea filas
if(input(z)==1)
{
fila=fi[s];
}
output_high(pin_b7);        //Escanea filas
if(input(z)==1)
{
fila=fi[s];
}



      delay_ms(200);      
      coordenada=columna+fila;
      delay_ms(200);
        
      if(coordenada==0x11)    //1
      {
      lcd_gotoxy(x,1);
      printf(lcd_putc"1");        
      delay_ms(500);
      x++;
      }
      if(coordenada==0x12)      //2
      {
      lcd_gotoxy(x,1);
      printf(lcd_putc"2");        
      delay_ms(500);
      x++;
      }
      if(coordenada==0x14)      //3
      {
      lcd_gotoxy(x,1);
      printf(lcd_putc"3");        
      delay_ms(500);
      x++;
      }
      if(coordenada==0x21)      //4
      {
      lcd_gotoxy(x,1);
      printf(lcd_putc"4");        
      delay_ms(500);
      x++;
      }
      if(coordenada==0x22)      //5
      {
      lcd_gotoxy(x,1);
      printf(lcd_putc"5");        
      delay_ms(500);
      x++;
      }
      if(coordenada==0x24)      //6
      {
      lcd_gotoxy(x,1);
      printf(lcd_putc"6");        
      delay_ms(500);
      x++;
      }
      if(coordenada==0x41)      //7
      {
      lcd_gotoxy(x,1);
      printf(lcd_putc"7");        
      delay_ms(500);
      x++;
      }
      if(coordenada==0x42)     //8
      {
      lcd_gotoxy(x,1);
      printf(lcd_putc"8");        
      delay_ms(500);
      x++;
      }
      if(coordenada==0x44)     //9
      {
      lcd_gotoxy(x,1);
      printf(lcd_putc"9");        
      delay_ms(500);
      x++;
      }
      if(coordenada==0x82)      //0
      {
      lcd_gotoxy(x,1);
      printf(lcd_putc"0");        
      delay_ms(500);
      x++;
      }
}  
if(x==10)
{
printf(lcd_putc"\f");
x=7;
}

}
}
```
Todavia no esta completo el codigo la meta es que quiero que se visualize la tecla presionada
y permanesca asi hasta que se presionen x digitos como una contraseña


----------



## D@rkbytes (May 16, 2012)

Saludos blasters.
Tengo un ejemplo que quizás te pueda servir.
Es para el compilador CCS PCM y se trata del uso de un teclado matricial 4x4
El programa esta pensado más o menos para lo que quieres hacer, pero manda el dato vía serial.
Solo es cuestión de que adaptes el envío de datos a un LCD.
Viene completamente documentado, incluye simulación, y el código es muy reducido.


Suerte.


----------



## felipedmh (May 17, 2012)

Hola a todos, necesito ayuda con lo siguiente: necesito mostrar en un lcd los números de un teclado 3x4, estoy usando un pic 18f452, estoy programando en C... sé lo básico de programación de pic como encender leds, adc, lcd, 7seg, puertos y cosas simples... pero estoy pegado en la parte del teclado, he buscado por todos lados algún código para guiarme pero no he tenido éxito, por favor si alguien me puede explicar como funciona un teclado matricial se lo agradecería, de antemano gracias


----------



## grossnik (May 18, 2012)

Usa el buscador.

https://www.forosdeelectronica.com/f24/solo-ejemplos-picbasicpro-proteus-39938/
https://www.forosdeelectronica.com/f24/teclado-3x4-pic-16f877a-pic-c-20575/
https://www.forosdeelectronica.com/f24/algoritmo-teclado-matricial-3x4programacion-pic-75411/

y otros que te apareceran.


----------



## mar23 (May 21, 2012)

orale *qu*e buenos programas yo tambi*é*n hice uno parecido pero ahora necesito uno igual pero en ensamblador *¿*alguien me podría ayudar o decir como*?**
*


----------



## yohis960 (May 21, 2012)

mar23 dijo:


> oraleee ke buenos programas yo tambienn hicee uno parecidoo pero ahora necesito uno igual pero en ensamblador alguien me podria ayudar o decir como



Tengo un programa en assembler de ingreso por clave y visualizacion en lcd, el problema es q no estoy segura si este es el que me servia...pero me sirvió  jejej Espero que al menos te sirva como guia


----------



## carlosmarrero (May 25, 2012)

El problema está en que el texto es muy largo para el LCD; se puede resolver de dos formas distintas. Una es :
*printf(lcd_putc,"\fEL NUMERO LEIDO ES:");
         printf(lcd_putc,"\n%u",l);
*​ y sin embargo, se come la palabra *ES*. La segunda, que yo prefiero porque me da control sobre donde quiero colocar exactamente el resultado, es:
*printf(lcd_putc,"\fEL NUMERO LEIDO ES:");
         lcd_gotoxy(1,2);
         printf(lcd_putc,"%u",l);
*​ Cualquiera de las dos funciona, aunque en ambos casos se come la palabra *ES*


----------



## cletus (May 25, 2012)

hoy les pido ayuda con un proyecto que debo hacer es un teclado matricial el problema es que no encuentro un diagrama o los elementos que nececito para armar el circuito y por eso pido ayuda para ver si alguno tiene un diagrama o una simulasion si es posible en proteus del que nececito para hacer el circuito con un pic 16f877 espero su ayuda gracias


----------



## MrCarlos (May 25, 2012)

Hola cletus

Por aquí puedes encontrar varios
_https://www.forosdeelectronica.com/f25/decodificador-teclado-matricial-3x4-57372/index2.html#post521098_
De: BEKAR
Mensaje #22
Fechado: 05/Jul/2011

_https://www.forosdeelectronica.com/f27/tablero-ajedrez-electronico-32599/index3.html#post583756_
De: BEKAR
Mensaje #52
Fechado: 21/Nov/2011

https://www.forosdeelectronica.com/f25/usar-74ls374-73573/#post642469
De: coleman20
Mensaje #1
15/Abr/2012

Y si utilizas el buscador puedes encontrar más.

saludos
a sus ordenes


----------



## cletus (May 25, 2012)

amigo muchas gracias pero ya e buscado en el foro y aun no encuentro en estos que me envias ahi no utilizan el pic 16f877a que es el que nesesito no es que no e buscado soloq ue no e encontrado por eso pido ayuda gracias  otra cosa tambien es que lo busco en asm ya que no e usado nunca el lenguaje c


----------



## D@rkbytes (May 26, 2012)

cletus dijo:


> amigo muchas gracias pero ya e buscado en el foro y aun no encuentro en estos que me envias ahi no utilizan el pic 16f877a que es el que nesesito no es que no e buscado soloq ue no e encontrado por eso pido ayuda gracias  otra cosa tambien es que lo busco en asm ya que no e usado nunca el lenguaje c


Saludos cletus
Ya que dices que no has encontrado aquí en el foro un ejemplo de teclado matricial en ensamblador,
te adjunto aquí un proyecto para el 16F877A. 
Los números de las teclas son mostrados en un display de 7 segmentos cátodo común,
usando un 7448 conectado al puerto A, y el teclado al puerto B.

PD. A la simulación le puse también un display BCD, pero solo para ver el valor HEX.
Espero te sirva.

Suerte.


----------



## cletus (May 26, 2012)

amigo darkbytes esta perfecto muchas gracias esta tal cual como lo estaba buscando


----------



## iehmoo (Jun 3, 2012)

Hola Buenas Tardes, soy nuevo en el foro, quisiera pedir su ayuda, tengo un proyecto de un teclado matricial 4x4, que después de leer el 9, empieze a contar hexadecimal, he logrado armar la parte que cuenta hasta el 9, pero no logro hacer que muestre las letras, lo estoy haciendo con un 74c922, después tengo que meter una gal (pero ahorita lo que llevo hecho es metiendole un registro después). Alguien me podría ayudar a saber como funcionaría la gal después de que manda los datos el 74c922? Si alguien tiene un código ejemplo. Gracias por su ayuda.


----------



## Apmavdus (Jun 8, 2012)

Bueno cuando se usa el PIC 18F4550 no salen los numeros. Solo se modifica la libreria KBD a continuacion pongo lo que solo se modifico y el programa.
para modifica la libreria es necesario ver donde esta ubicada y copiar el codigo por win7 no deja hacer modificaciones, ya obtenida la libreria le modificamos las conecciones y le cambiamos el nombre de la libreria, la regresamos a su ubicacion original.

```
///////////////////////////////

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

#endif

//////////////////////////////////////

y el programa queda:

////////////////////////////////////
#include <18F4550.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 48000000)       
#define use_portb_kbd TRUE
#include <LCD.c>
#include <KBD18.c>
#use fast_io(D)
#use fast_io(B)

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(50);
           printf(lcd_putc,"\f Car=%c",k); //Imprime carácter
           delay_ms(50);
           printf(lcd_putc,"\f Car=%u",k); //Imprime valor ASCII
           delay_ms(50);
           printf(lcd_putc,"\f Num=%u",x); //Imprime valor numérico
           delay_ms(50);
           lcd_putc("\fListo...\n");
         } 
      }
   }
 }
////////////////////////////////////////////
```
solo queda como hacer las connecciones en proteus.


----------



## Joaquin Daniel (Jun 9, 2012)

Hola a todos soy nuevo en electronica y tengo que programar un pic para leer un teclado matricial 4x3 a traves del puerto B, y a la salida del pic, que encienda un display 7 segmentos. Necesitaría que me ayuden, a programarlo en ccs para simularlo en proteus. No se usar se pic, pero si tengo idea de c++ y veo que son similares. Alguien me ayuda a ptogramar?? Muchas gracias!!


----------



## mar23 (Jun 11, 2012)

yohis960 dijo:


> Tengo un programa en assembler de ingreso por clave y visualizacion en lcd, el problema es q no estoy segura si este es el que me servia...pero me sirvió  jejej Espero que al menos te sirva como guia



gra*c*ias ya pude realizar un programa bastante bien en cual pod*í*a cambiar la contraseña por medio del teclado y guardarlo en la *e*eprom del pic!! gra*c*ias por tu aporte!!! me sirvio de mucho


----------



## asdrurafael (Jun 11, 2012)

Hola amigos. Espero estén bien. Tengo un problema con un pic16f877. Estoy tratando de configurar un teclado matricial y un display LCD al pic, programando en mplab y picbasic pro. Estoy configurando las 16 teclas como letras A, B, C, D, .......P. Pero al correr el programa aparece la letra E  repetidamente y llena todo el display LCD. Les agradesco si me pueden ayudar. A continuación les muestro el programa a ver si ustedes me ayudan. El pic esta conectado a un programador de pic's que tiene el teclado matricial y el LCD incluido. Gracias de antemano amigos. Lo que puedan hacer por mi. Estoy empezando a programar pic's. 


```
'hola
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 2
DEFINE LCD_RWREG PORTD
DEFINE LCD_RWBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 44

trisb=%00001111
trisd= 0
portd.0= 1
portd.1= 0
portd.2= 1

dato  var byte
tempo var byte
tempo= 50
lcdout $fe,1

inicio:
'primera fila
portb=%10000000
if portb=%10000001 then dato= "A"
if portb=%10000010 then dato= "B"
if portb=%10000100 then dato= "C"
if portb=%10001000 then dato= "D"
pause tempo

'segunda fila
portb=%01000000
if portb=%01000001 then dato= "E"
if portb=%01000010 then dato= "F"
if portb=%01000100 then dato= "G"
if portb=%01001000 then dato= "H"
pause tempo

'tercera fila
portb=%00100000
if portb=%00100001 then dato= "I"
if portb=%00100010 then dato= "J"
if portb=%00100100 then dato= "K"
if portb=%00101000 then dato= "L"
pause tempo

'cuarta fila
portb=%00010000
if portb=%00010001 then dato= "M"
if portb=%00010010 then dato= "N"
if portb=%00010100 then dato= "O"
if portb=%00011000 then dato= "P"
pause tempo

if portb=%10000000 then dato= 0
if portb=%01000000 then dato= 0
if portb=%00100000 then dato= 0
if portb=%00010000 then dato= 0
pause tempo

if dato= 0 then goto inicio
lcdout dato
dato= 0
pause tempo
goto inicio
end
```


----------



## D@rkbytes (Jun 11, 2012)

asdrurafael dijo:


> Hola amigos. Espero estén bien. Tengo un problema con un pic16f877. Estoy tratando de configurar un teclado matricial y un display LCD al pic, programando en mplab y picbasic pro. Estoy configurando las 16 teclas como letras A, B, C, D, .......P. Pero al correr el programa aparece la letra E  repetidamente y llena todo el display LCD. Les agradesco si me pueden ayudar. A continuación les muestro el programa a ver si ustedes me ayudan. El pic esta conectado a un programador de pic's que tiene el teclado matricial y el LCD incluido. Gracias de antemano amigos. Lo que puedan hacer por mi. Estoy empezando a programar pic's.



Saludos asdrurafael.

Si colocas la instrucción LCDOUT sin especificar la posición en el LCD,
siempre correra el caracter por el LCD por estar dentro de un bucle cerrado.

Prueba poniendo la instrucción LCDOUT de esta manera...

LCDOUT $FE,$80,dato ' Escribe en la línea 1 (Posc. 1)
o
LCDOUT $FE,$C0,dato ' Escribe en la línea 2 (Posc. 1)

Suerte.


----------



## Vick (Jun 12, 2012)

Yo he usado el 74c922 en algunos proyectos y es bastante fácil de usar, pero no entiendo que es exactamente lo que quieres hacer.

podrías poner un diagrama de o que tienes hasta ahora y una explicación más detallada de lo que tu circuito debe hacer?


----------



## asdrurafael (Jun 12, 2012)

Gracias Darkbytes. Muy agradecido. Voy a probar de la manera que me has indicado. Te deseo mucha salud y prosperidad.


----------



## asdrurafael (Jun 12, 2012)

Hola de nuevo amigos. Espero que se encuentren bien. Estimado Darkbytes te escribo porque la letra sigue apareciendo repetidamente pero ahora con un espacio por medio. He notado que el programa se comporta como si no ejecutara la penúltima instrucción, es decir  dato= 0, No me explico por qué, si es que fuera eso. Gracias por tu receptividad. Si observaras otro error en el programa te agradecería me corrijas. Saludos y que la pasen bien.


----------



## D@rkbytes (Jun 13, 2012)

asdrurafael dijo:


> Hola de nuevo amigos. Espero que se encuentren bien. Estimado Darkbytes te escribo porque la letra sigue apareciendo repetidamente pero ahora con un espacio por medio. He notado que el programa se comporta como si no ejecutara la penúltima instrucción, es decir  dato= 0, No me explico por qué, si es que fuera eso. Gracias por tu receptividad. Si observaras otro error en el programa te agradecería me corrijas. Saludos y que la pasen bien.


Saludos nuevamente asdurafael.

Para poder entender bien que es lo que esta pasando es necesario un esquema
de las conexiones del PIC al teclado matricial, porque hay varios tipos.
El código que implementas para manejar el teclado matricial es muy poco usual,
y existen varias formas de manejarlo.

Te adjunto una rutina sencilla 4x4 fácil de entender, y funciona bien.
Analizala y pruebala con tu entrenador, puede ser que te funcione.
Dentro del archivo viene también la simulación en ISIS del proyecto.

Suerte.


----------



## asdrurafael (Jun 13, 2012)

Gracias Darkbytes. Tu información es muy valiosa. Estoy estudiándola. Espero resolver el problema. Muy agradecido. Cuídate. Salud y bienestar son mis deseos.


----------



## vimato (Jun 14, 2012)

necesito guardar un parámetro de varios digitos en una direccion de la eeprom del pic 16f877A, esto es debido a que estoy creando un set point ( mínimo y máximo) para compararlo con un dato almacenado, ya he podido guardar parámetros en la eeprom con el teclado matricial, pero estos solo son de un dígito, estoy programando en con pic basic pro, toda la ayuda que me puedan brindar se las agradecería......

saludos


----------



## asdrurafael (Jun 14, 2012)

Amigo D@rkbytes. Espero que estés bien. Quiero preguntarte acerca del programa que me enviaste. Disculpa mi ignorancia. Cuando el programa hace el barrido lo inicia con una columna, puesta a cero. Y luego tu pones a cero una fila donde esta la tecla marcada y es la tecla que debe salir. Pero si está a cero es porque no ha sido pulsada, es lo que no entiendo, porque debería enviarse un uno (5 volts) por una columna y luego por la fila donde esta la tecla marcada salir un uno que entra en el puerto correspondiente, es la manera en que veo las cosas. Tu me dirás si estoy errado y si no es mucha molestia y me puedes dar una breve explicación para así corregir mi programa y mis errores. por lo demás el circuito de mi programador está conectado de manera semejante al del proteus tuyo excepto que yo utilizo la filas para el barrido y tu las columnas. También voy a corregir la frecuencia de operación, porque yo no he definido ninguna en el programa y tu empleas 4 mega hertz. Tampoco se que son las resistencias pullup. Bueno eso es todo. Gracias por tu receptividad. Nuevamente me despido deseandote mucha salud y paz. Pasala bien. Espero tu respuesta.


----------



## D@rkbytes (Jun 14, 2012)

asdrurafael dijo:


> Amigo D@rkbytes. Espero que estés bien. Quiero preguntarte acerca del programa que me enviaste. Disculpa mi ignorancia. Cuando el programa hace el barrido lo inicia con una columna, puesta a cero. Y luego tu pones a cero una fila donde esta la tecla marcada y es la tecla que debe salir. Pero si está a cero es porque no ha sido pulsada, es lo que no entiendo, porque debería enviarse un uno (5 volts) por una columna y luego por la fila donde esta la tecla marcada salir un uno que entra en el puerto correspondiente, es la manera en que veo las cosas. Tu me dirás si estoy errado y si no es mucha molestia y me puedes dar una breve explicación para así corregir mi programa y mis errores. por lo demás el circuito de mi programador está conectado de manera semejante al del proteus tuyo excepto que yo utilizo la filas para el barrido y tu las columnas. También voy a corregir la frecuencia de operación, porque yo no he definido ninguna en el programa y tu empleas 4 mega hertz. Tampoco se que son las resistencias pullup. Bueno eso es todo. Gracias por tu receptividad. Nuevamente me despido deseandote mucha salud y paz. Pasala bien. Espero tu respuesta.


Saludos asdurafael.
El barrido del teclado es muy sencillo, pero para que lo entiendas,
primero debes saber que es una resistencia pull up y pull down.
Una resistencia pull up es un resistor que mantiene un estado alto.
(Una terminal hacia VDD y la otra hacia el pin de entrada del PIC)
Una resistencia pull down es un resistor que mantiene un estado bajo.
(Una terminal hacia VSS y la otra hacia el pin de entrada del PIC)
No solamente se usan en los PIC, también en los chips CMOS y TTL
Se usan para mantener una referencia de voltaje definida.
Ya que al declarar los pines como entradas, quedan sin referencia de niveles.
El ejemplo del teclado que subí las usa, pero están internamente dentro del PIC.
Al puerto B se le pueden activar resistores de pull up por software,
declarando el Bit 7 del registro OPTION en 0
Es por eso que quizás no lograste entender su funcionamiento.

Sencillamente lo que se hace es así:
Para saber cual tecla se pulso, se hace un barrido.
Se pone un 0 en la primer columna y se leen las filas.
Se hace la comparación de que fila esta en 0 y esa corresponderá con la tecla pulsada.
En este caso lo que se espera cuando una tecla esta pulsada es un 0
Leídas las 4 filas, se pone en 1 la primer columna.
Se pone en 0 la siguiente columna y se vuelven a leer las filas, y así repetidamente.

Bien, pues esa es la forma en que se lee el teclado de ese ejemplo.
Espero que la explicación te haya servido.

Suerte.


----------



## asdrurafael (Jun 15, 2012)

Gracias D@rkbytes. Ya he comprendido esa parte. Ahora me queda comprender el lazo (Bucle) principal y como logra la escritura de las letras. Muy agradecido por tu colaboración, espero poder configurar bien mi programa. Salud y dicha te sean dadas siempre y donde te encuentres mi amigo.


----------



## asdrurafael (Jun 18, 2012)

Hola Amigos de nuevo con Ustedes. Espero que estén bien. Sigo trabajando con el teclado 4X4 y el display LCD. Voy bien hasta los momentos y muchas gracias a D@rkbytes y a todos Ustedes por estar ahí siempre. Que bueno poder escribirles. Pásenla bien y feliz día a todos.



Hola Amigos de Foros de Electrónica. Espero estén bien. Continuo trabajando con el display LCD y el teclado 4X4. Gracias a D@rkbytes y a todos aquí. Pásenla bien. Feliz día.


----------



## fach10 (Jun 20, 2012)

realice y programe un circuito con un 16f873A en donde activo y desactivo un relevador a diferentes lapsos de tiempo. el problema es que me pidieron que lo modificara para que a través de un teclado matricial el lapso de tiempo se modifique sin la necesidad de estar modificando el programa y volviendo a grabar el pic pero no tengo idea como capturar con el teclado ,como guardar esa información y como usarla como variable del temporizador..

alguien podria ayudarme ya busque en el foro pero no encontre nada


----------



## BKAR (Jun 20, 2012)

jeje!!! yo no paso del 16f628...
pero utilizando interrupciones por combio de estado del PUERTO?
si es que usas asm..
aqui un ejemplo del tutorial del amigo suky


----------



## asdrurafael (Jun 21, 2012)

Hola amigos. Espero que estén bien. Todavía estoy tratando de que el teclado 4x4 muestre los caracteres en el display LCD en mi programador de pic's. He corregido algunos errores en el programa en la configuración del puerto b (portb), y ya no aparecen los caractéres en forma consecutiva. Creo que el programa va bien solo que no escribe y quizás sea el tiempo de respuesta del teclado, o es las resistencias pullup. El programador viene con resistencias de 1 k conectadas a los 4 bits altos del puerto b del pic que van a las columnas del teclado y que he tomado como entradas: Portb (11110000). Pero quizá también pueda ser la instrucción LCDOUT, porque existen varias formas de utilizar esta instrucción y he probado varias y de todas maneras no escribe los caratéres. Amigo D@rkbytes si tienes alguna sugerencia te lo agradezco. He implementado el programa que me mandaste pero no he logrado que el display muestre los caractéres. También tu utilizas una instrucción que no se que hace. Es la LCDOUT $FE,82,"TECLADO 4x4". Esta instrucción la agrego y la quito y no sucede nada. Bueno es todo por los momentos. esperaré atentamente por alguna respuesta. Cuento con Ustedes y también con D@rkbytes que me ha ayudado tanto. seguiré intentado hacer que funcione. Y me disculpan   por la insistencia. me despido deseándoles lo mejor y también mucha salud y paz. hasta luego.


----------



## D@rkbytes (Jun 22, 2012)

Saludos asdurafael.


asdrurafael dijo:


> También tu utilizas una instrucción que no se que hace. Es la LCDOUT  $FE,82,"TECLADO 4x4". Esta instrucción la agrego y la quito y no sucede  nada.


En el LCD 16x2 línea 1, empiezas a escribir desde $80 hasta $8F
y en la línea 2 empiezas a escribir desde $C0 hasta $CF
Al declarar LCDOUT $FE,$82,"TECLADO 4x4" sería como escribir LCDOUT $FE,$80,"***TECLADO 4x4"
Donde los asteriscos representan los espacios en blanco.
Así ya no pongo esos tres espacios en blanco antes de escribir, y centro la palabra en el LCD.


asdrurafael dijo:


> Creo que el programa va bien solo que no escribe y quizás sea el tiempo  de respuesta del teclado, o es las resistencias pullup. El programador  viene con resistencias de 1 k conectadas a los 4 bits altos del puerto b  del pic que van a las columnas del teclado y que he tomado como  entradas: Portb (11110000). Pero quizá también pueda ser la instrucción  LCDOUT, porque existen varias formas de utilizar esta instrucción y he  probado varias y de todas maneras no escribe los caratéres. Amigo  D@rkbytes si tienes alguna sugerencia te lo agradezco. He implementado  el programa que me mandaste pero no he logrado que el display muestre  los caractéres.


Bien, pues viendo que en tu entrenador ya tienes las resistencias de pull up,
y que estan en los 4 bits altos del puerto B los cuales son usados como entradas,
veremos cambiando algunas cosas del ejemplo y esperemos que con eso te funcione.
En cuanto lo tenga listo, lo adjunto.
;**********************************************************
Modifique el programa.
Lo que hice fue simplemente invertir la rutina y la configuración del puerto.
Con estos cambios también se modifica el orden de la posición de las letras en el teclado.
Pero por código se puede colocar el dato a mostrar en la posición que se requiera.

Ahora, por lo que comentas, me queda una duda.  ¿Puedes por lo menos ver algo en el LCD?
¿Puedes ver en la primer línea la palabra TECLADO 4x4?
Si no puedes visualizar nada en el LCD, necesitas escribir un programa sencillo.
Por ejemplo el clásico Hola Mundo.

```
PAUSE 500
LCDOUT $FE,1,"Hola Mundo"
LCDOUT $FE,$C0,"Hello World"
END
```
Con este sencillo programa puedes verificar tu LCD.

Suerte y hasta luego.


----------



## asdrurafael (Jun 22, 2012)

Hola D@rkBytes. Gracias por ayudarme. Ciertamente el display muestra en la primera fila "Teclado 4x4". Pero eso es todo. No reconoce el teclado (No escribe las letras). No se que pensar. El barrido está bien configurado ahora. Te voy a mandar el programa a ver si puedes detectar algún error. En el entrenador la primera fila está al portb.3 hasta la cuarta al portb.0. A continuación te lo mando espero me disculpes por las molestias amigo D@rkBytes. Ahora me da un error al compilar y es el siguiente:

Executing: "C:\PBP\PBPW.EXE" -ampasmwin -oq -z   -p16F877 "undecimo.bas"
PICBASIC PRO(TM) Compiler 2.50a, (c) 1998, 2007 microEngineering Labs, Inc.
All Rights Reserved. 
Error[128]   C:\PBP\PBPPIC14.LIB 2942 : Missing argument(s)
Loaded C:\pic\undecimo.COD.
BUILD SUCCEEDED: Fri Jun 22 20:38:00 2012

Programa :

```
'hola
DEFINE OSC 4

DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 2
DEFINE LCD_RWREG PORTD
DEFINE LCD_RWBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50

trisb = $f0            ;%11110000
trisd = 0              ;%00000000

;Pines para las filas
symbol fila1 = portb.3
symbol fila2 = portb.2
symbol fila3 = portb.1
symbol fila4 = portb.0

;Pines para las columnas
symbol col1 = portb.4
symbol col2 = portb.5
symbol col3 = portb.6
symbol col4 = portb.7

key var byte

pause 500

lcdout $fe,1               ;limpia e inicializa el LCD
lcdout $fe,$82,"teclado 4x4"

MainLoop:
     gosub Getkey
     lcdout $fe,$c7,key
     pause 100             ;esta pausa se puede cambiar (Teclado)              
     goto MainLoop

Getkey:
;rutina para el barrido del teclado
fila1 = 0
if col1 = 0 then key = "A"
if col2 = 0 then key = "B"
if col3 = 0 then key = "C"
if col4 = 0 then key = "D"
fila1 = 1
fila2 = 0
if col1 = 0 then key = "E"
if col2 = 0 then key = "F"
if col3 = 0 then key = "G"
if col4 = 0 then key = "H"
fila2 = 1
fila3 = 0
if col1 = 0 then key = "I"
if col2 = 0 then key = "J"
if col3 = 0 then key = "K"
if col4 = 0 then key = "L"
fila3 = 1
fila4 = 0
if col1 = 0 then key = "M"
if col2 = 0 then key = "N"
if col3 = 0 then key = "O"
if col4 = 0 then key = "P"
fila4 = 1
return
end
```


----------



## asdrurafael (Jun 22, 2012)

Feliz día amigos. Gracias D@rkBytes. El error que aparecía fue porque accidentalmente borre el número "50" de la instrucción DEFINE LCD_DATAUS. También en el programa faltaba colocar en el puerto d (portd), las instrucciones portd.0= 1 para habilitar datos, asi tambien portd.1 = 0 para habilitar la escritura y también coloqué portd.2 = 1 para habilitar (Enable) el LCD, porque el LCD está conectado a estos pines en el entrenador. Aún así no escribe las letras al presionar el teclado. Aparece la letra "P" en el centro de la linea 2 del LCD y la palabra teclado 4x4 en la linea 1. Bueno otra vez te doy las gracias D@rkBytes por estar ahí. Y nuevamente me disculpo por las molestias causadas. Pásala bien amigo. Mucha salud y mucha paz son mis deseos de hoy.


----------



## D@rkbytes (Jun 23, 2012)

asdrurafael dijo:


> Feliz día amigos. Gracias D@rkBytes. El error que aparecía fue porque accidentalmente borre el número "50" de la instrucción DEFINE LCD_DATAUS. También en el programa faltaba colocar en el puerto d (portd), las instrucciones portd.0= 1 para habilitar datos, asi tambien portd.1 = 0 para habilitar la escritura y también coloqué portd.2 = 1 para habilitar (Enable) el LCD, porque el LCD está conectado a estos pines en el entrenador. Aún así no escribe las letras al presionar el teclado. Aparece la letra "P" en el centro de la linea 2 del LCD y la palabra teclado 4x4 en la linea 1


Saludos asdurafael.
Creo saber a que se debe el problema.
Si en el LCD aparece la letra P y no puedes mostrar otra letra más en el LCD.
Esto se debe a que en tu entrenador las resistencias que tiene en los bits altos del puerto B,
no están hacia VDD, no son pull up, son pull down, estan hacia VSS.
Es por eso que el barrido del teclado no esta funcionando en tu entrenador.
Verifica esto que te digo, ya que no hay otra forma para que no te funcione.
El código que adjuntaste esta correcto, solo a ese detalle se puede deber el error.

Ahora, si es lo que te menciono, ya conoces el procedimiento y fácilmente podrás corregirlo.
Tendrás que cambiar que en vez de que sea un 0 el que se espere,
sea un 1 el que se tome como valido durante el barrido del teclado para determinar la tecla pulsada.

Notas:
Un teclado matricial se comporta como un circuito abierto, hasta no presionar alguna de sus teclas.
Si te aparece siempre la letra P es porque al recorrer la matriz del teclado detecta siempre unión
entre la Fila 4 y la Columna 4, y solo puede ser porque tienes los resistores hacia VSS en el puerto B.

*Fe de erratas:*


D@rkbytes dijo:


> En el LCD 16x2 línea 1, empiezas a escribir desde $80 hasta $8F
> y en la línea 2 empiezas a escribir desde $C0 hasta $CF
> Al declarar LCDOUT $FE,$82,"TECLADO 4x4" sería como escribir LCDOUT $FE,$80,"***TECLADO 4x4"
> Donde los asteriscos representan los espacios en blanco.
> Así ya no pongo esos tres espacios en blanco antes de escribir, y centro la palabra en el LCD.


Lo correcto es:
Al declarar LCDOUT $FE,$82,"TECLADO 4x4" sería como escribir LCDOUT $FE,$80,"**TECLADO 4x4"
 Donde los asteriscos representan los espacios en blanco.
 Así ya no pongo esos dos espacios en blanco antes de escribir, y centro la palabra en el LCD.

Espero asdurafael que esto que te comento sea el problema.
Ya que esta rutina para leer un teclado 4x4 funciona, yo la implemento en otros proyectos.

Suerte y hasta luego.


----------



## asdrurafael (Jun 25, 2012)

Buenos días amigos y en particular a D@rkbytes con aprecio y respeto. Después de hacer todas las correcciones que me indicases amigo D@rkbytes llegue a la conclusión que el display LCD debe tener algún daño, por lo que mandé a pedir uno nuevo. También aproveché para pedir un pic 16f877 nuevo por si acaso sea necesario cambiarlo. Ha sido una experiencia maravillosa compartir contigo todos estos días en este emocionante mundo de los controladores electrónicos. El entrenador que estoy usando proviene de un regalo que me hicieran el día de mi cumpleaños el pasado 26 de Mayo. yo siempre quise tener uno o al menos armar algún sistema con microprocesadores que era lo que se usaba antes. En una oportunidad llegue a comprar todos los componentes para armarlo pero no sabía como programar ese sistema aunque tenía el esquema electrónico. La persona que me regaló mi entrenador actual sabía de ese proyecto que fue hace varios años. Para mi es una emoción grande poder programar estos pic's y de alli el hecho de insistir tanto con el funcionamiento de los mismos. Por eso pido sinceras disculpas por mi insistencia en la solicitud de información para el funcionamiento de los dispositivos. Apenas han pasado unas pocas semanas de mi cumpleaños (menos de un mes) y ya quise "correr" en esto de la programación. Gracias por toda tu colaboración. Estoy a la espera de los dispositivos que pedí y estoy a la orden para cualquier necesidad que se presente en algún requerimiento de la comunidad de electrónicos. Feliz día y mucha salud prosperidad y paz a todos D@rkbytes.


----------



## D@rkbytes (Jun 25, 2012)

asdrurafael dijo:


> Buenos días amigos y en particular a D@rkbytes con aprecio y respeto. Después de hacer todas las correcciones que me indicases amigo D@rkbytes llegue a la conclusión que el display LCD debe tener algún daño, por lo que mandé a pedir uno nuevo. También aproveché para pedir un pic 16f877 nuevo por si acaso sea necesario cambiarlo. Ha sido una experiencia maravillosa compartir contigo todos estos días en este emocionante mundo de los controladores electrónicos. El entrenador que estoy usando proviene de un regalo que me hicieran el día de mi cumpleaños el pasado 26 de Mayo. yo siempre quise tener uno o al menos armar algún sistema con microprocesadores que era lo que se usaba antes. En una oportunidad llegue a comprar todos los componentes para armarlo pero no sabía como programar ese sistema aunque tenía el esquema electrónico. La persona que me regaló mi entrenador actual sabía de ese proyecto que fue hace varios años. Para mi es una emoción grande poder programar estos pic's y de alli el hecho de insistir tanto con el funcionamiento de los mismos. Por eso pido sinceras disculpas por mi insistencia en la solicitud de información para el funcionamiento de los dispositivos. Apenas han pasado unas pocas semanas de mi cumpleaños (menos de un mes) y ya quise "correr" en esto de la programación. Gracias por toda tu colaboración. Estoy a la espera de los dispositivos que pedí y estoy a la orden para cualquier necesidad que se presente en algún requerimiento de la comunidad de electrónicos. Feliz día y mucha salud prosperidad y paz a todos D@rkbytes.


Saludos nuevamente asdurafael.

Y pues aunque algo tarde. *¡Muchas felicidades por tu cumpleaños!* 

Mientras tanto, y en lo que te llega el material para que sigas con tu proyecto,
sigue estudiando :estudiando: para que comprendas mejor el mundo de los microcontroladores.
Gracias por los buenos deseos asdurafael, son recíprocos.

Suerte y hasta luego.


----------



## asdrurafael (Jun 25, 2012)

Gracias D@rkbytes por todo el apoyo brindado. Gracias por felicitarme por mi cumpleaños. Lo pasé muy bien ese día. yo te felicito a ti por ser tan buena persona. Feliz día amigo. Que la pases bien.


----------



## asdrurafael (Jun 27, 2012)

Buen día amigos. Ya me llegaron los dispositivos electrónicos ( El Pic 16f877 y el display LCD). Solamente que tengo que comprar unos pines para soldarlos al display ya que mi entrenador trae unos slots (ranuras) donde se inserta, y el LCD vino sin los pines para poder enchufarlos. Creo poder hacerlo sin mayor dificultad. Voy a tratar de conseguir los pines mañana acá en los comercios electrónicos locales. Es todo por los momentos. Me despido deseándoles mucha salud y bienestar. Hasta luego.


----------



## asdrurafael (Jun 29, 2012)

Buenos días amigos. Cambié el pic y el display y ahora la falla es que las columnas uno y dos del teclado muestran los mismos caracteres como si estuvieran conectadas en paralelo. Esas dos columnas muestran las letras B, F, J, N. Las demás columnas funcionan bien. No se si es que el entrenador tiene un display LCM1602A y no el tradicional LM016L. Quizá ese tenga otras instrucciones que ignoro. Quizá sea que el entrenador no cargue bien el programa al pic. Eso es lo que me parece mas acertado que pueda estar pasando. Bueno ya no se que pensar. Medí continuidad con el tester entre los puertos de las columnas uno y dos y todo está bien, por lo que debe ser al cargar el programa que carga dos columnas iguales, por error al cargar. Imagino que debe ser eso.    Ese programador tiene garantía. Y como estoy pensando que debe tener algún daño quizá sea mejor cambiarlo por otro.    . Amigo D@rkBytes que opinas tu. En espera de una respuesta que pueda darme la oportunidad de tomar una decisión al respecto me despido con aprecio y afecto. Un abrazo a todos y que la pasen bien. Salud y dicha.


----------



## D@rkbytes (Jun 30, 2012)

asdrurafael dijo:


> Amigo D@rkBytes que opinas tu.


Pues sinceramente no sé que pueda estar pasando con tu entrenador.
Estaría bien que verificaras las conexiones de los puertos para saber como están dispuestas.

Puedes hacer lo siguiente...
.- Si tienes el diagrama esquemático dale una revisada, o examínalo físicamente.
.- Analiza el circuito del teclado matricial y desarrolla un esquema.
.- Realiza pruebas con programas sencillos para determinar que es lo esta fallando.
.- Ten calma, quizás sea algo sencillo que estas pasando por alto.

Suerte.


----------



## asdrurafael (Jun 30, 2012)

Buen día. Configuré el esquema de proteus que me mandaste en estos días a como está en mi entrenador y cargue el programa modificando el que me mandaste a la nueva configuración Del entrenador) y trabaja bien en el simulador. Es exactamente el mismo programa, por eso tienes mucha razón y voy a revisar el entrenador a ver si le consigo algún detalle. Por otro lado en el simulador proteus las letras se marcan en el mismo sitio y no se van corriendo a la derecha como para escribir un nombre. Creo que es por la instrucción de escritura: lcdout $fe,$c7,key  que indica solo la posición 7 de la segunda línea. Si es así por favor confírmamelo y si existe una instrucción para mover el cursor por favor envíamela. Voy a revisar el diagrama del entrenador. Pues tiene un manual. Muy agradecido por tu ayuda. Me despido por los momentos.


----------



## asdrurafael (Jul 2, 2012)

Que bien.   Alegría del alma. Gracias Amigo D@rkBytes por tu apoyo moral e intelectual. Pienso que siempre confiaste que podía hacerlo. Gracias por ese apoyo moral sobretodo. Confiaste en mi. Estoy muy agradecido. Mi entrenador está bueno. El problema que había es que no se por qué el barrido de la primera columna era muy rápido, por lo que decidí colocar una pausa después del barrido de la primera columna. Sin embargo la primera letra la "A" seguía sin aparecer, por lo que puse una pausa después de esa letra y listo arreglado. Un poco extraño el comportamiento del programa con respecto a ese barrido verdad. Bueno pero funciona. Ahora solo me falta hacer como correr el cursor para escribir nombres. Si me pueden ayudar se los agradezco. Por otro lado aprendí a simular con pic's en proteus. Un amigo del politécnico donde trabajo me ayudó y es muy fácil.     Estoy contento. Me despido deseándoles paz, prosperidad y salud. Y un Abrazo. Gracias D@rkBytes. Tu ayuda fue muy valiosa. Hasta luego.


----------



## D@rkbytes (Jul 2, 2012)

asdrurafael dijo:


> Que bien.   Alegría del alma. Gracias Amigo D@rkBytes por tu apoyo moral e intelectual. Pienso que siempre confiaste que podía hacerlo. Gracias por ese apoyo moral sobretodo. Confiaste en mi. Estoy muy agradecido. Mi entrenador está bueno. El problema que había es que no se por qué el barrido de la primera columna era muy rápido, por lo que decidí colocar una pausa después del barrido de la primera columna. Sin embargo la primera letra la "A" seguía sin aparecer, por lo que puse una pausa después de esa letra y listo arreglado. Un poco extraño el comportamiento del programa con respecto a ese barrido verdad. Bueno pero funciona. Ahora solo me falta hacer como correr el cursor para escribir nombres. Si me pueden ayudar se los agradezco. Por otro lado aprendí a simular con pic's en proteus. Un amigo del politécnico donde trabajo me ayudó y es muy fácil.     Estoy contento. Me despido deseándoles paz, prosperidad y salud. Y un Abrazo. Gracias D@rkBytes. Tu ayuda fue muy valiosa. Hasta luego.


Pues que bien que por fin lograste hacer funcionar el proyecto, y que tu entrenador no tiene problemas. 
Si confié en que podrías lograr hacerlo funcionar, porque ya tenías los fundamentos básicos.
Ahora, para hacer que la palabra se valla mostrando conforme se van presionando las teclas...
También existen algunas formas de hacerlo, pero te daré una idea de como podría ser.
Adjuntare dos ejemplos que siguen el mismo principio,
solo que uno es para usar los resistores internos del PIC en el puerto B,
y el otro usando externos con referencia hacia VSS (Los llamados Pull Down)

Y para que los compañeros del foro puedan saber como fue que lo resolviste,
si quieres puedes adjuntar el proyecto con el cual lo solucionaste.

Gracias asdurafael por compartir tus experiencias y te deseo mucha suerte.


----------



## asdrurafael (Jul 2, 2012)

Buen día amigos. Hola amigo D@rkBytes. La forma de solucionar fue la siguiente:
Originalmente el barrido de la primera fila era:
fila1 = 1
if col1 = 1 then key = "A"
if col2 = 1 then key = "B"
if col3 = 1 then key = "C"
if col4 = 1 then key = "D"
fila 1 = 0
Y así sucesivamente para las otras filas. Pero la primera columna, donde están las letras A,E, I, M. No se estaban escribiendo y en su lugar se escribían las de la segunda columna (B, F, J, N), por lo que pensé que por algún motivo el barrido era tan rápido para esa columna que no agarraba las teclas de dicha columna. Por eso coloqué una pausa después del barrido de la primera fila quedando así:
fila1 = 1
if col1 = 1 then key = "A"
if col2 = 1 then key = "B"
if col3 = 1 then key = "C"
if col4 = 1 then key = "D"
pause 70    ;Esta fué la primera pausa.
fila1 = 0
Todo lo demás quedó igual, pero ahora se escribían las letras E, I, M y faltaba la "A" que en su lugar tomaba el valor "B". Por lo que coloqué una nueva pausa después de la "A" porque no la estaba agarrando y quedó así:
fila1 = 1
if col1 = 1 then key = "A"
pause 30            ;aquí coloqué la pausa que terminó de solucionar el problema.  
if col2 = 1 then key = "B"
if col3 = 1 then key = "C"
if col4 = 1 then key = "D"
Todo lo demás quedó igual al programa que me mandaste D@rkBytes. Pienso que también lo fuera resuelto si se coloca una pausa después de  las letras "E", "I", "M", además de la "A" y se elimina la pausa después de la primera fila y que asigné un valor de 70 ms. Voy a revisar los archivos que me mandaste D@rkBytes para poder formar palabras en el display LCD. Gracias amigo D@rkBytes. Te agradezco grandemente tu ayuda.  Espero que la pasen bien. Yo estoy al menos por los momentos felíz  . El programa en pic basic pro ya lo conocen pero si quieren también se lo puedo enviar. Gracias a todos Un abrazo. El esquema en proteun es similar al que me mandó D@rkBytes. Pero también se los puedo enviar si quieren.


----------



## asdrurafael (Jul 2, 2012)

Hola de nuevo amigos. Les envío de una vez el esquema en proteus del diagrama de teclado matricial y display Lcd con el pic 16f877 y en word les envío el programa completo. No se los envié antes porque no sabía como comprimirlos pero un amigo me enseñó y aquí se los traigo. Me pareció importante que observen el esquema de proteus sobre todo porque se ve como distribuyo las letras del teclado (Así está en mi entrenador). Un millón de gracias a todos y en especial a D@rkBytes por la paciencia que ha tenido conmigo. No tengo como pagarle tantos beneficios y sobre todo por lo bien que me siento. Mucha salud y prosperidad a todos. Hasta luego.


----------



## itzfranko (Jul 3, 2012)

como puedo hacer para que lo pulsado en el teclado matricial quede en el display ....luego apretar otro numero del teclado y ahora ese quede y asi sucesivamente........


----------



## MrCarlos (Jul 3, 2012)

Hola itzfranko

Podrías utilizar el circuito contenido en la imagen adjunta.
Cualquier botón que presiones el número correspondiente aparecerá en el Display y asi quedará hasta que presiones otro botón.
Si quieres todos los números tienes que agregar los botones y las resistencias como estan conectados los que actualmente se ven en el dibujo.

Espero te sirva.

saludos
a sus ordenes


----------



## miguelus (Jul 4, 2012)

Buenos días itzfranko.
Busca el Integrado 74C922, es ideal justo lo que necesitas.

Sal U2


----------



## itzfranko (Jul 5, 2012)

muchas gracias  a los dos!!!!!!   sirvió ! yeah!


----------



## principiantetardio (Jul 12, 2012)

Hola, estoy manejando un teclado matricial 4x4 en ASM, pero puedo solamente ingresar las teclas de a una , o sea si pulso 1 me guarda el valor de esa tecla , en cambio si pulso 15 me guarda dos valores un 1 en una variable que tengo definida (decena) y un 5 en otra variable tambien predefinida (unidad).
No encuentro la forma de que me guarde el valor 15 en otra variable (valor)
Alguien ya ha resuelto un caso similar?
Me podria dar una mano para resolverlo?
O que me indique como puedo trabajarlo para lograr el 15 el la variable (valor)
Gracias


----------



## Scooter (Jul 12, 2012)

valor=decena x 10 + unidad


----------



## principiantetardio (Jul 12, 2012)

Gracias Scooter, pero esperaba algo mas generico y de aplicacion mas a gran escala. Lo que decis lo he resuelto mas o menos asi 
movf       decena,w
addwf      valor,1
addwf      valor,1
........................ 10 veces
movf       unidad,w
addwf      valor,1

Ahora imaginate que tenga que escribir 18370 , no llegaria nunca, por eso me parecio yn poco floja mi imaginacion y coloque la consulta.

Mil gracias


----------



## Scooter (Jul 12, 2012)

Es que estoy acostumbrado al "arcaico" 8052, allí sería:

mov a,decena
mov b,#10
mul ab
add a,unidad
mov valor,a

Si no hay instrucción para multiplicar la cosa se complica pero no tanto. Rotar a la izquierda es multiplicar por dos así que lo que yo haría sería (pseudocódigo)

carga en W decena
rota izquierda (x2)
rota izquierda (x4)
rota izquierda (x8)
suma decena (x9)
suma decena (x10)
suma unidad
guarda W en valor



De cualquier modo puedes buscar rutinas optimizadas para multiplicar y dividir por múltiplos de 10.
Pese a que el 8052 multiplica y divide lo hace con 8 bits, para 16bits me hice unas optimizadas solo para 10 y algo se adelantaba respecto a la rutina para multiplicar por lo que sea.


----------



## principiantetardio (Jul 12, 2012)

Nada mejor que esperar a que aclare, ya estoy trabajando en una rutina en ASM para el 16F873 y me parece que va a funcionar. Ahora debo atender el trabajo cuando vuelva la cuelgo.

Muchas gracias Scooter


----------



## aparco inga (Jul 22, 2012)

```
#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#define LCD_DATA_PORT getenv("SFR:PORTC")
#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");
}
}
}
```


----------



## Joaquin Daniel (Jul 22, 2012)

Muchas gracias por responder aparco inga, me ayuda mucho tu respuesta. Lo que si veo que ese código es para que a la salida del pic maneje un lcd, y yo lo necesito realizar con un display de siete segmentos. Y eso es lo que no se cómo hacer. Muchas gracias por su respuesta. Saludos


----------



## heribertomex (Sep 1, 2012)

Hola amigos, espero y puedan ayudarme.
hice una biblioteca en ASM para un teclado matricial 4x4. lo que pretendo es que cuando pulse una tecla reciba el valor de la tecla en el registro W y moverlo al puerto A para observar su valor por medio de led's.
La simulo en Mplab a través de opción STIMULUS y funciona correctamente, pero cuando conecto mi teclado matricial a proteus no funciona bien, no se muestra el valor de la tecla pulsada a través del puerto A.
No se que hacer, me tiene enfadado, pues no creo que sea efecto de algún rebote o que mi circuito este mal implementado en proteus. esta bien configurado el pic en proteus (es correcto el valor del oscilador y es correcto el pic) e igual en Mplab.
En la red busqué un programa ASM tambien para un teclado matricial, lo modifiqué e igual, tengo los mismos problemas.
les dejo mi programa ASM y mi circuito en proteus, agradeceré mucho que si alguien me puede ayudar.


```
List            P=16f84A
Include        <P16F84.INC>

CBLOCK        0x0C
TECLA
ENDC

            ORG            0
INICIO
            bsf            STATUS,RP0
            movlw        0xF0
            movwf        PORTB
            clrf                PORTA
            bcf            OPTION_REG,NOT_RBPU
            bcf            STATUS,RP0
PRINCIPAL
            call                TECLADO
            movwf        PORTA
            goto                 PRINCIPAL

;subrutina teclado
;detecta si es pulsada una tecla y regresa el valor de la tecla pulsada
;*************************************************************************************************            
            
TECLADO
            clrf        TECLA                ;Tecla se pone en ceros
            movlw    b'00001110'                    ;se pone cero en la Fila1
            movwf    PORTB
COL0
            btfss        PORTB,4                ;Hay un 0 en la columna 0?
            goto        REBOTE                ;si, atenuar rebote y asignar un valor a la tecla
            incf        TECLA,F                ;no, incrementa el valor de la tecla
COL1
            btfss        PORTB,5                ;Hay un 0 en la columna 1?
            goto        REBOTE                ;si, atenuar rebote y asignar un valor a la tecla
            incf        TECLA,F                ;no, incrementa el valor de la tecla
COL2
            btfss        PORTB,6                ;Hay un 0 en la columna 2?
            goto        REBOTE                ;si, atenuar rebote y asignar un valor a la tecla
            incf        TECLA,F                ;no, incrementa el valor de la tecla
COL3
            btfss        PORTB,7                ;Hay un 0 en la columna 3?
            goto        REBOTE                ;si, atenuar rebote y asignar un valor a la tecla
            incf        TECLA,F                ;no, incrementa el valor de la tecla
ULTIMA_TECLA
            rlf        PORTB,F                ;pone un cero a la izquierda para checar la siguiente Fila
            movlw        .16
            subwf        TECLA,W
            btfsc        STATUS,Z                ;compara si es la ultima tecla
            goto        TECLADO                ;no es, regresa a teclado
            bsf        STATUS,C                ;si lo es, pone a 1 el bit C
            goto        COL0                    ;regresa a seguir probado teclas
            
REBOTE
            call        Retardo_20ms            ;espera a que se estabilize el rebote
    B0        btfss        PORTB,4
            goto        B0
    B1        btfss        PORTB,5
            goto        B1
    B2        btfss        PORTB,6
            goto        B2
    B3        btfss        PORTB,7
            goto        B3
            movlw    TECLA
            return
            
include        <RETARDOS.INC>
            END
```


----------



## juliocesar71 (Sep 22, 2012)

Darzeck dijo:


> Quiero compartir el diseño que termine ya hace algunas noches con un teclado paralelo.
> Esto es por si le puede llegar a servir a alguien.
> 
> El diseño adjunto.
> ...



Saludo

Mi inquietud es como generas el cero

gracias


----------



## MrCarlos (Sep 23, 2012)

Hola juliocesar71

El circuito que mostró Darzeck en su mensaje #8 no tiene la tecla para el 0.
Tendrías que agregar una circuiteria como se muestra en el circuito adjunto en la imagen.

Hay otro circuito con el cual puedes experimentar. Te lo adjunto

saludos
a sus ordenes


----------



## juliocesar71 (Sep 24, 2012)

MrCarlos dijo:


> Hola juliocesar71
> 
> El circuito que mostró Darzeck en su mensaje #8 no tiene la tecla para el 0.
> Tendrías que agregar una circuiteria como se muestra en el circuito adjunto en la imagen.
> ...



MRCARLOS Buenas noches

Muchas gracias por la ayuda con el circuito, funciona bien, adjunto el diseño que implemente claro esta después de observar el suyo.

Un saludo

JULIO CESAR


----------



## juliocesar71 (Sep 26, 2012)

MrCarlos dijo:


> Hola juliocesar71
> 
> El circuito que mostró Darzeck en su mensaje #8 no tiene la tecla para el 0.
> Tendrías que agregar una circuiteria como se muestra en el circuito adjunto en la imagen.
> ...



Buenas noches MrCarlos

Solicito su colaboración en el mismo circuito, la inquietud es como se puede manejar 2 display mas con el mismo teclado, los display adicionales deben funcionar independientemente de los primeros display, es decir es como tener dos de estos circuitos pero funcionando con un solo teclado, imagino el primer circuito que indique un determinado número luego activar el otro circuito pero que funcione con el mismo teclado (un solo teclado manejando los 2 grupos de display independientes).

Adjunto un diagrama de bloques de la idea del circuito, ahora si hay otra manera de realizar el diseño bienvenida sea.

Gracias por su amable atención.

Un saludo

JULIO CESAR


----------



## MrCarlos (Sep 27, 2012)

Hola juliocesar71

Lo que tienes que hacer es enviar:
las 4 salidas de los INVERTER, 
la salida de la compuerta OR U6-A 
y la terminal del botón Reset,
al otro circuito. O al circuito actual.

Esto lo puedes hacer con compuertas de 3 estados como por ejemplo: 74LS365, 74LS241, 74LS44.
Te adjunto un ejemplo de cómo sería con el 74LS365.

saludos
a sus ordenes


----------



## juliocesar71 (Sep 27, 2012)

MrCarlos dijo:


> Hola juliocesar71
> 
> Lo que tienes que hacer es enviar:
> las 4 salidas de los INVERTER,
> ...



Buenas noches MrCARLOS

Gracias por su valioso interés

He estado trabajando en las modificaciones del circuito con el 74ls241 a fin de obtener 2 juegos de display independientes, el diseño funciona bien en los dos circuitos al presionar el teclado, pero, al cambiar el selector borra los números del ya marcado  y al cambiar nuevamente el selector borra la numeración del segundo, la idea es que los números queden encendidos al cambiar el selector y  marque la numeración en el seleccionado.

Agradezco su valioso aporte en el desarrollo de este proyecto

Adjunto imagen del circuito

Un saludo

JULIO CESAR


----------



## MrCarlos (Sep 28, 2012)

Hola juliocesar71

Creo que no hiciste el circuito como te mencioné:

*Lo que tienes que hacer es enviar:*
*A)- las 4 salidas de los INVERTER, *
*B)- la salida de la compuerta OR U6-A *
*C)- y la terminal del botón Reset,*
*al otro circuito. O al circuito actual.*

Te faltó el punto *B)-* y Parte Del *C)-*

Si utilizas el 74LS241 requerirás cuando de menos 2 de ellos.
Uno para enviar los datos de número al primer circuito o al otro
Otro para enviar las lineas de control al primer circuito o al otro.
Te sobrarían BIT’s utilizando este 74LS241.

saludos
a sus ordenes


----------



## juliocesar71 (Sep 28, 2012)

MrCarlos dijo:


> Hola juliocesar71
> 
> Creo que no hiciste el circuito como te mencioné:
> 
> ...



Buenas tardes MrCARLOS

Gracias por su paciencia

Le comento que no puedo simular el circuito con el 74ls365 ya que al momento de ubicarlo en la plantilla del PROTEUS y simular me indica error (incluso sin realizarle ninguna conexión) , no se que sucede recurro nuevamente para que me indique que debo hacer para solucionar este inconveniente.

Mi versión de proteus es 7.1

GRACIAS

JULIO CESAR

Adjunto figura con error


----------



## MrCarlos (Sep 28, 2012)

Hola juliocesar71

Quiere decir que no puedes trabajar con ese IC –74LS365- pues tu ISIS no trae las librerías para poder hacerlo.
Se requeriría conseguir la versión 7.8 de ISIS de Proteus para poder utilizarlo.

Pero sí puedes trabajar con el 74LS241. Cierto??
Pues hazlo como se muestra en la imagen adjunta o en el archivo comprimido que te envío.
Solo tienes que completarlo con los decodificadores y los Display’s. 

saludos
a sus ordenes


----------



## juliocesar71 (Sep 28, 2012)

MrCarlos dijo:


> Hola juliocesar71
> 
> Quiere decir que no puedes trabajar con ese IC –74LS365- pues tu ISIS no trae las librerías para poder hacerlo.
> Se requeriría conseguir la versión 7.8 de ISIS de Proteus para poder utilizarlo.
> ...



Buenas noches MrCARLOS

Muchas gracias por su gran aporte en este proyecto, con su valiosa colaboración logre montar el diseño final, funciona perfectamente, espero contar con sus conocimientos en próximas ocasiones.

Un saludo 

Cordialmente,

JULIO CESAR


----------



## Luis Zurita (Oct 6, 2012)

Saludos, tenia el mismo problema cuando migre del pic16f877 al pic18f4550, sin embargo, modificando y creando una copia del kbd.c logre poder poner a funcionar mi lcd con el teclado y funciona perfectamente. 
Gracias por la ayuda!


----------



## fenix129 (Oct 8, 2012)

hola, que tal, estoy realizando un programa el cual cuando se tenga un 1 en el puerto E0 se encienda un led en puerto C0, y se tengan 30 segundos para apagarlo por medio de un teclado matricial al presionar '*', sino encendera todo el puerto C al terminar el tiempo, ademas de que muestra la cuenta en forma regresiva de los segundos y lo muestre en un LCD, bueno he realizado el programa pero no consigo que cuando yo presiono el '*' se detenga y apague el led. Espero y me puedan ayudar. dejo el codigo del circuito.


```
#include <16F887.h>
#fuses XT,NOWDT,NOPROTECT,PUT

#use delay(clock=4M)

#define use_portb_lcd TRUE
#include <lcd.c>
#include <kbd.c>

#use fast_io(C)
#use fast_io(E)

#byte portc = 0x07
#byte porte = 0x09

#bit BT1 = 0x09.0

int t,n,a=1,d=29;


void inicializar(void)
{
   setup_adc_ports(NO_ANALOGS);
   set_tris_e(0b11111111);
   set_tris_c(0b00000000);
   output_c(0x00);
   lcd_init();
   kbd_init();
}

void main(void)
{
   inicio:
   inicializar();
   for(;;)
   {
      if(BT1==1)
      {
         lcd_gotoxy(1,1);
         printf(lcd_putc,"ACTIVADO");
         output_c(0x1);
         do
         {
            t=kbd_getc(); 
            n=t-48;
            if(t!=0)
            {
               if(t=='*')
               {
                  output_C(0x00);
                  goto inicio;
               }
            }
            lcd_gotoxy(1,2);
            printf(lcd_putc,"Tiempo Desc: %d\r",d);
            delay_ms(1000);
            a++;
            d--;
         }
         while(a<=30);
         output_C(0xFF);
      }
   }
}
```


----------



## fenix129 (Oct 11, 2012)

hola que tal, esta vez tengo una duda espero y me puedan ayudar, necesito ejecutar durante un minuto el kbd en ccs y si despues de no presionar nada realizar otra activadad, lo cual puede ser desde el encendio de un led, eso es lo menos imporatante sino que el kbd este activo nadamas 1 minuto. espero y me puedan ayudar.


----------



## JonNArevalo (Oct 23, 2012)

Disculpen si retorno esto nuevamente, estoy haciendo un contador en bcd del 0 - 99 con compuertas ya que no puedo usar pic sin embargo tengo que acoplarle un teclado matricial 3x4 si alguien me ayuda que componente deberia agregarle?


----------



## MrCarlos (Oct 23, 2012)

Hola JonNArevalo

El teclado matricial 3x4 para qué en un contador BCD 0-99 ??
Cual es objetivo de ese teclado en el contador ??
Podrías dar más información ??

Qué simulador para circuitos electrónicos utilizas ??
Puedes dejarnos ver el contador BCD de 0-99??

saludos
a sus ordenes


----------



## el xavo (Dic 17, 2012)

como hacer esto leyendo y escribiendo en la memoria eeprom del pic 877A??



alguien me podria ayudar a hacer lo mismo pero leyendo y escribiendo en la memoria eeprom 
xfavooor
no tengo idea de como leer y guardar los numero que yo ingreso


----------



## f0raster0 (Feb 1, 2013)

tengo el mimso problema  quiero guardar en la eeprom  

creo que el link abajo nos puede ayudar 
http://picmania.garcia-cuervo.net/picc4.php#EENINTFUNC


----------



## aier (Mar 20, 2013)

Hola a todos 

Agradezco mucho que hubiesen abierto esta pregunta.

Lo que sucede es que estoy intentando utilizar un teclado 4x3 y un lcd de 16x2,  el lcd lo estoy conectando al puerto d  y el teclado al puertob.  El lcd funciona excelente pero el teclado no.  adjunto el codigo y la simulacion en proteus.
estoy utilizando un pic16f887 y en pic c.

Espero sus respuestas
Muchas gracias por la atencion
Ver el archivo adjunto foroelectronica.rar


----------



## D@rkbytes (Mar 20, 2013)

Separa el LCD del teclado modificando la librería LCD.C, y la pones dentro de la carpeta de tu proyecto.
Así podrías trabajar el teclado por el puerto B, y la pantalla por el puerto C u otro puerto.

Mencionas que usarás un PIC16F887, pero en la simulación usas un PIC16F876


----------



## aier (Mar 20, 2013)

Que pena adjunte la simulacion que no era.  En el archivo lcd.c lo dejé tal cual  para que trabaje por defecto en el puertod, mientras que en el archivo kbd.c  para poder trabajar por el puertob  "descomente" la siguiente linea
#define use_portb_kbd TRUE

Lo raro es que el lcd funciona, pero el teclado no. 
Adjunto esta vez los archivos correctos
Ver el archivo adjunto foroelectronica.rar


----------



## D@rkbytes (Mar 21, 2013)

aier dijo:


> el archivo lcd.c lo dejé tal cual  para que trabaje por defecto en el puerto d, mientras que en el archivo kbd.c  para poder trabajar por el puerto b  "descomente" la siguiente linea
> #define use_portb_kbd TRUE
> 
> Lo raro es que el lcd funciona, pero el teclado no.


Después de realizar algunas modificaciones al programa y al diseño, ya lo tengo funcionando.
Al parecer existe un bug con la instrucción *port_b_pullups(true);* al trabajar con el PIC16F887.
No activa las resistencias pull-up en el puerto B 
Como no había usado esa instrucción del PCWHD Compiler con este PIC, no lo había notado.

Adjunto el proyecto con las modificaciones realizadas para activar las resistencias pull-up en el puerto B,
y trabajando con el oscilador interno a 8MHz.

Saludos.


----------



## aier (Mar 21, 2013)

D@rkbytes dijo:


> Después de realizar algunas modificaciones al programa y al diseño, ya lo tengo funcionando.
> Al parecer existe un bug con la instrucción *port_b_pullups(true);* al trabajar con el PIC16F887.
> No activa las resistencias pull-up en el puerto B
> Como no había usado esa instrucción del PCWHD Compiler con este PIC, no lo había notado.
> ...



jajaja D@rkbytes  muchas muchas gracias, no se imagina lo mucho que me sirve esto, hace rato me estaba quebrando la cabeza solucionar esto, porque con otros pics me daba pero con el 16f887 no funcionaba.

Aprecio mucho el tiempo que te tomastes. Dios te pague

Pero???  Cuentame, como te distes cuenta de ese problema?


----------



## D@rkbytes (Mar 21, 2013)

aier dijo:


> Pero??? Cuéntame, como te diste cuenta de ese problema?


Simple, los teclados matriciales necesitan resistencias pull-up en las líneas de entrada para trabajar.
En el programa estaba la instrucción para habilitarlas por el puerto B, pero tal función no se cumplía.
A simple vista sobre la simulación el puerto B permanecía con los pines como entradas flotantes.
Y cuando se declara usar pull-ups, mantienen un estado alto.
Así qué, determiné que la instrucción port_x_pullups(x) no estaba funcionando.
Entonces la sustituí por el bit 7 (RBPU) del registro OPTION_REG, que es el que hace esa función.
Solamente así pude activar las resistencias pull-up en el puerto B.

Saludos.


----------



## aier (Mar 27, 2013)

D@rkbytes gracias por el tiempo que dedicastes a esto,  ese problema al igual pasaba con el pic16f1937. le debo una


----------



## mario1577 (May 12, 2013)

Hola, e tenido problemas para simular un teclado 4x3 en el proteus (keypad phone) pues e estado investigando en varias paginas como por ejemplo que quite la instruccion de las resistenciasv pullup internas del pic y las ponga físicamente en el proteus, pero nada, muchos dicen que la librería del ccs esta mal, pero la verdad nose, e tratado de simularlo con el pic 16f887 y 16f877A pero no da resultado, a la hora de simularlo los pines del keypad están de color gris y pues no sucede nada, quisieran que me ayuden por favor.

Les adjuntare mi programa y el circuito del proteus.


----------



## D@rkbytes (May 13, 2013)

mario1577 dijo:


> Hola, e tenido problemas para simular un teclado 4x3 en el proteus (keypad phone) pues e estado investigando en varias paginas como por ejemplo que quite la instruccion de las resistenciasv pullup internas del pic y las ponga físicamente en el proteus, pero nada, muchos dicen que la librería del ccs esta mal, pero la verdad nose, e tratado de simularlo con el pic 16f887 y 16f877A pero no da resultado, a la hora de simularlo los pines del keypad están de color gris y pues no sucede nada, quisieran que me ayuden por favor.


El problema que tienes en tu diseño, es que usas resistencias limitadoras, en vez de resistencias pull-up.
Pero con las resistencias pull-up del puerto B, debe funcionar sin problemas.
Ahora, por lo que no funciona tu programa, es porque la definición de usar el puerto B para el teclado,
se hace en la librería KBD.C, no en el código fuente, y también tienes otros problemas en el código.

Éste sería tu programa corregido...

```
#include <16f887.h>
#fuses NOWDT,NOMCLR,NOLVP
#use delay(internal = 8000000) 
#include <lcd.c>   
#include "kbd.c"
#byte OPTION_REG = getenv("SFR:OPTION_REG")  // Referencia hacia el registro OPTION_REG
#bit  RBPU = OPTION_REG.7  // Referencia hacia el bit 7 de OPTION_REG (RBPU)

//#define use_porb_kbd TRUE      // Ésto se define en la librería kbd.c

void main()
{
  char k;
  int x;
  RBPU = 0;

  lcd_init();
  kbd_init();
  
  lcd_putc("\fPRESIONE TECLA\n");// Mensaje inicial 

   while(TRUE)
   {
      k = kbd_getc();   // faltaba agregar k =
      x= k - 48; // Conversion de ASCII a decimal
      
      if(k!=0)
      {
        if(k=='*')   // Se debe usar 'X' no "X" para comparar los caracteres
        lcd_putc("\fTecla=???");
        
        else
        printf(lcd_putc,"\fTecla=%u",x);
        
        delay_ms(1000);
        
      }
     
   }

}
```
Cómo verás, el tema de la activación de las resistencias pull-up en el PIC16F887, se trató unos posts atrás.
Y fue lo que añadí a tu programa, con eso ya debe funcionar, pero faltaría agregar algunos parámetros.
Por ejemplo, el ajuste del oscilador interno, para que trabaje a 8MHz de forma estable.
Sólo tendrías que agregar esto a tu programa en la parte del main...
setup_oscillator(OSC_8MHz|OSC_STATE_STABLE);

En la simulación elimina las resistencias, y conecta el teclado directamente.
Al montarlo físicamente si se pueden poner resistencias limitadoras.

Espero que con los cambios agregados, funcione tu programa.

Suerte.


----------



## mario1577 (May 13, 2013)

gracias por responder, sigue sin funcionar lo mas raro de todo, los pines del lcd están de color gris, sera error de lo libreria lcd.c??



mmm no es eeror de la libreria, porque descargue un programa que aarreglaste enun anterior post y si funciona ese muy bien, no entiendo porque no funciona el mio si le agregaste las mismas cosas :s



Que raro ese programa que arreglaste en otro post lo copie y lo pegue en otro archivo nuevo que hice y ahora si no funciono, entonces el problema sera el compilador??


----------



## D@rkbytes (May 13, 2013)

mario1577 dijo:


> gracias por responder, sigue sin funcionar lo mas raro de todo, los pines del lcd están de color gris, sera error de lo libreria lcd.c??
> 
> 
> 
> ...





D@rkbytes dijo:


> por lo que no funciona tu programa, es porque la definición de usar el puerto B para el teclado,
> se hace en la librería KBD.C, no en el código fuente.


¿Ya hiciste eso?

Existe una parte en la librería KBD.C que dice...
*// Un-comment the following define to use port B *(Descomente la siguiente definición para usar el puerto B)*
// #define use_portb_kbd TRUE*    <--- Quita las diagonales rojas para descomentar esta línea.
Si modificas esta librería desde el PCWHD Compiler, al compilar te saldrá un aviso.
Se te preguntará si quieres que la librería con los cambios, se guarde en la carpeta del programa.
Si aceptas, la librería modificada será copiada a la carpeta del programa principal.
Entonces ahora para poder usar esta librería, tienes que cambiar en tu programa la forma de incluirla.
En vez de escribir #include <kbd.c> ahora lo cambias por #include "kbd.c" y listo.
No omitas nada de lo que te mencione anteriormente.

Suerte.


----------



## mario1577 (May 13, 2013)

Que descuidado soy no había leído eso, ya salio te agradezco mucho la ayuda, ya me tenia como loco este problema del teclado mucas gracias por todo


----------



## josexremix65 (Jun 3, 2013)

Buenas, muchas gracias a todos por su tiempo.
No he podido avanzar porque no me lee el teclado matricial. El lcd funciona perfecto pero el teclado no, Planeo usarlo en el PortD el teclado y en el C el LCD.

Uso el CCS mas reciente.

Si pudieran darme una pista de como usar ambos por el portC se los agradeceria muchisimo.

Anexo envio codigo de la aplicacion y de la libreria KBD.

Me compila perfectamente, pero no me funciona.

Aqui anexo libreria KBD que estoy utilizando, muchas gracias


----------



## D@rkbytes (Jun 3, 2013)

josexremix65 dijo:


> Si pudieran darme una pista de como usar ambos por el portC se los agradecería muchisimo.


El teclado matricial utiliza resistencias pull-up, y cómo el puerto C no tiene, hay que ponerlas externas.
Por eso es mejor usar el teclado en el puerto B, que si tiene, y así se evita ponerlas externamente.

Adjunto un ejemplo utilizando la pantalla y el teclado por el puerto C.
Las librerías lcd.c y kbd.c ya están modificadas para trabajar por el puerto C,
y vienen dentro de la carpeta del proyecto, usa éstas, y nota que en el código se hace referencia a ellas de forma diferente.

Saludos.


----------



## josexremix65 (Jun 4, 2013)

SOS GROSO sabelo  Funciona perfecto, aquí puedo dar positivos? jaja


----------



## josexremix65 (Jun 5, 2013)

Buenas, tengo un problema con la simulacion de teclado en proteus, me funciona bien pero a veces deja de funcionar sin razon aparente, puse las resistencias externas y uso el teclado por el puerto D, tanto pantalla como teclado. Adjunto envio HEX y codigo en CCS, queria saber si a ustedes tambien les da ese error. OJO habilitada RB0INT asi que ponganlo a vcc.

Para la  ID  3  la clave es 1234. Alguien que lo simule porfavor y me diga si el error es de la aplicacion o del proteus.


----------



## MrCarlos (Jun 5, 2013)

Hola josexremix65

Pero. . .  Qué dices de los que te menciona D@rkbytes en su menaje #370 ??

Creo que sería conveniente que adjuntaras el archivo que se genera con tu simulador para circuitos electrónicos.
Comprímelo con WinZip o WinRar y Adjúntalo aquí.

saludos
a sus ordenes


----------



## agcopa (Jun 20, 2013)

Estoy en el montaje de un proyecto de teclado matricial 4x4, que debe mostrar en un LCD las teclas pulsadas de manera secuencial; es decir, si marco 1,3 A, #, 2, se deben mostrar en el LCD esas teclas consecutivamente, no tengo activada una rutina que cuando llegue al final de la primera linea, pase a la segunda linea, eso lo realizare una vez solvente la situacion que planteo en el siguiente parrafo. El montaje en el Proteus funciona correctamente, cada número que marco se ve en el LCD.

El asunto que presenta problemas  está cuando realizo el montaje en el Protoboard y ejecuto el programa. Aqui únicamente muestra el primer número que marco y luego se queda colgado; es decir, no muestra en el LCD ninguna de las sub-secuentes teclas que pulso. Adicionalmente, ninguna de las cuatro teclas de la última fila se muestran en el LCD.

EL PIC que utilizo es el PIC 16F870,  el teclado es el matricial de 4x4 y el LCD es el 1602A, que es compatible con el LM016L, el XT es de 4Mhz.

He realizado las pruebas de los componentes de manera individual y funcionan bien, esto con la finalidad de comprobar que los componentes estan bien. Me he fijado al momento de compilar el programa y el FOSC es XT Oscilator, WDTE esta Disable.

Anexo el .HEX y el .DSN del proyecto. Agradezco cualquier ayuda al respecto.
P.D.: Anexe las otras librerias que estoy utilizando y una foto del proyecto


----------



## D@rkbytes (Jun 20, 2013)

agcopa dijo:


> El asunto que presenta problemas  está cuando realizo el montaje en el Protoboard y ejecuto el programa. Aqui únicamente muestra el primer número que marco y luego se queda colgado; es decir, no muestra en el LCD ninguna de las sub-secuentes teclas que pulso. Adicionalmente, ninguna de las cuatro teclas de la última fila se muestran en el LCD.
> 
> EL PIC que utilizo es el PIC 16F870,  el teclado es el matricial de 4x4 y el LCD es el 1602A, que es compatible con el LM016L, el XT es de 4Mhz.


Prueba ahora con los cambios realizados, pero monta todo tal cual y está en el esquema.
Verás que ya funciona físicamente.

Nota:
Algunas de esas librerías necesitan modificaciones para que funcionen.

Saludos.


----------



## agcopa (Jun 21, 2013)

Gracias...

Voy a montar el esquema enviado y te aviso.

Tú indicas que algunas de las librerías deben ser modificadas. El sistema completo que me envías yo lo probé en Proteus y funciona tal cual están las librerías que me anexaste, yo la revise y son las originales del libro.

Pregunto: Debo modificarlas según lo que indicas para que funcionen en el Protoboard?? por ejemplo colocar los Macros Bank0 y Bank1 para adecuar el Status Register y acondicionar las selecciones de los bancos dentro de cada una de las librerías??

Te pregunto porque yo ejecute la simulación en Proteus y tal cual esta; es decir, tal cual lo que me envías, funciono.


----------



## D@rkbytes (Jun 21, 2013)

agcopa dijo:


> Gracias...
> 
> Voy a montar el esquema enviado y te aviso.
> 
> ...


El proyecto que subí ya tiene los cambios necesarios en las librerías para que funcione físicamente.
Si lo deseas puedes agregar los macros para el cambio de banco, eso se usa por comodidad.
Lo que debes tener en cuenta, es que cada vez que realices algún cambio, hagas pruebas.
Porque muchas veces por estar modificando un programa éste deja de funcionar si no se hace bien.

Saludos.


----------



## agcopa (Jun 25, 2013)

Revise con todo el detalle la información que me envía, y me di cuenta de algo muy importante que no estaba tomando en consideración al momento de realizar la compilación en el MPLAB, el asunto relacionado a cierto bit de configuración, el    _LVP_OFF

Los bits de configuración pueden ser programados (puestos a 0) o dejados sin programar (quedan a 1), con objeto de seleccionar varias configuraciones del microcontrolador: tipo de oscilador, protección o no del programa, uso ó no del watchdog, etc.

Por lo que es especialmente importante cargar correctamente esos bits durante la programación para conseguir que el microcontrolador pueda funcionar de la manera correcta.

En el caso que comento:

LVP: Low Voltage In-Circuit Serial Programming Enable bit

1 = RB3/PGM pin has PGM function, low voltage programming enabled
0 = RB3 is digital I/O, HV on MCLR must be used for programming

Si, el LVP está configurado a “1”, entonces RB3 está configurado para low-voltage programming y se debe tener un pull-down en el PIN, mientras que el programa este funcionando en el circuito. En el caso en que LVP es “0” RB3 se libera para funciones de entrada y salida normales.

Adicionalmente, encontré en la web este artículo que me pareció interesante y toca este tema en la programación de 16F87x.

http://www.piclist.com/techref/microchip/16F877/hvprog.htm

Gracias por el apoyo recibido en este tema, incluí la línea de configuración dentro de mi código y funciona perfectamente.


----------



## GPZ23 (Ago 25, 2013)

Buenas, tengo problemas con utilizar el teclado en el puerto d, y el display si me funciona (estoy utilizando el pic18f4550), trate de modificar la librería del kbd.c y de ponerle resistencias al puerto d como han a aconsejado en temas anteriores, pero debo de estarme pasando algún paso o tengo algún error que no me he dado cuenta. El teclado en la simulación en el proteus solo se mantiene activas sus terminales pero no reacciona al presionar los botones.

Les agradeciera mucho su ayuda y me expliquen cual es el error y como hacerlo funcionar.

Les adjunto la simulación, librerías y el main (Compilador CCS) 

Gracias


----------



## D@rkbytes (Ago 25, 2013)

GPZ23 dijo:


> Buenas, tengo problemas con utilizar el teclado en el puerto d, y el display si me funciona (estoy utilizando el pic18f4550), trate de modificar la librería del kbd.c y de ponerle resistencias al puerto d como han a aconsejado en temas anteriores, pero debo de estarme pasando algún paso o tengo algún error que no me he dado cuenta. El teclado en la simulación en el proteus solo se mantiene activas sus terminales pero no reacciona al presionar los botones.
> 
> Les agradeciera mucho su ayuda y me expliquen cual es el error y como hacerlo funcionar.
> 
> ...


Para trabajar el teclado y la pantalla por el puerto D no tienes que realizar modificaciones a las librerías.

Prueba usando esta parte del programa...

```
while(TRUE){
      k=kbd_getc();
      if(k != 0){
      printf(lcd_putc,"\fTecla=%c",k);
      delay_ms(50);
      }
   }
```

Saludos.


----------



## GPZ23 (Ago 25, 2013)

Muchas gracias por responder y por tu tiempo, si funcionó. 

Gracias, tus aportaciones son excelentes


----------



## agcopa (Ago 30, 2013)

Estimado D@rkbytes

Cual puede ser la razón por lo que ocurre lo siguiente:

Hay veces que al iniciar el sistema (PIC – LCD – Teclado 4x4); es decir, energizar el circuito, y enviar al LCD un mensaje de inicio, el cual consiste en:

Muestra_Mensaje_Tres
      call   LCD_Borra               ; Borra la pantalla, memoria DDRAM, cursor a inicio linea 1
      call   LCD_Linea1              ; Cursor a principio de la linea 1
      movlw  MensajeTeclee4          ; Apuntador de mensaje "**** X.Y.Z **** "
      call   LCD_Mensaje             ; Escribe en display el mensaje "**** X.Y.Z. ****"
      call   LCD_Linea2              ; Cursor al principio de la Línea 2.
      movlw  MensajeTeclee5          ; Apuntador de mensaje "LAB. DIGITALES"
      call   LCD_Mensaje             ; Escribe en display el mensaje " LAB. DIGITALES"
      call   Retardo_2s              ; durante XX seg. quedara el mensaje en el display          
      call   LCD_Borra               ; Borra la pantalla, memoria DDRAM, cursor a inicio linea 1
      call   LCD_Linea1              ; Cursor a principio de la linea 1
      return

únicamente se muestra el mensaje de LCD_Linea1 y el LCD_Linea 2 no se muestra.

*Que estoy haciendo para solventaar lo indicado anteriormente*:

Pulso el botón de reset del PIC por un segundo aproximadamente y entonces se muestran los dos mensajes. Esto ocurre de manera no constante, hay veces que si ocurre como hay veces que no.

*Que pienso que puede ocurrir*:

Pudiese ser que la señal de habilitación y desabilitación del ENABLE en LCD dure muy corto tiempo.

*Como tengo escrita esa rutina*:
movwf   LCD_BusDatos   ; PORTB <= WREG   Envía el dato al módulo LCD #ENVIA EL DATO#
bsf     LCD_PinEnable     ; PORTA RA2=1 (E)      Activa el LCD mediante un pequeño pulso
bcf     LCD_PinEnable     ; PORTA RA2=0 (E)      Desactiva el LCD.

*Cual pienso podría ser la solución*:

bsf     LCD_PinEnable     ; PORTA RA2=1 (E)      Activa el LCD mediante un pequeño pulso
movwf   LCD_BusDatos   ; PORTB <= WREG   Envía el dato al módulo LCD #ENVIA EL DATO#
bcf     LCD_PinEnable     ; PORTA RA2=0 (E)      Desactiva el LCD.
call    Retardo_5ms         ; retardo de 5 ms.

Entendiendo que el ciclo de escritura de DATA al LCD incluye el flanco de bajada de la señal de ENABLE, que entiendo es cuando se pasa la información al bus de datos.

Piensas que esto pudiera apuntar a la solución?

Probé la rutina siguiente:

movf    LCD_Dato,W      ; WREG <=LCD_Dato(ALTO Y BAJO) Recupera el dato a enviar. #ENVIA EL DATO#
bsf       LCD_PinEnable     ; PORTA RA2=1 (E)              Activa el LCD mediante un pequeño pulso
movwf   LCD_BusDatos   ; PORTB <= WREG                Envía el dato al módulo LCD #ENVIA EL DATO#
bcf     LCD_PinEnable     ; PORTA RA2=0 (E)              Desactiva el LCD.
call    Retardo_50micros ; Retardo que asegure la escritura en el LCD de un comando o dato

_funciona perfectamente_... Se elimino lo que te comentaba anteriormente.

Saludos y gracias nuevamente.


----------



## agcopa (Sep 14, 2013)

Buenos días
Quería  realizar una consulta en relación a cierto carácter que se presenta en el LCD 16x2 cuando recibe del Hiperterminal un <CR><LF>

Para mayor detalle anexo el link del video en donde se puede observar detalladamente cual es el carácter al que hago referencia: 




También pueden ubicar el video escribiendo: 
*Proyecto RFID Control de Acceso, Video Comunicacion Serial PIC-PC, PIC 16F870 ASM*

El carácter también se puede observar en el archivo adjunto *CARACTER LCD 16x2*

En el video se ve que el carácter se presenta en el LCD cuando presiono la tecla enter en el teclado a través del Hiperterminal, entiendo que esta acción envía dos comandos consecutivos el <CR><LF>, que son colocar el curso al principio de la segunda línea, con el salto de línea.

Como logre solventar que este carácter no se presentara ?

En la ventana de Propiedades del Hiperterminal, en la configuración de las propiedades de esa conexión, en la parte correspondiente a ASCII SENDING, desmarque la opción: SEND LINE ENDS WITH LINE FEEDS y ahora se ve en el Hiperteminal que hace el <CR> pero no el <LF> ya que el curso se posiciona nuevamente al inicio de la misma línea; es decir, no hace el salto de línea. Con esto ya no se presenta ese carácter.

*Ver Hyperterminal en el archivo adjunto*. 

Hasta aquí todo va funcionando bien....

El tema se presenta ahora cuando no utilizo el Hiperterminal y estoy realizando el código del sistema en Visual Basic 10, en donde envió el comando vbCrLf y aqui se presenta nuevamente el carácter en el LCD, he probado con vbCr únicamente y también se presenta el carácter.

_Como hago en VB10 para que eso no ocurra_, es decir; como simular en VB10 lo que hice en el Hiperterminal con tan solo desmarcar la opción SEND LINE ENDS WITH LINE FEEDS y el carácter no se presente en el LCD

Pueden observar el resultado de la comunicacion trabajando perfectamente con el Hiperterminal, en el siguiente enlace:

http://www.youtube.com/watch?feature=player_detailpage&v=LpoEMuU_Tnw


----------



## mendek (Oct 30, 2013)

Buenas tardes, bueno pues otro problema, esta vez con imprimir algo en la LCD conectada al puerto B junto con un teclado matricial, lo que tengo es lo siguiente:

```
#include <16f887.h>
   #device adc=10
   #use delay(clock=20M)
   #fuses HS, NOWDT
   
   #include <lcd.c>        // Se incluye el driver de la pantalla LCD
   #include <kbd.c>        // Se incluye el driver del teclado matricial
   #include <stdlib.h>     // Se incluye para generar número aleatorio
   
   #define LCD_ENABLE_PIN  PIN_B0                                    
   #define LCD_RS_PIN      PIN_B1                                   
   #define LCD_RW_PIN      PIN_B2                                    
   #define LCD_DATA4       PIN_B4                                   
   #define LCD_DATA5       PIN_B5                                 
   #define LCD_DATA6       PIN_B6                             
   #define LCD_DATA7       PIN_B7 
   
   #use fast_io(a)         // Modo de gestión del puerto A
   #use fast_io(b)         // Modo de gestión del puerto B
   #use fast_io(c)         // Modo de gestión del puerto C
   
   #bit adif=0x0C.6        // Bandera de fin de conversión A/D
   #bit tmr1if=0x0C.0      // Bandera de desbordamiento del TMR1
////////////////////////////////////////////////////////////////////////////////
   main(){
 
   int16 random;            // Número aleatorio, asegura el encendido aleatorio 
                           // de los LEDs en el dummy shot 
   char tecla;              // Valor de la tecla oprimida
   int16 numero[3];         // Arreglo de 4 variables para alojar los diferentes 
                           // datos numéricos
   int8 k;                 // Contador de teclas oprimidas
   
   delay_ms(300);          // Retardo de 300 ms para permitir que se establezca
                           // bien el voltaje de alimentación de la pantalla LCD
   lcd_init();             // Se inicializa la pantalla
   
   lcd_putc("   DUMMY SHOT   ");    // Se imprime el mensaje en la línea 1
   lcd_gotoxy(1,2);     // Se ubica el cursor al principio de la linea 2
   delay_ms(1000);       // Retardo para visualizar "   DUMMY SHOT   "
   lcd_putc("Random=");       // Se imprime el mensaje para la inserción de
                              // un número aleatorio
   port_b_pullups(true);   // Se hab. las res. elev. del puerto B
```

Como ven ya intenté declarar los pines por los cuales controlar la LCD (puerto B), pero no entiendo por que no imprime por ahí, sigue imprimiendo por el puerto D, espero me puedan aclarar esta duda por favor  , desde ya gracias


----------



## D@rkbytes (Oct 31, 2013)

mendek dijo:


> Buenas tardes, bueno pues otro problema, esta vez con imprimir algo en la LCD conectada al puerto B junto con un teclado matricial.
> No entiendo por que no imprime por ahí, sigue imprimiendo por el puerto D, espero me puedan aclarar esta duda por favor  , desde ya gracias


En realidad es muy fácil cambiar de puerto.
Antes también estaba confundido sobre como hacerlo, pero pronto descubrí la forma. 

Mira este pequeño ejemplo adjunto para que entiendas como se hace sin modificar la librería LCD.C.

Saludos.


----------



## mendek (Oct 31, 2013)

Pues sigo sin poder lograrlo D@rkbytes, y de ante mano gracias por la ayuda que siempre me brindas , ya hice algo como en el código, pero nada, adjunto mi circuito haber si tú pudieras encontrar la falla, estuvimos con mi profesor y aunque el también es de los buenos, no pudimos


----------



## D@rkbytes (Oct 31, 2013)

mendek dijo:


> Pues sigo sin poder lograrlo D@rkbytes, y de ante mano gracias por la ayuda que siempre me brindas , ya hice algo como en el código, pero nada, adjunto mi circuito haber si tú pudieras encontrar la falla, estuvimos con mi profesor y aunque el también es de los buenos, no pudimos


Si hay alguna fallas en tu programa, y me supuse que tendrías problemas cuando quisieras usar el teclado por el puerto B.
Mira el motivo y la solución en el _post #360_ 
Y para que no se te haga complicado ver las funciones de ese programa, adjunto un ejemplo básico de uso, controlando la pantalla y el teclado matricial 3x4 por el puerto B.

Suerte.


----------



## josegabrielbh (Ene 4, 2014)

Hola, 
Mi problema es que no logro activar las resistencias pull-up de las entradas del puerto B para el manejo de un teclado matricial con un  pic16f883. Lo que trate fue adaptar el proyecto de un post muy anterior de D@rkbytes que esta en assembler y que funcionaba perfecto con un pic16f887.
Gracias por la ayuda que me pueda dar.


----------



## D@rkbytes (Ene 4, 2014)

josegabrielbh dijo:


> Hola,
> Mi problema es que no logro activar las resistencias pull-up de las entradas del puerto B para el manejo de un teclado matricial con un  pic16f883. Lo que trate fue adaptar el proyecto de un post muy anterior de D@rkbytes que esta en assembler y que funcionaba perfecto con un pic16f887.
> Gracias por la ayuda que me pueda dar.


¿Podrías mencionar el número del post para saber de que programa se trata?
Si el programa lo estás escribiendo en ensamblador tienes que configurar el bit 7 del registro OPTION_REG en 0
Ese bit es el que activa las resistencias Pull-Up del puerto B.
*bcf OPTION_REG,7*
El registro OPTION_REG se encuentra en el banco 1

Si lo estás escribiendo en C, en el _post #360_  está la solución.

Si tienes otro problema o usas otro lenguaje de programación, es necesario que adjuntes código y esquema en un archivo comprimido para poder ayudarte.

Saludos.


----------



## josegabrielbh (Ene 4, 2014)

Muchas gracias D@rkbytes,
El post es el #283 donde dejaste los archivos para el manejo del teclado en ensamblador. Es lo que quiero modificar para el pic16f883. En principio solo cambie el pic, pero no funciono.
Disculpa realmente estoy iniciando.


----------



## D@rkbytes (Ene 5, 2014)

josegabrielbh dijo:


> El post es el #283 donde dejaste los archivos para el manejo del teclado en ensamblador. Es lo que quiero modificar para el pic16f883. En principio solo cambie el pic, pero no funciono.


OK. _Ese programa_ es para un PIC16F877A, no para un PIC16F887, por eso no lo encontré. 


josegabrielbh dijo:


> Lo que traté fue adaptar el proyecto de un post muy anterior  de D@rkbytes que esta en assembler y que funcionaba perfecto con un  pic16f887


Prueba ahora con las correspondientes modificaciones a ese programa para trabajar con un PIC16F883.

Suerte.


----------



## josegabrielbh (Ene 5, 2014)

Muchas Gracias D@rkbytes, funciona perfecto. Felicitaciones por tus amplios conocimientos y tus ánimos para ayudarnos.


----------



## Urbito (Ene 23, 2014)

Buenas tardes, me encuentro haciendo unas simulaciones de mi tesis, para la cual decidí usar la pantalla y el teclado por el puerto D, debido a la cantidad de interrupciones que necesito y debido a que también utilizare un modulo bluetooh y necesito el port C casi por completo.

Mi primer inconveniente sucedió cuando quise normalmente unir el teclado y la pantalla sin mucho lió en el portd. Sucedía que el barrido del teclado chocaba con el de la pantalla y se hacia un lió todo.

Lo arregle pasando el E, RS y RW al port E. Listo, ya funciona bien la pantalla y el barrido.

Ahora tengo el problema de que el teclado, conectándolo comúnmente como lo hacia en el portB no me lee los números en sus respectivos lugares. Donde debería haber un 4 pone un 6 y así sucesivamente, y no son problemas de que esta invertida las conexiones, ya revise, todo esta bien, y cambiando de lugar los cables, se pone peor!.

Alguna sugerencia o ayuda?


----------



## D@rkbytes (Ene 23, 2014)

Urbito dijo:


> Ahora tengo el problema de que el teclado, conectándolo comúnmente como lo hacia en el portB no me lee los números en sus respectivos lugares. Donde debería haber un 4 pone un 6 y así sucesivamente, y no son problemas de que esta invertida las conexiones, ya revise, todo esta bien, y cambiando de lugar los cables, se pone peor!.
> 
> ¿*Alguna sugerencia *o ayuda?


Si mencionas que no tienes invertidas las conexiones, es necesario que adjuntes tu programa con simulación.

Te podría indicar el siguiente ejemplo para el puerto C _Teclado 3x4 en PORTC_ y cambiarlo al puerto D
Pero no mencionas en que lenguaje programas.


----------



## wilmertri (Ene 25, 2014)

Buenas tardes,

Me gustaría que me colaboraran con este tema que he venido trabajando ya hace varias semanas y no he logrado aun. En los proyectos que he utilizado siempre he conectado el teclado por el puerto B a un pic 18F4550 y ha funcionado correctamente. Pero ahora necesito conectarlo por el puerto D del mismo pic, he utilizado varias librerías y hecho lo que dicen muchos tutoriales pero nada ha funcionado aun, si alguien ha realizado ya este ejercicio le agradecería inmensamente de su colaboración. 

esta es la librería que estoy utilizando:

```
////////////////////////////////////////////////////////////////////////////////////
//                                   KBD.C                                        //
//               FUNCIONES PARA ESCANEO DE UN TECLADO MATRICIAL                   //
//                         4X4 HEXADECIMAL, EN EL PORTB                           //
//       kbd_init()       Debe ser invocada antes que las otras funciones.         //
//       c=lcd_getc(c)    Si há sido presionada una tecla devuelve el caracter c    //
//                  y lo salva en el char c, sino se presiona una tecla       //
//                  retorna el valor /0, esta función puede invocarse         //
//                  frecuentemente para no perder teclas pulsadas.            //
//        NOTA: REQUIERE COLOCAR RESISTENCIAS (2.2K) EN LOS PINES DE COLUMNAS     //
//               PINES DE COLUMNAS DE RB0(COL0) A RB3(COL3))                   //
//               PINES DE FILAS DE RB4(ROW0)) A RB7(ROW3))                    // 
//                  MODIF.: ING. FRANK GIRALDO - UD                       //
////////////////////////////////////////////////////////////////////////////////////
/*////////////////////////////////////////////////////////////////////////////////// 
*    RB0 RB1 RB2 RB3   
*     |   |   |   |
*     c0  c1  c2  c3  
*   | 1 | 2 | 3 | F | r0 - RB4
*   | 4 | 5 | 6 | E | r1 - RB5
*   | 7 | 8 | 9 | D | r2 - RB6
*   | A | 0 | B | C | r3 - RB7
*
*   COLUMNS=OUTs
*   ROWS=INs
*   SE HABILITAN PULL-UP INTERNAS 
*   SE REQUIERE COLOCAR RESISTENCIAS (2.2K) EN LOS PINES DE COLUMNAS 
*
*///////////////////////////////////////////////////////////////////////////////////
//
#byte portkbd = 0XF83                  //portkbd = portD
//Keypad connection:   (Column 0 es B0)
//                Bx:
#define COL0 (0 << 0)
#define COL1 (0 << 1)
#define COL2 (0 << 2)
#define COL3 (0 << 3)
#define ROW0 (1 << 4)
#define ROW1 (1 << 5)
#define ROW2 (1 << 6)
#define ROW3 (1 << 7)
#define ALL_ROWS (ROW3|ROW2|ROW1|ROW0)
#define ALL_PINS (ALL_ROWS|COL3|COL2|COL1|COL0)

char const KEYS[4][4] = {{'1','2','3','A'},
                         {'4','5','6','B'},
                         {'7','8','9','C'},
                         {'*','0','#','D'}};

#define KBD_DEBOUNCE_FACTOR 1.2
// Modifique el valor de temporización antirrebote con (KBD_DEBOUNCE_FACTOR = n/333),
// en donde n es el número de veces por segundo en los que ud. invoca
//la función kbd_getc().
//

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;
   //port_d_pullups(TRUE);
   kchar='\0';

   if(++kbd_call_count>KBD_DEBOUNCE_FACTOR)
   {
       switch (col)
       {
         case 0   : set_tris_d(ALL_PINS&~COL0);
                    portkbd=(0b1110);
                    break;

         case 1   : set_tris_d(ALL_PINS&~COL1);
                    portkbd=(0b1101);
                    break;

         case 2   : set_tris_d(ALL_PINS&~COL2);
                    portkbd=(0b1011);
                    break;

         case 3   : set_tris_d(ALL_PINS&~COL3);
                    portkbd=(0b0111);
                    break;
       }

       if(kbd_down)
       {
         if((portkbd & (ALL_ROWS))==(ALL_ROWS))
         {
           kbd_down=FALSE;
           kchar=last_key;
           last_key='\0';
         }
       }
       else
       {
          if((portkbd & (ALL_ROWS))!=(ALL_ROWS))
          {
             if((portkbd & ROW0) == 0)
               row = 0;
             else if((portkbd & ROW1) == 0)
               row = 1;
             else if((portkbd & ROW2) == 0)
               row = 2;
             else if((portkbd & ROW3) == 0)
               row = 3;
             last_key = KEYS[row][col];
             kbd_down = TRUE;
          }
          else
          {
             ++col;
             if(col==4)
             col=0;
          }
       }
      kbd_call_count=0;
   }
  kchar = last_key;
  set_tris_d(ALL_PINS);
  return(kchar);
}

/*char dato;
char tecla()
{
   dato=\'\\0\';
   while(dato==\'\\0\')
   {
      dato=kbd_getc();
      delay_ms(100);
   }
return dato;
} */
```
Y utilizando picc compiler este es el código que manejo en este momento:


```
#include <18F4550.h>
#include <KBD18FD.c>
#use delay(clock=20000000)
#fuses  NOWDT,PUT,NOPROTECT,BROWNOUT,NOLVP,HS,CPD,NODEBUG
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=n)//n bit  seg //debe hacerse en ambos micros 877A

#define prender output_high   
#define apagar output_low
#define luz1 PIN_C1
#define luz2 PIN_C2
#define pulsador1 PIN_B0

#define LCD_DAT PIN_E0
#define LCD_E PIN_E2
#define LCD_CK PIN_E1
#include <LCD4x20_3PIN.c>

char daton;
long auxsegundos;
long segundos;


void un_digito()
{
   lcd_putc("\f");
   segundos=0;
   auxsegundos=0;
   do{
      daton=kbd_getc();
      lcd_putc(daton);
      delay_ms(60);
      if( daton !=0)
      {
         lcd_gotoxy(8,1);
         lcd_putc(daton); 
         delay_ms(1000);
         // daton=daton-0X30;
         auxsegundos=0;
         segundos=12;
      }
      auxsegundos ++;
      if(auxsegundos < 20)
      {
         auxsegundos = 0;
         segundos ++;
      }
   }while(segundos<12);
}
void main()
{
#zero_ram
set_tris_A(0x00);
set_tris_B(0x00);
set_tris_C(0x80);
set_tris_D(0xff);
set_tris_E(0x00); 


lcd_init();
kbd_init();

setup_comparator(No_analogs);
enable_interrupts(INT_RDA);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);

EXT_INT_edge(H_to_L);

output_A(0x00);
output_B(0x00);
output_C(0x00);
output_D(0x00);
output_E(0x00);

lcd_gotoxy(1,1);
lcd_putc("\fBIENVENIDO");
delay_ms(500);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("\fPRUEBA1");
delay_ms(500);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("\fPROTEUS");
delay_ms(500);
un_digito();
      
}
```


----------



## D@rkbytes (Ene 25, 2014)

wilmertri dijo:


> Buenas tardes.
> Me gustaría que me colaboraran con este tema que he venido trabajando ya hace varias semanas y no he logrado aun. En los proyectos que he utilizado siempre he conectado el teclado por el puerto B a un pic 18F4550 y ha funcionado correctamente. Pero ahora necesito conectarlo por el puerto D del mismo pic, he utilizado varias librerías y hecho lo que dicen muchos tutoriales pero nada ha funcionado aun, si alguien ha realizado ya este ejercicio le agradecería inmensamente de su colaboración.


Le hice algunas modificaciones a la librería 4x4 que estás usando para hacerla funcionar un poco mejor,
pero esa librería no puede trabajar conjuntamente con la pantalla por el mismo puerto.

Adjunto el proyecto con la librería modificada y el ejemplo con simulación.

Suerte.


----------



## yamilongiano (Nov 24, 2014)

hola a todos tengo un codigo que no logro comprender podrian ayudarme por favor.

me afloran muchas dudas.


```
char  keypadPort at PORTD;

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

char kp, contar=0;

void main(){

Keypad_Init();
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);


while (1){
 kp=0;
 do
  kp=Keypad_Key_Click();
 while (!kp);
 switch (kp){
  case  1: kp = 49; break;  // 1
  case  2: kp = 50; break;  // 2
  case  3: kp = 51; break;  // 3
  case  4: kp = 55; break;  // A
  case  5: kp = 52; break;  // 4
  case  6: kp = 54; break;  // 5
  case  7: kp = 55; break;  // 6
  case  8: kp = 52; break;  // B
  case  9: kp = 55; break;  // 7
  case 10: kp = 51; break;  // 8
  case 11: kp = 57; break;  // 9
  case 12: kp = 49; break;  // C
  case 13: kp = 42; break;  // *
  case 14: kp = 48; break;  // 0
  case 15: kp = 45; break;  // #
  case 16: kp = 49; break;  // D
 }
 Lcd_Chr_CP(kp);
 contar++;
 if (contar==10){
  contar=0;
  Delay_1sec();
  Lcd_Cmd(_LCD_CLEAR);
 }
}
}
```

despues de compilar...


```
0 1 mikroCPIC1618.exe -MSF -DBG -pP16F877A -DL -O11111114 -fo8 -N"C:\Users\yamil\Desktop\16F887\teclado2\teclado.mcppi" -SP"C:\mikroc_pro\mikroC PRO for PIC\defs\" -SP"C:\mikroc_pro\mikroC PRO for PIC\Uses\P16\" -SP"C:\Users\yamil\Desktop\16F887\teclado2\" "teclado.c" "__Lib_Math.mcl" "__Lib_MathDouble.mcl" "__Lib_System.mcl" "__Lib_Delays.mcl" "__Lib_CType.mcl" "__Lib_CString.mcl" "__Lib_CStdlib.mcl" "__Lib_CMath.mcl" "__Lib_MemManager.mcl" "__Lib_Conversions.mcl" "__Lib_Sprinti.mcl" "__Lib_Sprintl.mcl" "__Lib_Time.mcl" "__Lib_Trigonometry.mcl" "__Lib_Button.mcl" "__Lib_Keypad4x4.mcl" "__Lib_Manchester.mcl" "__Lib_OneWire.mcl" "__Lib_PS2.mcl" "__Lib_Sound.mcl" "__Lib_SoftI2C.mcl" "__Lib_SoftSPI.mcl" "__Lib_SoftUART.mcl" "__Lib_ADC_A_C.mcl" "__Lib_EEPROM.mcl" "__Lib_FLASH_RW.mcl" "__Lib_I2C_c34.mcl" "__Lib_PWM_c21.mcl" "__Lib_SPI_c345.mcl" "__Lib_UART_c67.mcl" "__Lib_PortExpander.mcl" "__Lib_CANSPI.mcl" "__Lib_CF.mcl" "__Lib_GlcdFonts.mcl" "__Lib_Glcd.mcl" "__Lib_LcdConsts.mcl" "__Lib_Lcd.mcl" "__Lib_RS485.mcl" "__Lib_S1D13700.mcl" "__Lib_T6963C.mcl" "__Lib_SPIGlcd.mcl" "__Lib_SPILcd.mcl" "__Lib_SPILcd8.mcl" "__Lib_SPIT6963C.mcl" "__Lib_EthEnc28j60.mcl" "__Lib_EthEnc24j600.mcl" "__Lib_TouchPanel.mcl"  
0 1139 Available RAM: 352 [bytes], Available ROM: 8192 [bytes]  
0 122 Compilation Started teclado.c
57 123 Compiled Successfully teclado.c
0 127 All files Compiled in 500 ms  
0 1144 Used RAM (bytes): 10 (3%)  Free RAM (bytes): 342 (97%) Used RAM (bytes): 10 (3%)  Free RAM (bytes): 342 (97%)
0 1144 Used ROM (program words): 424 (5%)  Free ROM (program words): 7768 (95%) Used ROM (program words): 424 (5%)  Free ROM (program words): 7768 (95%)
0 125 Project Linked Successfully teclado.mcppi
0 128 Linked in 156 ms  
0 129 Project 'teclado.mcppi' completed: 781 ms  
0 103 Finished successfully: 24 nov 2014, 15:56:56 teclado.mcppi
```

en isis.

Ver el archivo adjunto 121125

Ver el archivo adjunto 121125

no puedo seguir al parecer tengo problema con la memoria del pic.

pero quizas tambien el problema va con la introcuvvion de los datos en la memoria.


----------



## PIC102 (May 10, 2015)

Hola, buenas tardes.

Estoy intentado conseguir un programa que:

Al conectar la placa, me salga este mensaje: Codigo:<espacio><lugar para codigo>
Mientras la placa esté esperando dos ordenes.

1)Seria que nosotros cambiemos el interruptor RA5
2)Pulsemos una tecla del 0 al 9

-Si pulsamos el interruptor RA5,me tendria salir el mensaje: hola
-Si pulsamos una tacla , por ejemplo el 4, tendria que salir el mensaje: 
 Codigo:<espacio>4


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Creo que el programa podria empezar así

```
Loop:     call Key_Scan	;Explora el teclado
		                  movlw	0x80
		                  subwf	Tecla,W
		                  btfsc	STATUS,Z	;Hay alguna pulsada ?
		                  goto	mirar_5		;No, seguir explorando
                          goto  modo_normal


                        mirar_5:  btfss PORTA,5           ;El bit 5 esta a 1?
                                  goto loop               ;No lo está
                                  goto modo_configuracion ;Si lo está




                       modo_normal -> aqui vendria la rutina para el código

                       modo_configuración ->aqui vendria la rutina para el hola
```

Lo de arriba creo que esta bien, mi problema es que tengo aqui el código para los mensajes y para la pantalla y no se relacionarlo. Es este:

```
;El teclado y el LCD.
;
;Haciendo uso de las rutinas incluidas en los ficheros TECLADO.INC y LCD_CXX.INC, se trata 
;de leer el teclado y, visualizar sobre el módulo LCD  la tecla pulsada.
;
;El ejemplo pretende mostrar cómo es posible gobernar dos periféricos distintos conectados
;a la misma puerta (LCD y teclado). Para ello basta reprogramarla dinámicamente en el 
;tiempo según sea necesario.

		List	p=16F876	;Tipo de procesador
		include	"P16F876.INC"	;Definiciones de registros internos
                 
Lcd_var		equ	0x20		;Inicio de las variables para el LCD
Key_var		equ	0x22		;Inicio de las variables del teclado				
Temporal_1	equ	0x28		;Variable temporal nº 1
Temporal_2	equ	0x29		;Variable temporal nº 2
	
		org	0x05
		goto	Inicio
				
		include	"LCD_CXX.INC"	;Incluir rutinas de manejo del LCD
		include	"TECLADO.INC"	;Incluir rutinas de manejo del teclado

Tabla_Mensajes:	movwf	PCL		;Desplazamiento sobre la tabla

Mens_0		equ	$		;Mens_0 apunta al primer carácter
		dt	"Se ha pulsado: ",0x00

;*************************************************************************************
;Mensaje: Esta rutina visualiza en el LCD el mensaje cuyo inicio está  indicado en
;el acumulador. El fin de un mensaje se determina mediante el código 0x00

Mensaje         	movwf   	Temporal_1      	;Salva posición de la tabla
Mensaje_1       	movf    	Temporal_1,W    	;Recupera posición de la tabla
                	call    	Tabla_Mensajes  	;Busca caracter de salida
                	movwf   	Temporal_2      	;Guarda el caracter
                	movf    	Temporal_2,F
                	btfss   	STATUS,Z        	;Mira si es el último
                	goto    	No_es_ultimo
                	return
No_es_ultimo    	call    	LCD_DATO        	;Visualiza en el LCD
                	incf    	Temporal_1,F    	;Siguiente caracter
                	goto    	Mensaje_1
							
Inicio:		bsf	STATUS,RP0	;Selecciona página 1 de datos
		movlw	0x06
		movwf	ADCON1		;Puerta A digital
	
		bcf	STATUS,RP0	;Selecciona página 0 de datos
		clrwdt			;Refrescar WDT
				
		call	UP_LCD		;Configura Puerta A y B como salidas
		call	LCD_INI		;Rutina de inicialización del LCD
		movlw	b'00001100'
		call	LCD_REG	;LCD en ON
		movlw	b'00000001'
		call	LCD_REG	;Borra LCD y HOME

;Salida del mensaje "Tecla pulsada:"
				
		movlw	Mens_0
		call	Mensaje		;Visualiza el mensaje
				
;Bucle principal

Loop:		call	Key_Scan	;Explora el teclado
		movlw	0x80
		subwf	Tecla,W
		btfsc	STATUS,Z	;Hay alguna pulsada ?
		goto	Loop		;No, seguir explorando
				
		movlw	0x8f
		call	LCD_REG	;Posiciona el cursor del LCD
		movf	Tecla,W
		sublw	.9
		btfss	STATUS,C        	;Es mayor que 9 (A, B,C,D,E,F)?
		goto	Mayor_que_9	;Si
		movf	Tecla,W		;No
		addlw	0x30            	;Ajuste ASCII de los caracteres del 0 al 9
		call	LCD_DATO	;Visualizar sobre el LCD
		goto	Loop												

Mayor_que_9	movf	Tecla,W
		addlw	0x37		;Ajuste ASCII de los caracteres de la A a la F
		call	LCD_DATO        ;Visualiza sobre el LCD
		goto	Loop

		end			;Fin del programa fuente
```

Haber si podeis ayudarme a que me salga lo descrito arriba.
Muchas gracias!!


----------



## Berto75 (Ago 24, 2015)

A mi me falla algo. No puedo avanzar en ningún proyecto que utilice keypad-phone y un LCD standar.
Esto ocurre también con proyectos que antes funcionaban hechos por otros.
Vuestros programas y correcciones tampoco funcionan.

Cuando aplico el #*define use_portb_kbd TRUE* en kbd.c, en vez del programa principal.c, al compilar me da error diciendo que no existe la carpeta __history en C:\program files\PICC\Drivers.
Ahí es donde intenta guardar.
Cuando yo, esta carpeta sólo la veo donde están todos los archivos del proyecto. ¿Esto es normal?

El único programa que me funciona actualmente con *kbd_get()* sólo me sirve para manejar pulsos/flancos.
Si le meto un *printf(lcd_putc,"\d",lectura);* todo falla.


```
#include <16f877.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG 
#USE delay(clock=4m)
//#define  use_portb_kbd TRUE
#include <lcd.c>
#include <kbd.c>
#include <stdio.h>
#use standard_io(a)
//MANIPULACION
#BYTE PORTD=0X08 
#BYTE TRISD=0X88


void main(){ 
int k,kant=0;
int PWMH=0,PWML=0,nk=0;
lcd_init();
kbd_init();
port_b_pullups(true); //impedancias
//lcd_gotoxy(1,1);
//lcd_putc("\f prueba"); delay_ms(10);// LCD NO MUESTRA NADA
while(true){
k=kbd_getc();
if (k==0)
{ k=kant;}

kant=k;
k=k-48;
PWMH=k*28;
PWML=255-PWMH;
//printf(lcd_putc,"\f k =  %d",k); delay_ms(300);// SI INCLUYO ESTE "printf" NADA FUNCIONA
for(PWMH;PWMH>0;PWMH--){
OUTPUT_HIGH(PIN_A0);
//delay_ms(50);
}
for(PWML;PWML>0;PWML--){
OUTPUT_LOW(PIN_A0);
//delay_ms(50);
}
}
}
```


----------



## D@rkbytes (Ago 24, 2015)

La pantalla no muestra nada porque tienes mal las conexiones en el diseño.

Los bucles "FOR" no están bien, porque asignas los valores externamente y eso hará que el bucle no tenga efecto.

En lugar de...
for(PWMH;PWMH>0;PWMH--)
Debe ser...
for(PWMH=k*28;PWMH>0;PWMH--)

Como quiera, así como pretendes generar PWM, no está bien.
La generación PWM debería estar dentro de un único bucle, usando un timer y con una mejor estructura.

Si ese PIC cuenta con módulo CCP para generar PWM, deberías aprovecharlo y no hacerlo por software.


----------



## Berto75 (Ago 25, 2015)

E vuelto a mirarlo las conexiones estan bien son las "standar" y funcionan en otros proyectos Solo e modificado la alimentacion del LCD quitandole el potencimetro como haceis vosotros.
No lo e probado pero la parte del codigo que te quejas es lo unico que funciona. Es lo unico que me permite hacer kbd_get() Algo hecho por otra persona. Insisto que mi problema esta cada vec que intento escribir algo en el LCD recogido en una variable que es escrita por kbd_get() el resultado siempre es 0. En este proyecto todo va a peor cada vec que utilizo el printf_LCD No funciona nisiquiera el generador de pulsos, la parte que dices que esta mal.


----------



## D@rkbytes (Ago 25, 2015)

Según tú, están bien las conexiones, pero por estar mal, la pantalla no funciona.
Realiza una conexión directa para que mires bien el orden y verás que debe funcionar.

El potenciómetro es importante físicamente, en la simulación no es tomado en cuenta.
Y si todo va cada vez mal, es porque desde un principio lo hiciste todo mal.

Realiza un nuevo diseño o corrige ese teniendo más cuidado en las conexiones.
Sobre el programa entonces ni hablar, porque dices que así te funciona.


----------



## Berto75 (Ago 25, 2015)

Tenias razon en una cosa en un label ponia LCD6 y en otro LCD 6 por eso no respondia el LCD. E tenidop que pasar del KEYPAD-PHONE y lo e cambiado por 12 botones. Tiene cierta ventaja no necesito 6 bits con el nuebo diseño. Mis preguntas ahora son muy simples, las estoy buscando pero No se que e hecho con el libro de dev c++ Era muy valido de referencia


----------



## EmilioLopElectronico (Sep 23, 2015)

*H*ola*,* muy buenas noches*. *Tengo dudas para realizar una clave*.*

Sólo sé los comandos básicos, el teclado ya está listo con el tema del barrido, pero tengo dudas sobre el tema de colocar una clave y que al momento de colocar esa clave tiene que aparecer un 7 y si está mal, colocara un 0*.*
Traté de hacer rutinas de llamadas pero no me ha salido*.*



```
org 0x00

bsf status,rp0


bcf trisa,0
bcf trisa,1
bcf trisa,2
bcf trisa,3


bcf trisb,0
bcf trisb,1
bcf trisb,2
bcf trisb,3

bsf trisb,4
bsf trisb,5
bsf trisb,6
bsf trisb,7


bcf status,rp0
lopez3
bsf portb,0
bcf portb,1
bcf portb,2
bcf portb,3

btfss portb,4
goto lala
movlw 0x07
movwf porta

lala    btfss portb,5
goto lala1
movlw 0x08
movwf porta

lala1    btfss portb,6
goto lala2
movlw 0x09
movwf porta

lala2    btfss portb,7
goto lala3
movlw 0x0A
movwf porta


lala3    bcf portb,0    
bsf portb,1
bcf portb,2
bcf portb,3

btfss portb,4
goto lero
movlw 0x04
movwf porta

lero    btfss portb,5
goto lero1
movlw 0x05
movwf porta

lero1    btfss portb,6
goto lero2
movlw 0x06
movwf porta

lero2    btfss portb,7
goto lero3
movlw 0x0B
movwf porta

lero3    bcf portb,0
bcf portb,1
bsf portb,2
bcf portb,3

btfss portb,4
goto emi1
movlw 0x01
movwf porta

emi1    btfss portb,5
goto emi2
movlw 0x02
movwf porta

emi2    btfss portb,6
goto emi3
movlw 0x03
movwf porta

emi3    btfss portb,7
goto emi4
movlw 0x0c
movwf porta


emi4    bcf portb,0
bcf portb,1
bcf portb,2
bsf portb,3

btfss portb,4
goto lopez
movlw 0x0F
movwf porta

lopez    btfss portb,5
goto lopez1
movlw 0x00
movwf porta

lopez1    btfss portb,6
goto lopez2
movlw 0x0E
movwf porta


lopez2    btfss portb,7
goto lopez3
movlw 0x0D
movwf porta


end
```
*L*a pregunta es*,* *¿*cómo logro hacer una combinación, la cual al realizarla me coloque un 7 en el display*?*


----------



## D@rkbytes (Sep 23, 2015)

Deberías comentar el programa y usar etiquetas con nombres coherentes.
Cuando realices un programa más grande, eso de lala, lero, lopez, etc. No te servirá para identificar las rutinas posteriormente.


EmilioLopElectronico dijo:


> Sólo sé los comandos básicos


A nivel programación, los comandos hacen referencia a información, e instrucciones al set de palabras del compilador.


EmilioLopElectronico dijo:


> *L*a pregunta es*,* *¿*cómo logro hacer una combinación, la cual al realizarla me coloque un 7 en el display*?*


A ese programa le hacen falta muchas cosas para que realice lo que quieres.


No tiene cabecera.
No tiene configuración de registros y variables.
No incluye librerías ni rutinas para el manejo de LCD o displays de 7 segmentos.
Etcétera.
Debes empezar siempre por lo más elemental antes de llevar a cabo un proyecto como el que pretendes.

Como dato extra:
Si recopilas información sobre los posts que existen en el Foro usando el buscador, podrás obtener partes fundamentales de código para lograr lo que deseas.


----------



## EmilioLopElectronico (Sep 23, 2015)

No conosco aun las librerias debido a que soy nuevo y en clases  estamos usando el pic simulator aun no le encuentro las librerias y creo que tampoco aun nos van a enseñar a usarlas, la programacion me funciona en proteus me cumple el objetivo de al momento de presionar la tecla me salga el numero pero lo que quiero implementar no me funciona de colocarle una clave especifica de 3 digitos 

Si quieres te comparto el proteus con la programacion para que veas que en realidad si me funciona y es muy simple el programa que realize para el teclado


----------



## D@rkbytes (Sep 23, 2015)

OK. Si piensas continuar con lenguaje ensamblador, que a estas alturas ya es obsoleto, te recomiendo que uses algo serio, como MPLAB o MPLAX.

Aprender ensamblador no está nada mal, pero tardarás mucho tiempo en crear un programa si no tienes los conocimientos suficientes.
En cambio, con otros lenguajes de programación de alto nivel, como Basic o C, podrás realizar tu programa en cuestión de minutos u horas.
¿Por qué? Porque éstos lenguajes ya incluyen librerías e instrucciones directas para controlar LCD y otros periféricos más.
Así te evitas escribir librerías y código extra para el manejo de los dispositivos externos.

Y te repito, recopila información. Aquí en Foro existe bastante.
Para poder ayudarte, yo tendría que buscar esa información por ti y crear un proyecto que te corresponde realizar a ti.


----------



## EmilioLopElectronico (Sep 25, 2015)

No me queda otra, Si fuera por mi seguiría solo en C

Eso me estan pasando en una asignatura y el profesor no me da muchos datos solo me dice "Aprende las instrucciones y luego nos da estos ejercicios que tenemos que pensarlo solos
estamos sin libreria tenemos que hacer toda la instrucción

Lo he intentado y vuelto a intentar y aun no llego a la respuesta


----------



## D@rkbytes (Sep 25, 2015)

Pero no me hiciste caso acerca de que recopilaras información sobre los proyectos que existen en el Foro.
Te daré una ayuda, mira éstos enlaces: *Resultados de Búsqueda*

En algunos de ellos podrás encontrar proyectos realizados en ensamblador y en otros lenguajes.
Utiliza el que más te convenga y realiza los cambios que creas necesarios.
También puedes usar partes de varios programas para crear tu proyecto final.

Los proyectos funcionales del Foro son de libre distribución, subidos por gente que colabora para que otras personas aprendan de sus experiencias y sin fines de lucro.


----------



## mendek (Nov 7, 2015)

Buenas tardes compañeros del foro.

Estoy haciendo un juego y la parte primordial es la interfase LDC y teclado... con el usiario.

El problema que tengo es que al oprimir una tecla del teclado matricial 3x4, en la LCD me aparece como si hubiera oprimido la misma tecla muchas veces, o aparecen espacios en la LCD. 
Estoy utilizando un PIC16F628A.
Este es mi código:


```
lcd_init();             // Se inicializa la pantalla
kbd_init();
while(1){             

   k=0;                    // Contador de teclas oprimidas
   claveOK=0;              // Se limpia la bandera de clave correcta
   
   do{                     // Ciclo infinito
   
  tecla=kbd_getc();
   
   if(tecla >= '0' && tecla <= '9'){  // Si se oprime una tecla numérica
      printf(lcd_putc,"%c",tecla);
      clave[k]=tecla;      // Se guarda el valor de la tecla oprimida
      k=k+1;               // Se incrementa el contador de teclas
      if(k == d){          // Si ya se oprimieron 4 teclas,
      
      for(k=0;k<=d-1;k++){         // Ciclo for de lectura de la EEPROM
      pass[k]=read_eeprom(k)+48; // Se lee el password de la EEPROM
                                 // cada valor se convierte a ASSCII
      }
      
      if(clave[0]== pass[0] &&   // Si la clave es correcta,
         clave[1]== pass[1] &&
         clave[2]== pass[2] &&
         clave[3]== pass[3] &&
         clave[4]== pass[4] &&
         clave[5]== pass[5] &&
         clave[6]== pass[6] &&
         clave[7]== pass[7] &&
         clave[8]== pass[8] &&
         clave[9]== pass[9] &&
         clave[10]== pass[10] &&
         clave[11]== pass[11] &&
         clave[12]== pass[12] &&
         clave[13]== pass[13] &&
         clave[14]== pass[14] &&
         clave[15]== pass[15])
         {
         claveOK=1;             // Se activa la bandera claveOK para salir del
                                // ciclo do-while
         delay_ms(1000);        //  Espera un segundo segundo
         lcd_putc('\f');         // Se borra la Pantalla
         lcd_putc("BOMB DROPPED ;)");
                                
         
      }
      else{              // Si la clave no es correcta,
      delay_ms(1000);        //  Espera un segundo segundo
      lcd_putc('\f');         // Se borra la Pantalla
      lcd_putc("INCORRECT");
      Lcd_gotoxy(1,2);        // Se ubica el cursor al principio de la línea 2
      lcd_putc("PASSWORD!"); // Se borra la línea
      delay_ms(1000);    // Espera 1 segundo
      k=0;               // Se limpia el contador de números introducidos
      lcd_putc('\f');         // Se borra la Pantalla
      lcd_putc("DROP THE BOMB:"); // Se imprime mensaje de para la activación
      lcd_gotoxy(1,2);     // Se ubica el cursor en la posición 9 de la línea 2
      }
         
      } 
   } 
   
   }while(claveOK == 0);
   
   
   
   }
```

La LCD están al mismo puerto B que el teclado.

El teclado que estoy usando lo hice yo con push-buttons nuevos.

No sé si la solución sea agregar capacitores en paralelo con cada interruptor 

Sin más de momento espero me puedan echar una mano.

GRACIAS


----------



## D@rkbytes (Nov 8, 2015)

Ese problema es debido a rebotes en las teclas.
Como lo hiciste con pulsadores sueltos, puedes colocar un capacitor de 470 nF (Tantalio) en cada uno.
Eso hará que el rebote se contenga, pero es mejor que uses un teclado de membrana plateada. 
Como no subiste el programa completo, (falta la parte de declaración de variables) aproveché para hacer algunos cambios, y supongo que tienes un arreglo para una clave de 16 dígitos, pero usas sólo 4.
También puse un retardo antirrebote para disminuir el efecto.


```
#include <16f628a.h>
#use     delay(internal = 4MHz)

#include <lcd.c>
#define  use_portb_kbd 1
#include <kbd.c>

// El inicio de direcciones EEPROM en el 16F628A es 0x2100
// De ésta manera se obtiene la dirección en cualquier PIC
#rom getenv("EEPROM_ADDRESS") = {1,2,3,4}   // Clave en EEPROM interna.


void main (void)
{
   char d=4,k,clave[4],pass[4],claveOK,tecla;
   
   lcd_init();                            // Se inicializa la pantalla
   port_b_pullups(1);
   kbd_init();
   
   lcd_putc("\fIngresar clave:");

   while(true)
   {

      k=0;                                // Contador de teclas oprimidas
      claveOK=0;                          // Se limpia la bandera de clave correcta
   
      do                                  // Ciclo infinito
      {
         tecla=kbd_getc();
   
         if(tecla >= '0' && tecla <= '9') // Si se oprime una tecla numérica
         {
            delay_ms(50);                 // Antirrebote
            
            clave[k]=tecla;               // Se guarda el valor de la tecla oprimida
            k=k+1;                        // Se incrementa el contador de teclas
            lcd_gotoxy(k,2);
            printf(lcd_putc,"%c",tecla);
            
            if(k == d)                    // Si ya se oprimieron 4 teclas
            {
               for(k=0;k<d;k++)           // Ciclo for de lectura de la EEPROM
               {
                  pass[k]=read_eeprom(k)+48; // Se lee el password de la EEPROM
                                          // cada valor se convierte a ASSCII
               }
      
               if(clave[0]== pass[0] &&   // Si la clave es correcta,
               clave[1]== pass[1] &&
               clave[2]== pass[2] &&
               clave[3]== pass[3])
               {
         
               claveOK=1;                 // Se activa la bandera claveOK para salir del
               delay_ms(250);
                                          // ciclo do-while
               lcd_putc("\fBOMB DROPPED ;)");
               }
               else                       // Si la clave no es correcta,
               {
                  delay_ms(1000);         //  Espera un segundo segundo
                  lcd_putc("\fINCORRECT");
                  Lcd_gotoxy(1,2);        // Se ubica el cursor al principio de la línea 2
                  lcd_putc("PASSWORD!");  // Se borra la línea
                  delay_ms(1000);         // Espera 1 segundo
                  k=0;                    // Se limpia el contador de números introducidos
                  lcd_putc("\fDROP THE BOMB:"); // Se imprime mensaje de para la activación
                  lcd_gotoxy(1,2);        // Se ubica el cursor en la posición 9 de la línea 2
               }
            }
         }
      }
      while(claveOK == 0);
   }
}
```


----------



## gautamax (Nov 9, 2015)

D@rkbytes dijo:


> Después de realizar algunas modificaciones al programa y al diseño, ya lo tengo funcionando.
> Al parecer existe un bug con la instrucción *port_b_pullups(true);* al trabajar con el PIC16F887.
> No activa las resistencias pull-up en el puerto B
> Como no había usado esa instrucción del PCWHD Compiler con este PIC, no lo había notado.
> ...


 
Como me rompí la cabeza tratando de hacer andar el teclado por el puerto b en el PIC 16f886!!:cabezon:
no me había dado cuenta que no funcionaban las resistencias pull-up gracias a tu comentario pude solucionarlo, gracias!


----------



## D@rkbytes (Nov 9, 2015)

gautamax dijo:


> Como me rompí la cabeza tratando de hacer andar el teclado por el puerto b en el PIC16F886!!:cabezon:
> No me había dado cuenta que no funcionaban las resistencias pull-up gracias a tu comentario pude solucionarlo. Gracias!


Un poco tiempo después, vi que en el PIC16F886 / 7 y otros más, la instrucción port_b_pullups(); acepta un parámetro diferente al clásico "*TRUE*" que se coloca en otros PIC.

Éste parámetro es un valor de 8 bits (Un Byte) llamado "*upmask*"
Aquí debemos indicar los bits del puerto B a los cuales se les quiere poner resistencias pull-up interna.

Por ejemplo:
*port_b_pullups*(*0b11110000*);

Aquí tendrán activa la resistencia pull-up, los bits 7, 6, 5 y 4 del puerto B, y los bits 3, 2, 1 y 0, no la tendrán.

O sea que al PIC16F887 se le pueden activar la resistencias pull-up a cada pin independientemente.

Como siempre nos acostumbramos a usar: *port_b_pullups*(*TRUE*);, nunca se iban a activar las demás, porque el valor "*TRUE*" es igual a "*1*", por lo tanto únicamente se activaría la pull-up del bit 0 (RB0)

Entonces, dando como parámetro los bits que requieran pull-up, podemos activar las que necesitemos.
De esta forma ya no será requerido declarar los registros.

Siempre funcionó la instrucción *port_b_pullups()*, pero no se utilizó correctamente en éste PIC.


----------



## miglo (Nov 11, 2015)

D@rbytes el retardo de 50 milisegundos ¿no es pequeño?.


----------



## D@rkbytes (Nov 11, 2015)

miglo dijo:


> D@rbytes el retardo de 50 milisegundos ¿no es pequeño?.


No, de hecho con 20 ms. es suficiente.
Pero si no tienes otros procesos que atender por interrupciones, lo puedes aumentar.
Aunque ya con ese retardo y los capacitores en los pulsadores, no creo que tengas problemas por rebotes.


----------



## miglo (Nov 11, 2015)

Te hago el comentario por que cuando hago alguna prueba con el proteus, si no pongo un retardo de minimo 250 ms, me salta muy rapido la pulsaciones, ojo esta claro que nunca he puesto en las pruebas ningun condensador, que por lo que estoy viendo, es necesario por lo de filtro.


----------



## D@rkbytes (Nov 11, 2015)

El proceso debe ser rápido, no veo motivo para que se tenga que esperar la ejecución de tecla presionada.
Lo que si debe preocuparte son los rebotes, y obvio que con retardos altos se eliminan, pero ralentizas el proceso.


----------



## Berto75 (Ene 21, 2016)

Pues a mi con 4Mhz 50ms era demasiado poco. Ahora utilizo esto como antirrabote. Teniendo en cuenta que el teclado se lee en la interrupción RB

#INT_RB
void  RB_isr(void){
lee=(Input_B () & 0XF0)>>4;///esto hace que la lectura 16 a 255 pase de 1 a 15
clear_interrupt(INT_RB);
}
///////
void AntiRebote(int1 pulsa){
if(lee>0 || pulsa){//en caso contrario no hagas nada
lee=0; 
 disable_interrupts(INT_RB);
unsigned int8 rss;
//1//DISABLE RB Hasta que b4-7=0000 (siempre)
do{ rss=Input_B () & 0XF0; }while(rss>0); //No sale de aquí hasta mientras se mantenga pulsada //cualquier tecla
//2//pulsa=1 DISABLE RB Hasta que se pulse cualkier tecla (opcional)   
if(pulsa){ 
do{ rss=Input_B () & 0XF0; }while(rss<1); }
 clear_interrupt(INT_RB);
 enable_interrupts(INT_RB);
}  }

Eso si. Si lo que te interesa es que la lectura se repita manteniendo la tecla pulsada, esto nunca va a ocurrir.


----------



## Tian (Abr 19, 2016)

Buen día

Estoy intentando hacer un teclado matricial 4x3 con el codificador 74C922 y el decodificador 7448. Conecte el teclado como aparece en el datasheet del codificador, pero tengo un problema que al presionar el botón "2" la salida en el display me aparece "1". Como podría solucionarlo para que cuando oprima un numero, el display me arroje el que es. Adjunto el circuito que tengo para ver si alguien me puede colaborar en darle solución.

Gracias!





Romi87 dijo:


> Gracias por la respuesta! Seguire provando porque mis numeros van en columnas de 3 i el IC los da en columnas de 4, no se si me explico muy bien.
> 
> De todas formas, gracias por tu interes y ayuda!



Buen día

De casualidad pudiste darle solución a tu problema, porque yo también tengo el problema que cuando presiono el "2", el display me aparece el "1". Te agradecería si me dijeras como pudiste solucionarlo

Gracias.


----------



## D@rkbytes (Abr 19, 2016)

La distribución y numeración de teclas no corresponde con las posibles conexiones que muestra la hoja de datos.
Para no modificar el componente "KEYPAD-PHONE", es mejor que lo hagas con pulsadores.

Algo así:
​


----------



## Tian (Abr 19, 2016)

Lo que pasa es que no puedo usar pulsadores sino puro teclado. Entonces quería saber como podría cuadrarlo para que funcione con el teclado.


----------



## D@rkbytes (Abr 19, 2016)

Es que la única manera en que cuadren las teclas, es modificando el componente.
De otra forma tendrás que interpretar los números de las teclas y hacer la conexión correcta.

Así quedaría y se mostrarán los dígitos en el orden que se muestra en la hoja de datos.
​
Entonces el orden de las teclas sería el siguiente:
Tecla:
7 = 0
8 = 1
9 = 2
Entre = 3
4 = 4
5 = 5
6 = 6
X = 7
1 = 8
2 = 9
3 = 10
- = 11
C\ON = 12
0 = 13
= = 14
+ = 15

Y si lo quieres hacer con el teclado 3x4 "KEYPAD-PHONE", también tienes que modificar el orden de las conexiones.​


----------



## Alcocer Garcia Felix Davi (May 22, 2016)

El presente proyecto tiene como función, almacenar números en 16 posiciones de memoria.
Cuando llega a la posición 16, debe indicar lleno en el LCD.

El problema reside en que cuando estoy presionando el teclado y presiono 1,2,3, cuando llego a 3 todo sigue automáticamente y sólo se almacenan 3

El circuito y la programación están aquí abajo.

Gracias.


----------



## miguelus (May 22, 2016)

Buenos días  Alcocer Garcia Felix Davi

En el esquema DSN que has posteado, los dos extremos del Cuarzo están conectados a Masa, de esta manera no podrá oscilar.

En cuanto  al problema de la programación, seguramente algún compañero del foro te podrá ayudar, yo de programación se lo mismo que de "sexar" pollos.

Sal U2


----------



## roberttorres (May 22, 2016)

Hola Alcocer
El problema de tu código es que no estas usando un anti rebote en la lectura del teclado
Podrias hacer asi:

```
Teclado:
        Tu codigo
        PAUSE 200; ANTI REBOTE
        return ' Retorna una línea después del llamado "Call" 
        END
```

O tambien Asi:

```
Teclado:
        Tu codigo
        GOSUB ANTIREBOTE; ANTI REBOTE
        return ' Retorna una línea después del llamado "Call" 
        
 ;RUTINA ANTI REBOTE
       ANTIREBOTE:
       FOR R = 1 TO 200
        PAUSE 1
       NEXT R
       RETURN 

END
```


----------



## Alcocer Garcia Felix Davi (May 25, 2016)

Bueno, ahora que he vuelto a simular me sale; "simulation its no running in proteus"
¿Cómo podría mejorar la simulación, o acaso es imposible?


----------



## Alcocer Garcia Felix Davi (May 26, 2016)

Hola a todos le di solución lo que falla es la simulación y se soluciona reduciendo la velocidad del oscilador gracias.


----------



## ASDRUBAL2 (Oct 2, 2016)

Hola colegas del foro, en estos dias me ubicaron pidiendome ayuda para la programacion de un pic18f4550, para mi sorpresa ya tenian el circuito armado las conecciones del teclado, lcd, ds1302 y demas sensores todo ya en fisico.

Al principio mi problema fue enviar datos al LCD4x20 porque usaron todo un PuertoD y PuertoE para el LCD, logre resolver esa parte pero ahora el problema es como les muestro en la imagen el Teclado 4x3.
Esta es la conexion por si no se ve la imagen.
Fila A >> RC2
Fila B >> RC6
Fila C >> RC1
Fila D >> RC0

Columna 1 >> RB2
Columna 2 >> RB3
Columna 3 >> RB4

Logre hacer un codigo para el teclado con esa configuracion de pines y ya me detecta los numeros y simbolos. 
Pero cuando captura repite el numero varias veces.
Si alguien es tan amable de decirme que estoy haciendo mal o si tiene una libreria que pueda colocarle los pines en esa forma por favor ayudemne.

Estoy usando Picc Compiler 

p2aFullKey4x3.c


```
/*
Mapa de pines para el teclado 4x3 
RB2  COL0
RB3  COL1
RB4  COL2

RC0  FIL3
RC1  FIL2
RC2  FIL0
RC6  FIL1
*/

#BYTE PORTA = 0xF80
#BYTE PORTD = 0xF83
#BYTE PORTE = 0xF84
#BYTE TRISA = 0xF92
#BYTE TRISB = 0xF93
#BYTE TRISC = 0xF94
#BYTE TRISD = 0xF95
#BYTE TRISE = 0xF96


#BYTE PORTB = 0xF81
   #BIT RB0 = PORTB.0
   #BIT RB1 = PORTB.1
   #BIT RB2 = PORTB.2
   #BIT RB3 = PORTB.3
   #BIT RB4 = PORTB.4
   #BIT RB5 = PORTB.5
   #BIT RB6 = PORTB.6
   #BIT RB7 = PORTB.7
   
#BYTE PORTC = 0xF82
   #BIT RC0 = PORTC.0
   #BIT RC1 = PORTC.1
   #BIT RC2 = PORTC.2
   #BIT RC4 = PORTC.4
   #BIT RC5 = PORTC.5
   #BIT RC6 = PORTC.6
   #BIT RC7 = PORTC.7
   


void key_init(void);
unsigned char getkey(unsigned char kbd);
unsigned char rotabit(void);
unsigned char value, key;
static int1 kbd_down;
static char last_key;
   
   
void key_init(void){
   TRISB=0b00011100;   //RB2-RB4 com entradas
   TRISC=0b00111000;   //RC0-RC2, RC6 como salidas
   RC2 = 0; //A
   RC6 = 1; //B
   RC1 = 1; //C
   RC0 = 1; //D
}


unsigned char getkey(){
 
   
    last_key = rotabit();
    RC2 = 0;
    
    if(kbd_down) {
           kbd_down=FALSE;
           key=last_key;
           last_key='\0';
         
       }else{
         kbd_down = TRUE;
         
       }
    return key;
}
 
unsigned char rotabit(){ 
//pines      RC0 RC1 RC6 RC2
// incia en   1   1   1   0

     if(input_state(PIN_C2)==0){  
            RC6 = 1; //B
            RC1 = 1; //C
            RC0 = 1; //D
        
          delay_ms(5);
        if(RB2==0 && RB3==1 && RB4==1){
           
           value=1;
         //  return value;
          }
        if(RB2==1 && RB3==0 && RB4==1){
            
           value=2;
         //  return value;
          }
        if(RB2==1 && RB3==1 && RB4==0){
            
           value=3;
        //   return value;
           }
            RC2 = 1; //C
            RC6 = 0;
       //  return value;
      }//fin fila A
           
     
     if(input_state(PIN_C6)==0){
            RC2 = 1; //A
            RC1 = 1; //C
            RC0 = 1; //D
         
           delay_ms(5);
         if(RB2==0 && RB3==1 && RB4==1){
           
           value=4;
        //   return value;
          }
         if(RB2==1 && RB3==0 && RB4==1){
            
           value=5;
         //  return value;
          }
         if(RB2==1 && RB3==1 && RB4==0){
            
           value=6;
          // return value;
           }
             RC6 = 1;
            RC1 = 0;
       // return value;
      }//fin fila B
     
     if(input_state(PIN_C1)==0){
            RC2 = 1; //A
            RC6 = 1; //C
            RC0 = 1; //D
         
          delay_ms(5);
        if(RB2==0 && RB3==1 && RB4==1){
           
           value=7;
          // return value;
          } 
        if(RB2==1 && RB3==0 && RB4==1){
            
           value=8;
         //  return value;
          }
        if(RB2==1 && RB3==1 && RB4==0){
            
           value=9;
          // return value;
           }
            RC1 = 1;
            RC0 = 0;
           
        //return value;
      }//fin fila C
     
     if(input_state(PIN_C0)==0){
            RC2 = 1; //A
            RC1 = 1; //C
            RC6 = 1; //D
        
            delay_ms(5);
        if(RB2==0 && RB3==1 && RB4==1){
           
           value="*";
          // return value;
          }
        if(RB2==1 && RB3==0 && RB4==1){
            
           value=0;
          // return value;
          }
        if(RB2==1 && RB3==1 && RB4==0){
            
           value="#";
          // return value;
          }
             RC0 = 1;
            RC2 = 0;
            
       // return value;
      }//fin fila D
     
     return value;
}
```

main.c

```
#include "C:\Documents and Settings\Administrador\Escritorio\Proyecto_vascula2016\cabecera.h"
/*****************************NO TOCAR ****************************************/

//*********Variables para las funciones del teclado

unsigned char k,NUM1,NUM2,NUM3,NUM4, tecla;
int x=4;




void sethora()
{
//Establece fecha y hora 
i2c_start(); //Inicia I2C 
i2c_write(0xd0); //Direcciona DS1307 write 
i2c_write(ds_seconds); //Indica que empiece en registro ds_seconds 
i2c_write(seconds); 
i2c_write(minutes); 
i2c_write(hours); 
i2c_write(control); 
i2c_stop(); //Ya puso la hora y fecha 
//El RTC ya está marcando el tiempo y fecha 
}

void setfecha()
{
//Establece fecha y hora 
i2c_start(); //Inicia I2C 
i2c_write(0xd0); //Direcciona DS1307 write 
i2c_write(ds_date); //Indica que empiece en registro ds_seconds 
i2c_write(date); 
i2c_write(month); 
i2c_write(year); 
i2c_write(control); 
i2c_stop(); //Ya puso la hora y fecha 
//El RTC ya está marcando el tiempo y fecha 
}

void cheqhr()
{                                    
    if(hours==0x0a)hours=0x10;
    if(hours==0x1a)hours=0x20;
    if(hours==0x24)hours=0x00;
}
void cheqmin()
{                                    
    if(minutes==0x0a)minutes=0x10;
    if(minutes==0x1a)minutes=0x20;
    if(minutes==0x2a)minutes=0x30;
    if(minutes==0x3a)minutes=0x40;
    if(minutes==0x4a)minutes=0x50;
    if(minutes==0x5a)minutes=0x00;
}
void cheqday()
{                                    
    if(date==0x0a)date=0x10;
    if(date==0x1a)date=0x20;
    if(date==0x2a)date=0x30;
    if(date==0x32)date=0x01;
}
void cheqmon()
{                                    
    if(month==0x0a)month=0x10;
    if(month==0x13)month=0x01;
}
void cheqyear()
{                                    
    if(year==0x1a)year=0x20;
    if(year==0x21)year=0x10;
}



/*FUNCION DE ASIGNA VALOR A VARIABLES POR CADA TECLA PULSADA  */
unsigned char ASIGVALOR(unsigned char t){

unsigned char k = t;
        
      if (x==4){
      NUM4=k;
    //  lcd_gotoxy(1,3);
    //  printf(lcd_putc,"NUM1:%d ",NUM1);
      //x=4;
      }
      else if (x==3){
      NUM3=k;
     // lcd_gotoxy(1,3);
     // printf(lcd_putc,"NUM2:%d ",NUM2);
     // x=1;
      }
      else if(x==2){
      NUM2=k;
     // lcd_gotoxy(1,3);
     // printf(lcd_putc,"NUM3:%d ",NUM3);
     // x=2;
      }
      else if(x==1){
      NUM1=k;
     // lcd_gotoxy(1,3);
    //  printf(lcd_putc,"NUM4:%d ",NUM4);
     // x=3;
      }
      
      lcd_gotoxy(1,3);
      printf(lcd_putc," %d%d%d%d ",NUM4, NUM3, NUM2, NUM1);
      return x;
}


void main(void){ 


   int16 centenas;               //variable para las centenas del ángulo
   int decenas,unidades;         //Variable para las decenas y unidades del ángulo
    int16 angulo;                 //Ángulo del servo
setup_adc_ports(NO_ANALOGS); 
setup_adc(ADC_OFF); 
setup_psp(PSP_DISABLED); 
setup_spi(FALSE); 
setup_timer_0(T0_OFF); 
setup_timer_1(T1_DISABLED); 
setup_timer_2(T2_DISABLED,0,1); 
setup_comparator(NC_NC_NC_NC); 


set_tris_A(0x20);
set_tris_B(0b00000000);
PORTA =0;
RB5 =0;
RB6 =0;
RB7 =0;
PORTC =0;

       lcd_init(); 
       key_init();
       lcd_putc("\f");
       lcd_putc("Teclado y LCD");
       
       
while(true){
     
     
       k=getkey();  
       
      if (k!=35&&k!=42){ //Solo se toman los valores numéricos
        
         do{           
            k=getkey();
            tecla=k;
               if (k!=42&&k!=35){    //Solo se toman los valores numéricos
                  centenas=decenas;
                  decenas=unidades;
                  unidades=tecla;
                  lcd_gotoxy(1,2);
                  printf(lcd_putc,"Angulo = %ld%d%d", centenas, decenas, unidades);
                  
                  angulo=(centenas*100)+(decenas*10)+unidades;
                  lcd_gotoxy(1,4);
                  printf(lcd_putc,"T. Angulo = %ld", angulo);
                }
          }while(x!=42)// fin do{}while (x!=42)
      
      }// fin if (k!=35&&k!=42)
 
    }//fin while tru principal
}//fin void main
```

cabecera.h

```
#define PROYECTO_PIC18F4550

#if defined(PROYECTO_PIC18F4550)
  
   #include <18f4550.h>
   #device ADC = 10
   #Fuses  XT,NOWDT,NOPROTECT,NOLVP,NODEBUG,CPUDIV1,VREGEN,MCLR
  
   #use delay(clock=4M)
   
   #include "C:\Documents and Settings\Administrador\Escritorio\Proyecto_vascula2016\p2a_lcd.c"
   #include "C:\Documents and Settings\Administrador\Escritorio\Proyecto_vascula2016\p2aFullKey4x3.c"
   #use i2c(MASTER, SDA=PIN_b0, SCL=PIN_b1,slow) 

   #use fast_io(a)
   #use fast_io(b)
   #use fast_io(c)

   #define OFF    0
   #define ON     1   
   
//Registros DS1307 
#define ds_seconds 0x00 
#define ds_minutes 0x01 
#define ds_hours 0x02 
#define ds_day 0x03 
#define ds_date 0x04 
#define ds_month 0x05 
#define ds_year 0x06 
#define ds_control 0x07 

//DS1307 
//Vbat a tierra 

//// Declarando variables////////


//Dato en registro ds, a mandar o leer 
int seconds,minutes,hours,day,date,month,year,control;

#endif
```

p2a_lcd.c

```
// Change these pins to fit your own board.

#define LCD_DB4 PIN_D4
#define LCD_DB5 PIN_D5
#define LCD_DB6 PIN_D6
#define LCD_DB7 PIN_D7

#define LCD_RS PIN_E0
#define LCD_RW PIN_D1
#define LCD_E  PIN_E1

// If you only want a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.

//#define USE_LCD_RW 1

//========================================

#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line


int8 const LCD_INIT_STRING[4] =
{
  0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
  0xc, // Display on
  1, // Clear display
  6 // Increment cursor
};


//-------------------------------------
void lcd_send_nibble(int8 nibble)
{
  // Note: !! converts an integer expression
  // to a boolean (1 or 0).
  output_bit(LCD_DB4, !!(nibble & 1));
  output_bit(LCD_DB5, !!(nibble & 2));
  output_bit(LCD_DB6, !!(nibble & 4));
  output_bit(LCD_DB7, !!(nibble & 8));

  delay_cycles(1);
  output_high(LCD_E);
  delay_us(2);
  output_low(LCD_E);
}

//-----------------------------------
// This sub-routine is only called by lcd_read_byte().
// It's not a stand-alone routine. For example, the
// R/W signal is set high by lcd_read_byte() before
// this routine is called.

#ifdef USE_LCD_RW
int8 lcd_read_nibble(void)
{
  int8 retval;
  // Create bit variables so that we can easily set
  // individual bits in the retval variable.
  #bit retval_0 = retval.0
  #bit retval_1 = retval.1
  #bit retval_2 = retval.2
  #bit retval_3 = retval.3

  retval = 0;

  output_high(LCD_E);
  delay_cycles(1);

  retval_0 = input(LCD_DB4);
  retval_1 = input(LCD_DB5);
  retval_2 = input(LCD_DB6);
  retval_3 = input(LCD_DB7);

  output_low(LCD_E);

  return(retval);
}
#endif

//---------------------------------------
// Read a byte from the LCD and return it.

#ifdef USE_LCD_RW
int8 lcd_read_byte(void)
{
  int8 low;
  int8 high;

  output_high(LCD_RW);
  delay_cycles(1);

  high = lcd_read_nibble();

  low = lcd_read_nibble();

  return( (high<<4) | low);
}
#endif

//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
  output_low(LCD_RS);

#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif

  if(address)
  output_high(LCD_RS);
  else
  output_low(LCD_RS);

  delay_cycles(1);

#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
#endif

  output_low(LCD_E);

  lcd_send_nibble(n >> 4);
  lcd_send_nibble(n & 0xf);
}

//----------------------------
void lcd_init(void)
{
  int8 i;

  output_low(LCD_RS);

#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif

  output_low(LCD_E);

  delay_ms(15);

  for(i=0 ;i < 3; i++)
  {
    lcd_send_nibble(0x03);
    delay_ms(5);
  }

  lcd_send_nibble(0x02);

  for(i=0; i < sizeof(LCD_INIT_STRING); i++)
  {
    lcd_send_byte(0, LCD_INIT_STRING[i]);

    // If the R/W signal is not used, then
    // the busy bit can't be polled. One of
    // the init commands takes longer than
    // the hard-coded delay of 60 us, so in
    // that case, lets just do a 5 ms delay
    // after all four of them.
#ifndef USE_LCD_RW
delay_ms(5);
#endif
}

}

//----sab 01/10/16 se agrego funciones para LCD 4x16
//----PARA TRABAJAR CON LCD4X16 COMENTE LAS FUNCIONES -------
//---- lcd_gotoxy 
//---- lcd_putc
/*
void lcd_gotoxy(int8 x, int8 y)
{
  int8 address;

  if(y != 1)
  address = lcd_line_two;
  else
  address=0;

  address += x-1;
  lcd_send_byte(0, 0x80 | address);
}

//-----------------------------
void lcd_putc(char c)
{
  switch(c)
  {
    case '\f':
      lcd_send_byte(0,1);
      delay_ms(2);
      break;

    case '\n':
      lcd_gotoxy(1,2);
      break;

    case '\b':
      lcd_send_byte(0,0x10);
      break;

    default:
      lcd_send_byte(1,c);
      break;
  }
}
*/
//------------------------------

//----PARA TRABAJAR CON LCD2X16 COMENTE LAS FUNCIONES -------
//----lcd_gotoxy 
//----lcd_putc 
//---- Tambien comente BYTE lcdline; busque por arriba

BYTE lcdline;
void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;

   switch(y) {
 
     case 1 : address=0x80;break;
     case 2 : address=0xc0;break;
     case 3 : address=0x90;break;
     case 4 : address=0xd0;break;
  
   }
   address+=x-1;
   lcd_send_byte(0,address);
}

void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   lcdline=1;
                   lcdline=2;
                   lcdline=3;
                   lcdline=4;
                   delay_ms(2);
                   break;
     case '\n'   : lcd_gotoxy(1,++lcdline);break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}


//------------------------------


#ifdef USE_LCD_RW
char lcd_getc(int8 x, int8 y)
{
  char value;

  lcd_gotoxy(x,y);

  // Wait until busy flag is low.
  while(bit_test(lcd_read_byte(),7));

  output_high(LCD_RS);
  value = lcd_read_byte();
  output_low(lcd_RS);

  return(value);
}
#endif

void lcd_setcursor_vb(short visible, short blink) {
  lcd_send_byte(0, 0xC|(visible<<1)|blink);
}
```


----------



## Saint_ (Oct 3, 2016)

hola ASDRUBAL2, te comento que el problema sucede debido a que tu rutina de lectura de teclado sigue enviando el valor de la tecla mientras esta se mantiene presionada.
aquí algunas modificaciones.

Rutina de lectura de teclado.

```
//retorna el codigo ascci asociado a la tecla presionada.
//retorna 0 si no se presiono alguna tecla
/***********************************
Mapa de pines para el teclado 4x3 
***********************************/
#define COL0 pin_b2  //RB2
#define COL1 pin_b3  //RB3
#define COL2 pin_b4  //RB4

#define FIL3 pin_c0  //RC0
#define FIL2 pin_c1  //RC1
#define FIL0 pin_c2  //RC2
#define FIL1 pin_c6  //RC6
/*************************************/
void key_init(void);
unsigned char getkey(unsigned char kbd);
   
void key_init(void)
{
   set_tris_b(0b00011100); //RB2-RB4 com entradas
   set_tris_c(0b00111000); //RC0-RC2, RC6 como salidas
//!   output_low(FIL0);//RC2 = 0; //A
//!   output_high(FIL1);//RC6 = 1; //B
//!   output_high(FIL2);//RC1 = 1; //C
//!   output_high(FIL3);//RC0 = 1; //D
}
unsigned char getkey()
{
   char tecla1=0;
   static char tecla0;
   output_low(FIL0);output_high(FIL1);output_high(FIL2);output_high(FIL3);
   if(input(COL0)==0){tecla1='1';}
   else if(input(COL1)==0){tecla1='2';}
   else if(input(COL2)==0){tecla1='3';}
   output_high(FIL0);output_low(FIL1);output_high(FIL2);output_high(FIL3);
   if(input(COL0)==0){tecla1='4';}
   else if(input(COL1)==0){tecla1='5';}
   else if(input(COL2)==0){tecla1='6';}
   output_high(FIL0);output_high(FIL1);output_low(FIL2);output_high(FIL3);
   if(input(COL0)==0){tecla1='7';}
   else if(input(COL1)==0){tecla1='8';}
   else if(input(COL2)==0){tecla1='9';}
   output_high(FIL0);output_high(FIL1);output_high(FIL2);output_low(FIL3);
   if(input(COL0)==0){tecla1='*';}
   else if(input(COL1)==0)
   {tecla1='0';}
   else if(input(COL2)==0){tecla1='#';}
   if(tecla1&&!tecla0){return tecla0=tecla1;}
   tecla0=tecla1;
   return 0;
}
```

Ejemplo de uso en la rutina main.

```
void main(void)
{
//!   int16 centenas;               //variable para las centenas del ángulo
//!   int decenas,unidades;         //Variable para las decenas y unidades del ángulo
//!   int16 angulo;                 //Ángulo del servo
   unsigned int16 angulo=0;
   char key;
   
   setup_adc_ports(NO_ANALOGS); 
   setup_adc(ADC_OFF); 
   setup_psp(PSP_DISABLED); 
   setup_spi(FALSE); 
   setup_timer_0(T0_OFF); 
   setup_timer_1(T1_DISABLED); 
   setup_timer_2(T2_DISABLED,0,1); 
   setup_comparator(NC_NC_NC_NC); 
   set_tris_A(0x20);
   set_tris_B(0b00000000);
   set_tris_C(0);
   output_a(0);//PORTA =0;
   output_low(pin_b5);//RB5 =0;
   output_low(pin_b6);//RB6 =0;
   output_low(pin_b7);//RB7 =0;
   output_c(0);//PORTC =0;
   lcd_init(); 
   key_init();
   lcd_putc("\f");
   lcd_putc("Teclado y LCD");    
   while(true)
   {     
      key=getkey();   
      if(key==0)
      {
         lcd_gotoxy(1,4);
         printf(lcd_putc,"T. Angulo = %lu",angulo);
      }
      else
      {
         angulo=angulo*10+(key&0x0f);
      }
      delay_ms(50);  //solo para que no haya problemas con la simulacion 
      
//!      if (k!=35&&k!=42)
//!      {
//!         do
//!         {
//!            k=getkey()&&0x0f;
//!            tecla=k;
//!            if(k!=42&&k!=35)
//!            {
//!               centenas=decenas;
//!               decenas=unidades;
//!               unidades=tecla;
//!               lcd_gotoxy(1,2);
//!               printf(lcd_putc,"Angulo = %ld%d%d", centenas, decenas, unidades);
//!               angulo=(centenas*100)+(decenas*10)+unidades;
//!               lcd_gotoxy(1,4);
//!               printf(lcd_putc,"T. Angulo = %ld", angulo);
//!            }
//!         }while(x!=42);
//!      }
   }
}
```


----------



## ASDRUBAL2 (Oct 3, 2016)

*Gracias..!! * Saint_ eres magnifico respondiste de inmediato te lo agradesco ya puedo continuar con el codigo, la verdad me estaba ahogando con ese vaso de agua


----------



## zerOswaldo (Nov 14, 2016)

Saludos amigos.

Estoy haciendo un proyecto con el PIC18F2520, el cual tiene 3 puertos, (A,B y C) pero el problema con eso es que utilizo una pantalla LCD con un teclado 4x3 y ambos usan el puerto B.
Entonces me gustaría saber cómo modificar alguna de las dos librerías (lcd.c o kbd.c)
La que sea mas sencilla.

Necesito cualquiera de las dos en el puerto A o C.
La verdad no tengo inconvenientes con que sea otro puerto, sólo que uno se quede por defecto y otro sí cambiarlo.

Espero que me puedan ayudar.

Intenté usar la librería flex_lcd416a.c y solo modifiqué esto:

```
// Flex_LCD416.c

// These pins are for my Microchip PicDem2-Plus board,
// which I used to test this driver.
// An external 20x4 LCD is connected to these pins.
// Change these pins to match your own board's connections.

#define LCD_DB4 PIN_C4
#define LCD_DB5 PIN_C5
#define LCD_DB6 PIN_C6
#define LCD_DB7 PIN_C7

#define LCD_RS PIN_C0    //PIN_C4
#define LCD_RW PIN_C1
#define LCD_E PIN_C2    //PIN_C6
```
Pero una vez intentándolo en proteus, sólo prende la LCD pero no muestra nada.

Por cierto, mi programa es este: (igual y tengo algún fallo)

```
#include <18F2520.h>
#fuses NOBROWNOUT, INTRC, NOMCLR
#use delay(internal=8M)
#include <flex_lcd416a.c>



void main(){
lcd_init();
for(;{
printf(lcd_putc,"Electronica");
delay_ms(2000);
lcd_putc("\f");
delay_ms(2000);
}
}
```
Lo hago sencillo, pues si no funciona así, para qué intento seguirle.


----------



## roberttorres (Nov 14, 2016)

zerOswaldo dijo:


> Saludos amigos.
> 
> Estoy haciendo un proyecto con el PIC18F2520, el cual tiene 3 puertos, (A,B y C) pero el problema con eso es que utilizo una pantalla LCD con un teclado 4x3 y ambos usan el puerto B.
> Entonces me gustaría saber cómo modificar alguna de las dos librerías (lcd.c o kbd.c)
> ...


Buenas
Yo modificaría la librería lcd420 para el puerto C y poder conectar mi teclado matricial al puerto B y así ahorrar hardware puesto que el puerto B tienes las resistencias Pull-Up.
Si quieres ahorrar pines y hardware(resistencias) podrías conectar ambos periféricos por puerto B.
Adjunto Simulación :


----------



## miglo (Nov 16, 2016)

zerOswaldo, el for que has puesto no es asi "for(;", es asi "for;;".

Haber si es`por eso por lo que no te funciona.


----------



## boykiller (Jul 24, 2017)

Buenas a todos, me a servido de mucha ayuda los aportes e tomado uno como referencia ya que me solicitaron el uso de assembler para trabajar con el PIC16F887, pero presento un problema al querer adaptar lo que se muestra en un display a un LCD, ya que debo poder mostrar ese numero seleccionado en binario en un LCD. adjunto lo que tengo para ver quien pueda ayudarme con eso. Gracias de antemano.


----------



## D@rkbytes (Jul 24, 2017)

En vez de usar un oscilador RC, es mejor que uses el oscilador interno.
La pantalla la puedes direccionar por un puerto y el display de 7 segmentos por otro puerto.
El decodificador 7448 no debe ir conectado a la pantalla, sino al display de 7 segmentos.
Pero con el PIC no es necesario que lo uses, porque también se puede controlar directamente, aunque se usarán más pines.

Para controlar la pantalla necesitas rutinas especiales, así como lo estás haciendo no es correcto.

PD. Ese display de 7 segmentos a 4 bits, nunca lo he visto comercialmente.


----------



## boykiller (Jul 25, 2017)

Hola, gracias por responder, si bueno mi error fue dejarle los display a la simulación, los deje como guía para luego apartarlos al lcd, solo debe ir conectado el lcd, pero ese es mi error ya veo que no se trabajan igual según lo que me mencionas y es donde tengo mi falla ya que no se trabajar con el LCD, debo hacer algún tipo de configuración dentro del .ASM para activar el LCD, o debo modificar el código como tal? por que de ser así por eso ando perdido


----------



## D@rkbytes (Jul 25, 2017)

Pues sí, por lo tanto primero debes estudiar cómo funciona cada dispositivo.

Adjunto un ejemplo de cómo implementar lo que deseas hacer.

Suerte.


----------



## boykiller (Jul 25, 2017)

Muchas gracias de verdad si me es muy útil para realizar lo que debo hacer, ya solo me queda investigar como hacer para que en el LCD aparezca el numero en binario.


----------



## boykiller (Jul 25, 2017)

D@rkbytes dijo:


> Pues sí, por lo tanto primero debes estudiar cómo funciona cada dispositivo.
> 
> Adjunto un ejemplo de cómo implementar lo que deseas hacer.
> 
> Suerte.



hola, luego de adaptarlo quiero realizar la acción de decirle al LCD que muestre el valor en binario no consigo como hacer que el muestre dicho valor, investigando usan agregar la palabra "Bin" para que el mande el valor en binario pero tanto con ese como en otros que e conseguido investigando un poco son usados en css o usan mucho lenguaje C, y no assembler para realizar la acción por eso estoy desorientado con esta opción del LCD.


----------



## D@rkbytes (Jul 26, 2017)

Bin no es una opción que tenga la pantalla o el lenguaje ensamblador.
Seguramente es el nombre que una persona le puso a su rutina de conversión a Binario.

Para eso  se necesita crear una subrutina que compare bit por bit un numero.

Me parece que se te va a complicar aunque es muy sencillo, así que adjunto el programa con la subrutina para convertir de BCD a Binario.

Nota: Requiere de la librería "LCD_4Bits.inc" del programa adjunto en el post #428


----------



## boykiller (Jul 26, 2017)

De verdad que muchas gracias hermano, si esta perfecto y logre entender mejor con esa subrutina, muchas gracias y espero disculpes tanta molestia


----------



## oxkr14 (Jun 6, 2018)

buenas amigos queria saber si me pueden ayudar con mi programa, la situacion es la siguiente, necesito controlar el setpoint (temperatura) usando el teclado matricial 4x3 pero el programa funciona perfectamente leyendo la temperatura (colocando la temperatura deseada desde la programacion) pero cuanto intento colocar la temperatura desde el teclado marca la temperatura pero no acepta en enter (en este caso ''*'')', cabe destacar que soy nuevo progrmando y ya llevo rato lleyendo sobre el tema, no se en realidad que estoy haciendo mal, o si me estoy pasando algun detalle por alto, espero vuestra ayuda por favor.. como se daran cuenta en el programa la etapa que funciona bien esta habilitada y la del setpoint no, *//*


----------



## paulinoda (May 1, 2020)

Buenas, amigos, un gusto saludarles.
Tengo un problema en implementar la librería KBD.C con un PIC24FJ32GA002
He estado tratando de utilizarla para este PIC y la verdad el código compila y no da errores pero no puedo obtener la variable leída del teclado.

Les dejo el código para su análisis. Gracias.

```
#include <24FJ32GA002.h>
#Fuses NOWDT, NOPROTECT
#USE  delay(internal=4M)

#define LCD_E    PIN_B0
#define LCD_RS   PIN_B11
#define LCD_DB4  PIN_B12
#define LCD_DB5  PIN_B13
#define LCD_DB6  PIN_B14
#define LCD_DB7  PIN_B15

#include <lcd1.c>
#include <kbd.c>

int segundos;
int minutos;
int Horas;
int Cantidad_personas;
int i;
char K;
int cont1=0;


void configuracion(void)
{
setup_timer1(TMR_INTERNAL|TMR_DIV_BY_8);  
ENABLE_INTERRUPTS(INTR_GLOBAL);          
ENABLE_INTERRUPTS(INT_TIMER1);

set_timer1(3036);
}


void Mensaje_Reposo(){
lcd_init();

i=10;

for (i =10;i>=-32;i--){      
lcd_gotoxy(i,1);
printf(lcd_putc, "%02i:%02i - %c personas - Menu Principal", Horas, minutos, K);
delay_ms(500);
lcd_putc("\f");
}
}

void LeerTeclado(){
kbd_init();
K=kbd_getc();
}


#INT_TIMER1 //RUTUNA PARA CONTAR SEGUNDOS
void INTERRUPCIONTM1(){
set_timer1(3036);

CONT1++;

if(CONT1==4){
segundos++;
CONT1=0;
}

if(segundos==60){
minutos++;
segundos=0;
}

if(minutos==60){
Horas++;
minutos=0;
}
if(Horas==24){
Horas=0;
}
}


void Main(){
set_tris_b(0);
kbd_init();
configuracion();

while(true){
         LeerTeclado();

Mensaje_Reposo();
}
}
```
Adjunto también el circuito.
La verdad, pareciera que la librería no sirviera para este tipo de PIC.


----------



## savad (May 1, 2020)

PPrimero que nada ... aprende a programar usando las interrupciones del timer y del cambio de estados de los puertos, ya que pierdes un monton de tiempo esperando sin hacer nada (500 ms en la rutina del display. luego en donde le dices que debe retornar al programa principal y terminar la rutina de interrupción?

Ademas... yo siempre si puedo (cuestión de ecónomia), agrego un selector de puertos con latch (usando una PAL) son my baratas y faciles de programar y me evitan tener qe estar refrescando los perifericos por software.

Podrias tambien poner en este link el contenido de tus  *.h files? para ver ts definiciones de variables alli incluidas


----------



## D@rkbytes (May 2, 2020)

paulinoda dijo:


> La verdad, pareciera que la librería no sirviera para este tipo de PIC.


Si hubieras leído esta parte en la librería kbd.c, comprenderías el por qué no funcionó tu programa:

```
#if defined use_portb_kbd
   #byte kbd = getenv("SFR:PORTB")
#else
   #byte kbd = getenv("SFR:PORTD")
#endif
```
Nota que la sentencia espera que se defina el puerto B para su uso, si no se define usará el puerto D por defecto.
Pero como el PIC24FJ32GA002 no tiene puerto D se generaría un error.
En tu programa no agregaste *#define  use_portb_kbd TRUE* y mencionas que no se generan errores, pero debe ser porque usas una versión antigua del compilador, o usas una librería diferente a la actual, o está modificada.

La librería kbd.c está diseñada para funcionar conjuntamente con los pines para la pantalla, así que te podrías ahorrar algunos pines.

Adjunto un ejemplo sencillo de uso con el PIC24FJ32GA002


----------



## DJ T3 (May 2, 2020)

Tu codigo esta bastante mal.

El "int i;" lo declaras asi  y luego lo restas hasta dar negativo en el "for". En su lugar usa "signed int i;"

Luego, otra vez con "i", le colocas 10 antes y en el "for". No hace falta volver a ponerle, solo deja la declaracion en el "for".

Vuelves a iniciar el teclado. En el "main" ya lo iniciaste, no lo vuelvas a iniciar en la funcion "LeerTeclado"

El lcd debes iniciarlo una vez, en el "main" o en la funcion dedicada "configuracion" (y tambien pon ahi el del teclado).
....
Te recomiendo rehacer todo el programa con lo que te puse, y te dijo Dark, y organices mejor las cosas, como por ejemplo la funcion innecesaria de "LeerTeclado"


----------

