# PIC16F84 + LCD... dudas



## skan (May 27, 2006)

buenas.. estoy con un proyecto pic16f84 y modulo LCD de una linea (16 patillas) (las 2 ultimas pq esta retroiluminado).
RESPECTO AL LCD:
-en mis programas no voy a usar la patilla E(6), ni la R/W (estara siempre en escritura).. estas las conecto a sus niveles respectivos.
-el problema la patilla RS... se que esta es necesaria para el control del LCD. mi pregunta. a que patilla del pic la conecto para que funcione correctamente? RB esta todo ocupado por el bus de datos del LCD.
-por ultimo los programas ejemplo que tengo cargan librerias con nombre "p16f84a.inc", "retardos.inc" y utiliza todo el rato rutinas contenidas en estas librerias... con ellas la utilización del LCD parece mas sencilla...alguien sabe donde puedo descargarmelas?¿?

GRACIAS POR SU ATENCIÓN.


----------



## microextremo (May 28, 2006)

justo estaba revisando una información donde hay unas figuras que te pueden ayudar, 
http://www.pic16f84a.com/Proteus.htm
aunque los ejemplos hacen trabajar al LCD con 4 pines y tu quieres con 8... bueno no creo que eso sea tan dificil de encontrar 8)


----------



## tiopepe123 (May 29, 2006)

Ve con cuidado, primero haz el proyecto con todas las lineas de control Rw... aunque utilices el formato de cuatro lineas de datos. Lo digo porque si te pasas al "c" es un poco problematico, una vez verificado que la LCD rula bien, pues pruebas de quitarselo y crear una libreria.
Yo lo probe y no funciono del todo correcto y como utilizaba un pic16f876 no me veria de esas tres patillas.

Te recomiendo encarecidamente te pases al pic16f876/877, funcionan y valen casi lo mismo y son mas versatiles sobretodo el bootloader


----------



## Ehecatl (Jun 1, 2006)

No puedes dejar inactivada la terminal E del LCD. Sin ésta no podrás cargar ni datos ni comandos al mismo. La única que puedes dejar siempre fija es la R/W.


----------



## akyles (Jun 2, 2006)

En esta pagina hay un mini-tutorial como usar los LCD http://www.josepino.com/pic_projects/indexsp.pl?hitachi_displays.jps - Incluso te indica paso a paso como inicializar el display LCD.


----------



## skan (Jun 8, 2006)

gracias por sus contestaciones..

alfinal necesito conectarlo con 8 patillas...ya que el LCD que tengo, DB0-DB3 controla 40 segmentos del LCD, y las otras 4.. los otros 40 segmentos (es de una línea)...

tengo librerias de las que hechar mano...  lo que no tengo ninguna para el control del LCD a 8 bits (usaba una; LCD_4BIT.INC) y todos los programas ejemplos q tenia usaban esa... ¿alguien sabe donde puedo encontrar una?


----------



## tiopepe123 (Jun 8, 2006)

utiliza 4 bits si no tienes prisa, que no te sobran pines para tirar.
Recuerda que es inteligente,, no hables de segmentos, eso lo hace el chip, solo precupate de enviarle los datos.

con 4 bits puedes manejar todo el display.
la primera linea va desde 00 a 39 y la segunda linea 40-79 si no me equivoco.

me explico solo hay un tipo de chip esta diseñado para controlar 4x40 caracteres, el fabricante le mete la lcd que le interese 1x16 o 2x16 .... las filas que sobran simplemente no se ven(no hay cristal lcd), pero existen si escribes y lees en una posicion que no hay nada veras como lo retiene, como si lo quieres para guardar datos por que no te caven en el micro, eso se puede hacer.


----------



## skan (Jun 15, 2006)

PORFIN pude visualizar algo coherente y bien escrito en el LCD!!!!!!!...
lo conseguí mandando yo caracter a caracter, sin utilizar la libreria para enviar la palabra entera como hacia antes...esta es un poco la estructura...
--------------
ORG	0
Inicio
	call	LCD_Inicializa
