# Control de display LCD con PIC



## Masquino (May 26, 2009)

Hola, nuevamente tengo un problema, nunca trabaje con displays LCD y luego de hacer una exhaustiva busqueda por este y otros foros y demas, no puedo terminar de entender como funciona. Mejor dicho, creo haberlo entendido, pero no entiendo porque no funciona si es que lo entendi bien.

El pic que estoy usando es un PIC16F628A y el display LCD es un LM016L

Segun lo que entendi en lo que he leido los pasos a seguir son mas o menos asi, seteo las patas R/W y R/S a gusto, seteo en 1 la pata E del LCD, mando comando o dato (segun haya seteado R/W y R/S), pongo E a cero y espero el tiempo necesario para que el LCD deje de estar busy.
En mi codigo intento seguir estos pasos pero evidentemente algo mal estoy haciendo, ya que no logro hacerlo funcionar, intente cambiar el orden de el seteo de E a varias otras posiciones pero sin exito.

Mando la parte del codigo en la que intento hacer algo con el LCD, esto tomaria lugar apenas se pone en funcionamiento el sistema (esta despues de la parte de configuracion de los puertos del pic y demas). En esta parte el pic no ha entrado a la interrupcion ni nada por el estilo todavia.

Comento aca arriba para no generar dudas, los puertos de mi pic estan conectados de la siguiente forma, RB0 genera una interrupcion asi que no esta conectado al LCD. RB1 conectado a DB0 (del LCD), RB2 conectado a DB1, ....... , RB7 conectado a DB6 y RA3 conectado a DB7. RA0 conectado al pin R/S del display, RA1 a R/W y RA2 al pin E. (los demas pines del puerto A estan conectados a la salida de un dtmf, por eso que esta poco organizado el tema de las conexiónes.

De todas formas adjunto tambien un screenshot del circuito armado en proteus (quiero lograr que funcione por lo menos aca, para despues armarlo bien)

Si alguien quiere el codigo entero por algun motivo o razon, me avisa que lo cuelgo.

Ahi les va...


principal
	call retardo
	call retardo
	call retardo
limpio
	bsf PORTA, 2
	bsf PORTB, 1	
	nop
	bcf PORTA, 2
	call retardo
	call retardo
	call retardo


entry
	bsf PORTA, 2
	bsf PORTB, 1
	bsf PORTB, 2
	bsf PORTB, 3	
	bcf PORTA, 2	
	call retardo
	call retardo
	call retardo


cursor
	bsf PORTA, 2
	bsf PORTB, 1
	bsf PORTB, 2
	bsf PORTB, 3
	bsf PORTB, 4
	bcf PORTA, 2	
	call retardo
	call retardo
	call retardo


shift
	bsf PORTA, 2
	bsf PORTB, 3
	bcf PORTB, 4
	bsf PORTB, 5
	bcf PORTA, 2	
	call retardo
	call retardo
	call retardo


ddram
	bsf PORTA, 2
	bsf PORTA, 3
	clrf PORTB	
	bcf PORTA, 2
	call retardo
	call retardo
	call retardo


write
	bsf PORTA, 0
	bcf PORTA, 1
	bsf PORTA, 2
	movlw b'10000010'             ;El codigo LCD para la A ? (tambien intente con otras letras, pero nada funciona)
	movwf PORTB
	bcf PORTA, 3
	bcf PORTA, 2	
	call retardo
	call retardo
	call retardo

bucle
	nop
	goto bucle


Muchas gracias desde ya


----------



## Vick (May 26, 2009)

Vamos por partes:

¿estas haciendo correctamente el proceso de inicialización del display?

Si no haces ese proceso de forma correcta el display no va a funcionar bien...

Si no tienes muchas líneas libres en el PIC ¿Por que mejor no usas conexión de 4 bits?

mencionas que estas usando el busy flag, pero en el código que dejaste nunca veo que lo verifiques para esperar a que se libere, sería mejor que lo hagas sin busy flag y uses retardos, en ese caso conectas R/W del LCD a tierra.

no entiendo que es lo que inetntas hacer en las rutinas enty, cursor, shift....


----------



## Masquino (May 26, 2009)

No se si estoy haciendo bien la inicializacion del display, o sea al principio lo borro y demas, y antes de mandarle un comando lo pongo en modo comando, o por lo menos lo que entendi que era el modo comando. Puede que sea eso que este funcionando mal.

En cuanto a las lineas libres del PIC, creo que me sobra una nomas, pero no preciso mas que eso de todas formas, todo lo demas ya esta conectado correctamente. Para ser sincero ni se me cruzo por la cabeza, pero tendria que setearlo para 4 bits, y no puedo usarlo ni en 8 bits que seria el default, asi que creo que se me complicaria mas.

Lo del busy flag, no la estoy usando, justamente estoy usando retardos como dices, por eso es que llamo a retardo a cada rato, preferi poner unos cuanto mas y en todo caso despues ajustarlos, pero quiero asegurarme que funcione primero.

La rutina limpio es para limpiar el display, entry es el entry mode set, shift es el cursos shift, funciont set, ddram setea que voy a usar la ddram, y con write mando el dato. Probablemente haya entendido muy mal como es el funcionamiento o me este faltando algo antes de enviarle esas instrucciones.

Ya he recorrido muchisimos links con información sobre como manejar un dispaly lcd pero sin exito, pero si ves que hay alguno que me pueda ayudar bienvenido sea. Sino si te dan las bolas para explicarme todo por aca te agradezco desde ya. (La explicacion que pusieron aca, en este foro, ya la lei pero claramente la entendi mal)

Muchas gracias de nuevo


----------



## Vick (May 27, 2009)

Creo que ya descubrí por que no funciona tu código, caundo envíias un caracter o comando al LCD debes primero poner el dato en el bus (en el puerto de salida) y luego habilitar el display con E para que reciba el dato, lo estas haciendo al revés, primero habilitas y luego mandas el dato, no es correcto, ya que cuando habilitas con E=1 el LCD recibe lo que este en el bus en ese momento, independientemente del proceso de incialización que no se si este correcto, te dejo los procesos correctos de inicialización para 8 y 4 bits:

http://www.ucontrol.com.ar/wiki/images/1/15/LCDInterfasea8bits.jpg
http://www.ucontrol.com.ar/wiki/images/b/bb/LCDInterfasea4bits.jpg


----------



## edcdmdp (May 22, 2011)

Estimad@s compañer@s:

Me dispongo a hacer funcionar el típico display LCD 2x16 de 14+2 pines, con un microcontrolador PIC.

Las herramientas utilizadas son las siguientes: 

---------------------------------------------------------------------------
|  Hardware: 		MPLAB ICD 2.                                               |
|  Programador: 	             PICDEM 2 PLUS.                                            |
|  Software: 		MPLAB IDE v8.43.                                          |
---------------------------------------------------------------------------
|  Lenguaje:		C                                                               |
|  Compilador: 		PIC C Compiler.                                             |
---------------------------------------------------------------------------
|  Display: 		LCD 16x2 C216N04YBW00.                              |
|  Microcontrolador: 	PIC16F876.                                                  |
|  Oscilador: 		Cristal de 8000 Mhz y Condensadores de 22 pF.  |
---------------------------------------------------------------------------
|  Librería PIC:	            16F876.h                                                      |
|  Librería LCD:              	lcd2.c                                                         |
|  Programa:		main.c                                                         |
|  Conexionado:		conexionado.jpeg                                          |
----------------------------------------------------------------------------

Tanto en la simulación en Proteus, como en el montaje real, no consigo que trabaje ni lo más mínimo el display, al menos, visualmente.

Ruego me ayuden, ya no se que hacer. Muchas gracias.


----------

