Manejar teclado matricial y mostrar en lcd

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 :rolleyes:
 
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. :rolleyes: :unsure: :apreton:
 
Saludos asdurafael.
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.
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. :unsure: ¿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.
Código:
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.
 

Adjuntos

  • 16F877 Teclado 4x4(2).rar
    13.6 KB · Visitas: 105
Última edición:
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 :
Código:
'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
 
Última edición por un moderador:
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.
 
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:
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.
 
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.
 
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! :aplauso:

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.
 
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.
 
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.
 
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. :confused: Ese programador tiene garantía. Y como estoy pensando que debe tener algún daño quizá sea mejor cambiarlo por otro. :unsure: . 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.
:apreton: :apreton:
 
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.
 
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. :apreton: :)
 
Que bien. :LOL: 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. :) :apreton: (y) Estoy contento. Me despido deseándoles paz, prosperidad y salud. Y un Abrazo. Gracias D@rkBytes. Tu ayuda fue muy valiosa. Hasta luego.
 
Que bien. :LOL: 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. :) :apreton: (y) 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. :apreton:
 

Adjuntos

  • 16F877 Teclado 4x4(Corrido+Pull Up).rar
    14.1 KB · Visitas: 145
  • 16F877 Teclado 4x4(Corrido+Pull Down).rar
    14.5 KB · Visitas: 91
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. :apreton: Espero que la pasen bien. Yo estoy al menos por los momentos felíz :LOL: . 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.
:) :) :D :D(y) :apreton:
 
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. :)
 

Adjuntos

  • Teclado 4x4 Asdrurafael.rar
    23.6 KB · Visitas: 148
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........
 
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
 

Adjuntos

  • Bórrame D.jpg
    Bórrame D.jpg
    167.9 KB · Visitas: 75
Atrás
Arriba