Principal
	movlw	'H'
	call	LCD_Caracter
	call	Retardo_500ms
	movlw	'o'
	call	LCD_Caracter
	call	Retardo_500ms
	movlw	'l'
	call	LCD_Caracter
	call	Retardo_500ms
	movlw	'a'
	call	LCD_Caracter
	call	Retardo_500ms
	call	LCD_Borra		; Borra la pantalla.
	call	Retardo_500ms
	goto	Principal
-----------------
EL PROBLEMA QUE PERSISTE:: sigo controlando tan solo la parte izquierda de la pantalla... e probado de subir temporizaciones, desactivar el watchdog, verificar que no hay ninguna interrupción activa que altere el programa...y nada sigue igual..

Recuerdo que el control lo realizo de DB7-DB4 del LCD a RB7-RB4 del pic, RS=RA0, R/W=RA1, E=RA2...

alguna idea¿¿ al- ya es algo lo que puedo enseñar..!


----------



## Ehecatl (Jun 16, 2006)

Aclaremos. De los 16 caracteres que se pueden mostrar en la pantalla ¿sólo puedes mostrar 8?
¿qué sucede al intentar escribir el noveno?
¿podrías poner la rutina lcdcaracter para ver si no hay algo extraño en ella? lo dudo pero hay que estar 100% seguros.


----------



## skan (Jun 17, 2006)

lo e probado de dos maneras... mandando los 8 caracteres y despues la llamada a LCD_posicionLinea1 y situandolo en la posicion 08 (la 9a del LCD), y también sin llamar a la subrutina mandar 11 caracteres,,,
simplemente escribe hasta el 8, y lo otro no se ve (nada ningun segmento se enciende) pero si realiza el proceso, por que las temporizaciones de escribir esas 3 letras si se cumplen..y la temporización final (matengo el msg 1seg en pantalla) también.

ESTA ES LA SUBRUTINA LCDPOSICIONLINEA1;
---------------
LCD_PosicionLinea1			; Cursor a posición de la Línea 1, a partir de la
	iorlw	b'10000000'	; dirección 00h de la DDRAM más el valor del
	goto	LCD_EnviaComando	; registro W.

esta la LCD_EnviaCOmando
-----------------------------
LCD_EnviaComando
	bcf	LCD_PinRS	; Activa el Modo Comando, poniendo RS=0.
	goto	LCD_Envia
LCD_Caracter
	bsf	LCD_PinRS	; Activa el "Modo Dato", poniendo RS=1.
	call	LCD_CodigoCGROM	; Obtiene el código para correcta visualización.
LCD_Envia
	movwf	LCD_GuardaDato	; Guarda el dato a enviar.
	call	LCD_EscribeLCD	; Primero envía el nibble alto.
	swapf	LCD_GuardaDato,W	; Ahora envía el nibble bajo. Para ello pasa el
				; nibble bajo del dato a enviar a parte alta del 	call	LCD_EscribeLCD	; Se envía al visualizador LCD.
	btfss	LCD_PinRS	; Debe garantizar una correcta escritura manteniendo 
	call	Retardo_10ms	; 2 ms en modo comando y 50 µs en modo cáracter.
	call	Retardo_100micros
	return	
------------------
y mi manera de llamar a LCD_posicionlinea1:
                movlw	b'00001001'	
	call	LCD_PosicionLinea1
	call	Retardo_20ms


----------



## skan (Jun 17, 2006)

e observado que en la subrutina LCD_inicializa declara el LCD, realiza la llamada a la subrutina LCD_2lineas4bits5x7, la cual es:
-------
LCD_2Lineas4Bits5x7		; Define la pantalla de 2 líneas, con caracteres
movlw	b'00101000'        ; de 5x7 puntos y conexión al PIC mediante bus de
goto	LCD_EnviaComando	; 4 bits. 
---------
querria intentar configurarlo como una línea haber si esa puede ser la causa de que no se visualicen los caracteres apartir del 8º.. e mirado la información que tengo pero no logro descubrir donde le indica que es de 2 lineas...

