PIC16F84 + LCD... dudas

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

Adjuntos

  • prueba_lcd_330.c
    3.5 KB · Visitas: 188
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.
 
Atrás
Arriba