LCD 16x2 - Programacion básica.

Que tal, muy buenas... :)

Monte en una protoboard el circuito básico de prueba de un LCD 16x2. (y)

Todo funciona correctamente, los códigos y las entradas, la tabla del control de comandos, asi como la escritura de los carácteres.


Mis duda es: :rolleyes:

¿Cómo regreso el cursor a un segmento anterior?
¿Cómo borro un caracter anterior? :unsure:
¿Se puede sustituir un caracter sin errores/modificaciones en lo demás?

Como podran notar, he leido y probado, pero no encuentro en las hojas de datos el como poder hacer esto, es un comando que necesito y no logro incorporar.



Dejo una imagen de la simulacion de mi montaje (todo funciona bien).
 

Adjuntos

  • Proteus Sim!.JPG
    Proteus Sim!.JPG
    84.4 KB · Visitas: 254
Última edición:
Los dudas que tienes se solucionan con ayuda del comando "Set DDRAM address", con esté direccionas cada caracter en el LCD. Su sintaxis es b'1Lxxxxxx' donde la L selecciona 0=linea superior y 1 linea inferior, las x's definen sobre cual celda de la LCD se escribirá, por ejemplo b'10000011' situa el cursor en la línea 1, celda 3 (de izquierda a derecha). Sobre lo que mencionas de borrar un caractér anterior basta con enviar la dirección de la celda que quieres poner en blanco y despúes escribir sobre ella el caracter espacio " " en ASCII. Saludos
 
Gracias por tu pronta respuesta.

No entendi muy bien sobre lo de direccionar los caracteres del LCD con el "Set DDRAM address".

Hablas de situar el cursor, ¿cómo se introduce la dirección de la celda? :unsure:

Lo de borrar un caractér anterior, mencionas sobre la dirección de la celda. :unsure:
 
Última edición:
Hablas de situar el cursor, ¿cómo se introduce la dirección de la celda?

Por medio del comando que te menciono, en está
hay buena información sobre los comandos de un módulo LCD
 
Antes que nada, un saludo a todos. 1ero no sé como abrir un nuevo tema y no sé si está mal poner esto aquí pero tengo un problema con mi pantalla LCD 16x2. He revisado absolutamente todo en la configuración de mi pantalla, la estoy controlando con un PIC16F88, usando el reloj interno a 8MHz, he revisado todo, fuses, registros, conexiones, todo... Creo que es algo tan tonto que no lo estoy viendo... Puse un led a otro pin del microcontrolador que encienda y apague cada 500ms para verificar que no se estuviera colgando... Y el hace su trabajo perfectamente y la pantalla nada... ya no sé que hacer... El contraste funciona perfectamente y al graduarlo los cuadros de la 1era linea se ponen en negro sólo los de la 1era linea. He leído en otros foros o temas (no sé) y dicen que revise la conexión y el código (obvio, una de las dos tiene que ser...) Y he revisado absolutamente todo. Aqui está el código: (PROTON) que he simulado en proteus y anda pero al llevarlo al proto la pantalla nada...

Device 16F88
ASM
x2007 = 11111101100110
ENDASM

ALL_DIGITAL = True

Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.3
Declare LCD_RSPIN PORTB.1

TRISA = 0
PORTA = 0
TRISB = 0
PORTB = 0
OPTION_REG = %11011000
OSCCON = %01111110
OSCTUNE = %00111111

Main:
PORTA.1=1
DelayMS 500
PORTA.1=0
DelayMS 500
Print At 1,1,"Prueba 2"
Print At 2,1, "Funciona!"
DelayMS 100
GoTo Main

Iba a adjuntar imágenes pero no sé hacerlo (si pueden me dicen como)

Gracias a todos de antemano...
 
1ero gracias por responder cosmefulanito04 yo la llevo a tierra xq en realidad para la aplicación que pienso usarla, sólo necesito escribirle, nunca voy a intentar acceder a lo que se visualiza en la pantalla pero, no entiendo xq los 10K, de todas formas he probado pero no ha funcionado...
Agregué un delay entre los dos print de 100ms pero nada...
Ah y otra cosa! cómo adjunto una imagen?? para mostrar el circuito...
 
Última edición:
La resistencia de 10k es para limitar la corriente, pensa que ese PIN es bidireccional, cuando escribis funciona como lectura (para el LCD) y cuando el LCD necesita tiempo para ejecutar un comando se activa el Busy Flag haciendo que ese pin funcione como salida.