que numero binario debería cargar para configurarlo como una linea?? puede ser esta la causa¿¿

THKS por su atención


----------



## icho (Abr 30, 2007)

alguie que tenga el diagrama y codigo del funcionamieto del lcd016l enproteus.. esta complicado hacer funcionar este bicho


----------



## icho (Abr 30, 2007)

hago correr el probrama y se queda colgado en la libreria RETARDOS.INC en el siguiente bloque de codigo... que creen que pueda ser... 

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.


----------



## icho (May 1, 2007)

hola, al parecer vas por el mismo camino que yo fui, te comento que esa libreria retardos.inc la tienes que poner al final de tu programa, justo antesito del END, con la siguiente instrucción INCLUDE "RETARDOS.INC" y te funcionará de maravilla, otra cosa, no es que se quede colgado sino, que algo pasa con esta libreria. Por ejemplo yo hice varias pruebas, de prender leds, conectados a la patitas RB del uControlador 16f84 utilizando esta libreria, haciedo uso de varios tiempos, al principio funciona bien, pero aumento algun comando mas, y ya todo me desvaria, es decir, si con 4Mhz prendian 2 secuencias de leds, y aumento para que sean 3 secuecnias, esos 4Mhz ya no me sirven y tengo que ir haciendo prueba y error para encontrar la frecuencia indicada... talvez sea el proteus no se.. tienes alguna idea???


----------



## bassir (Sep 10, 2007)

Muy buenas
perdonar ke us haga una pregunta, estaba buscando en internet una pantalla lcd ke tenga en sus caracteristiqas el llenguaje arabe, es para hacer un proyecto con el pic , si alguien me puede ayudar . 

merci


----------



## jjfonsecaz (Sep 10, 2007)

Buenas amigos,

Pues de inicio creo que deberian leer algunos de los documentos que les han enviado, la forma correcta de inicializar el lcd es darle un tiempo para que se establesca el oscilador interno, aprox 20 ms; en algunos es menor el tiempo, posteriormente enviarle los correspondientes codigos de inicializacion. y algo que me da curiosidad es lo de que no puedes visualizar mas que 8 caracteres. yo tengo una libreria para usar el lcd y puedes usar 4 lineas de datos y 3 de control; se puede usar 4 de datos y 2 de control, por lo menos debes tener control sobre la linea rs y e. podrias usar 8 de datos y 2 de control. eso no importa pero si es importante el manejo de rs y e por lo  menos.
Para manejar mejor el lcd yo defini algunas constantes por ejemplo la direccion de la fila 1 y fila 2

LCD_linea1	EQU		0x80	;Direccion inicio linea1
LCD_linea2	EQU		0xC0	;Direccion inicio linea2

si tu escribes este comando y posteriormente envias el comando de caracter(por ello es importante el manejo de rs, la habilitacion es con e de otra forma no seria posible manejarlo)
puedes escribir la cantidad de caracteres que quieras sin que esto afecte al lcd, al final de cuentas solo visualizas los 16 que cabe en el lcd o 20 dependiendo del tipo que tengas.


----------



## Doniga (Ago 24, 2008)

Hola Señores, como están?

Les cuento que he estado tratando de comunicarme con un Display LCD de 16x1 (16 caracteres y 1 línea).

He intentado con programas hechos por mí, algunos que encontré en la web, otro que viene con el compilador PICC y no pasa nada, siempre el LCD muestra 8 cuadrados negros y nada más.

He probado con PIC16F84, con PIC16F628A y con el PIC16F873A y nada.

