# LCD 16x2 - Programacion básica.



## Darzeck (Mar 27, 2011)

Que tal, muy buenas... 

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

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: 

¿Cómo regreso el cursor a un segmento anterior? 
¿Cómo borro un caracter anterior? 
¿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).


----------



## Daniel Meza (Mar 27, 2011)

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


----------



## Darzeck (Mar 27, 2011)

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? 

Lo de borrar un caractér anterior, mencionas sobre la dirección de la celda.


----------



## Daniel Meza (Mar 27, 2011)

> 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


----------



## Darzeck (Mar 27, 2011)

... No veo el link ... ¿?...


----------



## Lusanzgz (Mar 27, 2011)

Buenas tienes que enviarle el comando correspondiente a lo que quieres hacer. En esta pagina tiene slos comandos de control standard para LCD

http://www.cursomicros.com/mod2/c03_03_set_instrucciones.html

Con eso puedes desplazar el cursor, borrar todo el lcd, mostrar o no el cursor,..... Para borrar desplazas el cursor y escribes "blank" en esa posicion; 

Saludos


----------



## Darzeck (Mar 27, 2011)

Lo he conseguido.  Muchas gracias por la informacion.!


----------



## DSnake (Jun 11, 2011)

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


----------



## cosmefulanito04 (Jun 11, 2011)

¿Usas la linea R-/W o usas demoras?

En caso de no usar esa linea, mandala a tierra mediante el uso de una resistencia de 10k.


----------



## DSnake (Jun 11, 2011)

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


----------



## cosmefulanito04 (Jun 11, 2011)

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.


----------



## DSnake (Jun 11, 2011)

Ah ok gracias entonces por el dato de la R de 10K aquí subí la imagen del circuito...


----------



## cosmefulanito04 (Jun 11, 2011)

Antes que nada, te felicito por la prolijidad de como te quedo el proto y las conexiones  .

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


----------



## DSnake (Jun 11, 2011)

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)


----------



## cosmefulanito04 (Jun 12, 2011)

Fijate en esta tabla de instrucciones:



> http://img830.imageshack.us/img830/8463/instrucciones.png



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


----------



## DSnake (Jun 12, 2011)

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


----------



## marlynsorondo (Nov 16, 2011)

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


----------



## felipeyeah (Jun 5, 2012)

DSnake dijo:


> Ah ok gracias entonces por el dato de la R de 10K aquí subí la imagen del circuito...



Amigo, a mi también me aparece lo mismo en el display.. ¿cómo solucionaste el problema?
saludos!


----------



## cosmefulanito04 (Jun 5, 2012)

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.


----------



## junior perez (Jun 5, 2012)

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.


----------



## Darzeck (Jun 6, 2012)

Si les sirve de algo puedo facilitarles librerias para modulos LCD del pic16f84A conectados a 4 y 8 bits, asi como otras librerias de retardos o de mensajes para el LCD.

Yo utilizo el LCD a 8 bits.
https://fbcdn-sphotos-a.akamaihd.net/hphotos-ak-snc6/208966_403924992993367_100001276104937_76464575_827841540_n.jpg


----------



## emz102009 (Mar 16, 2015)

Hola tengo una duda, aprendí a inicializar el lcd de 8 bits y desplegar letras en el y a limpiar la pantalla completamente, ahora solo quiero limpiar el mensaje de una sola linea, sin modificar la segunda, igual mente quiero saber como borrar letra por letra, quisiera saber cual es la configuración para esas dos dudas


----------



## pandacba (Mar 16, 2015)

enviando un espacio vacio a cada posicion de la letra que queres borrar


----------