Para subir una foto, o la subis a un servidor como imageshack (http://imageshack.us/) agregando bien el link como imagen, o adjuntas en el foro abajo donde dice "Adjuntar Archivos".

Subi el circuito asi se entiende mejor lo que hiciste.
 
Ah ok gracias entonces por el dato de la R de 10K aquí subí la imagen del circuito...
 

Adjuntos

  • Protoboard.jpg
    Protoboard.jpg
    273.3 KB · Visitas: 164
Última edición:
Antes que nada, te felicito por la prolijidad de como te quedo el proto y las conexiones :aplauso: .

Fijate que estas haciendo lo mismo con los pines de datos del nibble inferior de datos que hiciste con el pin R/W, los estas mandando a tierra de una, y esos pines tambien son bidireccionales, pero para solucionarlo, simplemente dejalos sin conectar ya que los vas a usar como salida y no como entrada. El resto pareciera estar bien, habria que ver bien el codigo en ningun lado se ve la inicializacion del LCD, y la funcion print ¿es una que hiciste vos o la sacaste de una libreria?.
 
Gracias por lo del proto, en realidad de tanto cortar cables a la medida te van quedando con las longitudes y los colores. Luego es muy sencillo y rápido montar cualquier cosa en el proto. A la final parece mucho más trabajo del que en realidad es pero igual gracias!

Ahora, yo utilizo el programa "Proton IDE" para desarrollar el código. No sé si has tenido la oportunidad de trabajar con él pero sólo haciendo las declaraciones pertinentes como lo son:

Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.3
Declare LCD_RSPIN PORTB.1

Indico en qué pines se van a manejar el Enable, el Register Select y el Read/Write; a su vez él tiene por defecto la configuración restante como el tiempo de envío entre cada par de datos (50us por defecto) al igual que el tiempo de envío entre cada par de comandos (2ms por defecto), la interfáz de la LCD (transferencia de datos de los pines DB4 al DB7 por defecto, sólo usa 4 pines), la cantidad de lineas de la pantalla (2 por defecto) pero en realidad todo mi conocimiento es muy teórico. Y la práctica es muy importante... Por eso no me funciona lo que armé.....(ja ja) Xq al yo saber que por defecto sólo se iban a usar los pines del DB4 al DB7 pensé que no iban a tener ningún tipo de repercusión que los llevara directamente a tierra xq no conozco a profundidad el funcionamiento interno de la pantalla...

Ahora, lo que no entiendo es xq pude cargar una vez un código de un medidor de tensión en una entrada analógica usando el conversor A/D del PIC y el resultado, mediante el pertinente factor de ajuste de escala, me mostraba el valor de tensión medido, en la LCD con la misma conexión...

Entonces xq sí funcionó aquella vez? qué tienen que ver el resto de los pines DBX si en Proton configuro todo para trabajar con sólo 4? xq los debo llevar a tierra? o xq no? He visto circuitos donde lo llevan directamente (claro ahora está en duda su confiabilidad ja ja) pero no sé. También leí eso de que uno debe hacer la inicialización pero vuelvo a lo mismo del xq antes funcionó sin hacer nada de eso y con la misma conexión? A la final debo saber manejar bien la LCD . Y muchas gracias por tu ayuda!

PD: me di cuenta que el R-/W sólo tiene dos estados 1 lectura y 0 escritura y el busy flag no se refleja en el R-/W sino en el RS (Register Selection Signal)
 
Última edición:
Fijate en esta tabla de instrucciones:


El BF se activa en DB7 cuando R-/W se activa.

Entonces xq sí funcionó aquella vez? qué tienen que ver el resto de los pines DBX si en Proton configuro todo para trabajar con sólo 4? xq los debo llevar a tierra? o xq no? He visto circuitos donde lo llevan directamente (claro ahora está en duda su confiabilidad ja ja) pero no sé. También leí eso de que uno debe hacer la inicialización pero vuelvo a lo mismo del xq antes funcionó sin hacer nada de eso y con la misma conexión? A la final debo saber manejar bien la LCD . Y muchas gracias por tu ayuda!

Sobre la inicializacion, si o si la tenes que hacer, de lo contrario no va a funcionar, o si funciona, lo hace de pura casualidad :D. Aca te dejo el procedimiento:

Modo 8bits:



Modo 4bits:



Como nunca use ese codigo que pusiste no puedo ser de mucha ayuda, no tengo ni idea como funciona ese codigo que pusiste.

Pedi un cambio a la seccion de uC, tal vez ahi te puede ayudar con ese codigo.
 
ok muchas gracias por todo entonces!! voy a probar la rutina pero creo que el Proton IDE hace todo eso... (Ajustado por defecto) tú sólo tienes que decirle que vas a trabajar con 4 bits. Pero uno no debe ser dependiente de un sólo programa. En assembler no quedaría de otra... y hay que hacerlo tal cual como lo indicas! muchas gracias!!
 
Hola, me han mandado a hacer un programa con lcd y teclado matricial, que me pida tres digitos al azar, los almacene y luego me muestre el que le pida, ya sea el 1ero el 2do o el 3ero.. Ayudaaa
 
Hace poco me encontré con un LCD que no le gustaba el pull-down con los 10k que recomendé arriba y terminé dejando la linea R/W directamente a masa (algo que no me convencía por el tema de la bidireccionalidad), pero funcionó.

No probé con una resistencia de menor valor ya que las hojas de datos son realmente muy básicas.

Así que te recomiendo no poner esa resistencia de 10k que recomendé antes.

Con respecto a la inicialización en modo de 4 bits... tenés que empezar en modo 8bits y después pasar a 4.
 
hola amigo yo estoi empeazndo con el 18f4550 y tengo prblemas con la lcd con el programa sencillo de hola mundo el me compila bn en ccs pero al montarlo al entrenador no me da gracias por la ayuda.
 
Atrás
Arriba