En un principio pensé que era el programador (Tengo el Eclipse, que saqué de este mismo foro) entonces creé un programa típico para que se enciendan leds cada 2 segundos, y ningún problema, tonces supongo que está grabando bien.

El programa que hice se los dejo adjunto, para que me digan por favor si es que faltara algo, aunque según yo estaría completo. Lo más raro de todo es que después de enviar unos caracteres para escribir (que no se escriben) dejo el PIC en una rutina encendiendo y apagando un LED, pero esto tampoco lo hace, entonces no sé si estará funcionando bien o no la programación efectivamente, o si el LCD está dañado.

Saludos, gracias.


----------



## Meta (Ago 24, 2008)

tiopepe123 dijo:
			
		

> Te recomiendo encarecidamente te pases al pic16f876/877, funcionan y valen casi lo mismo y son mas versatiles sobretodo el bootloader



Microchip aconseja el moderno 16F886 y 16F887 al mismo tiempo más barato.


----------



## Doniga (Ago 24, 2008)

Hola Meta, 

Gracias por tu respuesta, es realmente necesario que haga ese cambio? Es por un Problema de Corrientes? Lo que pasa es que estoy haciendo un proyecto en el cual el tamaño es muy importante para mí, necesito ocupar el menor espacio posible.

Saludos.


----------



## Meta (Ago 24, 2008)

No,  no hace falta que hagas ese cambio. Por cierto leí mal. Al menos para que sepa que existe.


----------



## mcrven (Ago 25, 2008)

Amigos del hilo, no sé si me equivoco, pero me parece que no han puesto un control de contraste al display y que por exceso del mismo, los dígitos les aparecen velados en negro.

Para comprobar esto les sugieron que utilicen el diagrama correspondiente a la parte PIC + LCD 16X1 y uno de los softwares para el 16F84, del "LC Meter" contenido en la página http://ironbark.bendigo.latrobe.edu.au/~rice/lc/.
No es necesario que construyan el circuito de lectura, sólo deben construir el circuito PIC + LCD. En la mísma página está el software lc007a.hex pàra el PIC. Ese software contiene la rutina de display y funciona muy bien. Con eso podrán comprobar el soft diseñado por ustedes y verificar si han tenido algún error en el mismo.

Suerte:


----------



## ramontyto (Abr 25, 2009)

hola soy de argentina y ocurre lo mismo que al amigo doniga, mi display muestra solo los primeros 8 caracteres, he buscado información y no hay solucion. les cuento que en un momento funciono bien y quise hacer una reforma y no se que toque que NO MOSTRO mas los  16 caracteres. se que el display funciona porque los mostro auque sea una vez. No es problema del lcd sino del soft.
si alguno descubrio como hacerlo que lo cuente!
saludos


----------



## Jimmy Fernandez (May 1, 2009)

Hola amigosles comento q yo tambien tube el mismo problema con mi lcd y preferi cambiar el lenguaje de el programa de c a ensamblador y me dio buenos resultados ya que pude manejar mi pantallita lcd con un pic16f84a 
Lo que les recomindo es que cabine de lenguaje bueno ya que para mi es mas facil progrmar en asembler q en c


----------



## pablofer (Sep 3, 2009)

hola jimmy tengo una consultita por si acaso no tienes el programa en asembler para usar lcd con el pic16f84a para mostrar cualquier mensaje o lo que sea pero que se pueda usar el lcd gracias de antemano 
atte: pablito 
pd: manejo el pic16f877a pero mas uso lenguaje c


----------



## jljo (Abr 11, 2010)

Men te agradeceria si subes el codigo completo en un archivo de texto



skan dijo:


> PORFIN pude visualizar algo coherente y bien escrito en el LCD!!!!!!!...
> lo conseguí mandando yo caracter a caracter, sin utilizar la libreria para enviar la palabra entera como hacia antes...esta es un poco la estructura...
> --------------
> ORG	0
> ...



skan te agradeceria si subes el codigo completo en un archivo de texto


----------

