# Control de Display LCD con microcontrolador PIC



## MaMu (Jul 20, 2005)

*
Rutinas con PIC micro

Aqui en este thread he apartado las rutinas y esquemas necesarios para el manejo de dispositivos tipicos en el area digital, y muy utilizado en el ámbito de la Domotica.

Display LCD 2x16 - (tipo Hitachi)
*

*Descripción:* 

La pantalla de cristal liquido o LCD (Liquid Crystal Display) es un dispositivo µControlado de visualización grafico para la presentación de caracteres, símbolos o incluso dibujos (en algunos modelos), es este caso  







dispone de 2 filas de 16 caracteres cada una y cada carácter dispone de una matriz de 5x7 puntos (pixels), aunque los hay de otro número de filas y caracteres. Este dispositivo esta gobernado internamente por un microcontrolador Hitachi 44780 y regula todos los parámetros de presentación, este modelo es el mas comúnmente usado y esta información se basará en el manejo de este u otro LCD compatible.

*Caracteristicas principales:*

 -Pantalla de caracteres ASCII, además de los caracteres Kanji y Griegos. 
 -Desplazamiento de los caracteres hacia la izquierda o la derecha. 
 -Proporciona la dirección de la posición absoluta o relativa del caracter. 
 -Memoria de 40 caracteres por línea de pantalla. 
 -Movimiento del cursor y cambio de su aspecto. 
 -Permite que el usuario pueda programar 8 caracteres. 
 -Conexión a un procesador usando un interfaz de 4 u 8 bits 

*Funcionamiento: *

Para comunicarse con la pantalla LCD podemos hacerlo por medio de sus patitas de entrada de dos maneras posibles, con bus de 4 bits o con bus de 8 bits, este ultimo es el que explicare y la rutina también será para este. En la siguiente figura vemos las dos maneras posibles de conexionar el LCD con un pic16F84.

Conexionado con bus de 4 bits 





Conexionado con bus de 8 bits 





Como puede apreciarse el control de contraste se realiza al dividir la alimentación de 5V con una resistencia variable de 10K.

Las líneas de datos son triestado, esto indica que cuando el LCD no esta habilitado sus entradas y salidas pasan a alta impedancia.

*Descripción de pines: *

PIN Nº SIMBOLO DESCRIPCION 
1 Vss Tierra de alimentación GND 
2 Vdd Alimentación de +5V CC 
3 Vo Contraste del cristal liquido. ( 0 a +5V ) 
4 RS Selección del registro de control/registro de datos: 

         RS=0 Selección registro de control

         RS=1 Selección registro de datos

5 R/W Señal de lectura/escritura:

         R/W=0 Escritura (Write)

         R/W=1 Lectura (Read)

6 E Habilitación del modulo:

         E=0 Módulo desconectado

         E=1 Módulo conectado

7-14 D0-D7 Bus de datos bidireccional. 

*JUEGOS DE INSTRUCCIONES:*

Estas son las instrucciones para el control del modulo LCD 

Hitachi 44780 o compatible

*CLEAR DISPLAY*

Borra el módulo LCD y coloca el cursor en la primera posición 

(dirección 0). Pone el bit I/D a 1 por defecto.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 
0 0 0 0 0 0 0 0 0 1 

Tiempo de ejecución: 1.64mS

*HOME*

Coloca el cursor en la posición de inicio (dirección 0) y hace que el display comience a desplazarse desde la posición original. El contenido de la memoria RAM de datos de visualización (DD RAM) permanece invariable. La dirección de la memoria RAM de datos para la visualización (DD RAM) es puesta a 0.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 
0 0 0 0 0 0 0 0 1 X 

Tiempo de ejecución: 1.64mS


*ENTRY MODE SET*

Establece la dirección de movimiento del cursor y especifica si la visualización se va desplazando a la siguiente posición de la pantalla o no. Estas operaciones se ejecutan durante la lectura o escritura de la DD RAM o CG RAM. Para visualizar normalmente poner el bit S=0.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 
0 0 0 0 0 0 0 1 I/D S 

Tiempo de ejecución: 40µS


*DISPLAY ON/OFF CONTROL*

Activa o desactiva poniendo en ON/OFF tanto al display (D) como al cursor (C) y se establece si este último debe o no parpadear (B).

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 
0 0 0 0 0 0 1 D C B 

Tiempo de ejecución: 40µS


*CURSOR OR DISPLAY SHIFT*

Mueve el cursor y desplaza el display sin cambiar el contenido de la memoria de datos de visualización DD RAM.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 
0 0 0 0 0 1 S/C R/L X X 

Tiempo de ejecución: 40µS


*FUNCTION SET*

Establece el tamaño de interfase con el bus de datos (DL), número de líneas del display (N) y tipo de carácter (F)

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 
0 0 0 0 1 DL N F X X 

Tiempo de ejecución: 40µS


*SET THE CG RAM ADDRESS*

El módulo LCD además de tener definidos todo el conjunto de caracteres ASCII, permite al usuario definir 4 u 8 caracteres gráficos. La composición de estos caracteres se va guardando en una memoria llamada CG RAM con capacidad para 64 bytes. Cada carácter gráfico definido por el usuario se compone de 16 u 8 bytes que se almacenan en sucesivas posiciones de la CG RAM.

Mediante esta instrucción se establece la dirección de memoria CG RAM a partir de la cual se irán almacenando los bytes que definen un carácter gráfico. Ejecutando este comando todos los datos que se lean o escriban posteriormente, lo hacen desde esta memoria CG RAM.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 
0 0 0 1 Dirección de la CG RAM

Tiempo de ejecución: 40µS


*SET THE DD RAM ADDRESS*

Los caracteres o datos que se van visualizando, se van almacenando en una memoria llamada DD RAM para de aquí pasar a la pantalla.

Mediante esta instrucción se establece la dirección de la memoria 

DD RAM a partir de la cual se irán almacenando los datos a visualizar. Ejecutando este comando, todos los datos que se escriban o lean posteriormente lo harán desde esta memoria DD RAM. Las direcciones de la 80h a la 8Fh corresponden con los 16 caracteres del primer renglón y de la C0h a la CFh con los 16 caracteres del segundo renglón, para este modelo de LCD.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 
0 0 1 Dirección de la DD RAM 

Tiempo de ejecución: 40µS


*READ BUSY FLAG & ADDRESS*

Cuando el modulo LCD esta ejecutando cualquiera de estas instrucciones, tarda un cierto tiempo de ejecución en el que no se debe mandar ninguna instrucción. Para ello dispone de un flag llamado BUSY (ocupado) que indica que se está ejecutando una instrucción previa.

Esta instrucción de lectura informaciónrma del estado de dicho flag además de proporcionar el valor del contador de direcciones de la CG RAM o de la DD RAM según la última que se haya empleado.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 
0 1 BF Dirección de la CG RAM o  DD RAM 

Tiempo de ejecución: 40µS


*WRITE DATA TO GG OR DD RAM*

Mediante este comando se escribe en la memoria DD RAM los datos que se quieren presentar en pantalla y que serán los diferentes códigos ASCII de los caracteres a visualizar.

Igualmente se escribe en la memoria CG RAM los diferentes bytes que permiten confeccionar caracteres gráficos a gusto del usuario.

El escribir en uno u otro tipo de memoria depende de si se ha empleado previamente la instrucción de direccionamiento DD RAM o la de direccionamiento CG RAM.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 
1 0 Código ASCII o byte del carácter gráfico 

Tiempo de ejecución: 40µS


*READ DATA FROM CG RAM OR DD RAM*

Mediante este comando se lee de la memoria DD RAM los datos que haya almacenados y que serán los códigos ASCII de los caracteres almacenados.

Igualmente se lee de la memoria CG RAM los diferentes bytes con los que se ha confeccionado un determinado carácter gráfico.

El leer de uno u otro tipo de memoria depende de si se ha empleado previamente la instrucción de direccionamiento de la DD RAM o la de direccionamiento CG RAM.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 
1 1 Código ASCII o byte del carácter gráfico 

Tiempo de ejecución: 40µS

*ABREVIATURAS*

Abreviaturas empleadas en los códigos anteriores:

S 1 - Desplaza la visualización cada vez que se escribe un dato

0 - Modo normal

I/D 1 - Incremento del cursor

0 - Decremento del cursor

S/C 1 - Desplaza el display

0 - Mueve el cursor

R/L 1 - Desplazamiento a la derecha

0 - Desplazamiento a la izquierda

BF 1 - Módulo ocupado

0 - Módulo disponible

DL 1 - Bus de datos de 8 bits

0 - Bus de datos de 4 bits

N 1 - LCD de dos líneas

0 - LCD de una línea

F 1 - Carácter de 5 x 10 puntos

0 - Carácter de 5 x 7 puntos

B 1 - Parpadeo del cursor ON

0 - Parpadeo del cursor OFF

C 1 - Cursor ON

0 - Cursor OFF

D 1 - Display ON

0 - Display OFF

X Indeterminado

*Juego de caracteres:*






Descripción: La siguiente librería básica de rutinas es para controlar un LCD Hitachi 44780 o compatible.

Los datos o comandos a enviar al LCD los meteremos en el acumulador W antes de hacer la llamada a cualquiera de las rutinas siguientes. 

LCD_E Genera un pulso de 1µS por PORTB,2 patita 6 (Enable) del LCD. Si se usa una velocidad de micro diferente de 4MHz habrá que ajustar este tiempo. 
LCD_BUSY Chequea si el LCD esta ocupado (BUSY) y retorna de la rutina cuando ya no lo este. 
LCD_REG Pone al LCD en modo de recibir comandos , espera a que no este ocupado y va a LCD_E. 
LCD_DATOS Pone el LCD en modo datos y manda el byte presente en W que será mostrado en pantalla. 
LCD_INI Inicializacion del modulo LCD segun los tiempo marcados por el fabricante. Bus de 8 bits, 2 lineas de visualizacion y caracteres de 5 x 7 puntos. 
LCD_PORT Configura los puertos del PIC para ser usados con el LCD. 

*Rutina*

*LCD 2x16*
LCD.LIB

*Ejemplo:* 

El siguiente ejemplo muestra lo fácil que es manejar un LCD. Lo que hace básicamente es configurar el LCD, los puertos del PIC y luego mandar los datos según los va cogiendo de la tabla de datos, para mostrar en el LCD la típica frase "HOLA MUNDO".

;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>

INICIO      CLRF         Digito             ;Pone a 0 la variable digito 
               CALL         LCD_PORT    ;Puertos en modo LCD 
               BCF           RA,0              ;Desactiva RS del modulo LCD
               BCF           RA,2              ;Desactiva E del modulo LCD 
START    CALL        LCD_INI          ;Inicia LCD (CFG puertos...) 
               MOVLW    b'00000001'   ;Borrar LCD y Home 
               CALL        LCD_REG 
               MOVLW    b'00000110'  
               CALL        LCD_REG 
               MOVLW    b'00001100'   ;LCD On, cursor Off,Parpadeo Off 
               CALL        LCD_REG 
               MOVLW   0x80               ;Direccion caracter
               CALL        LCD_REG 

REPETIR  MOVF      Digito,w          ;W=Digito
               CALL       DATO_1          ;Coge el caracter 
               IORLW     0                      ;Compara 
               BTFSC     STATUS,2       ;Es el ultimo? 
               GOTO      acabar            ;Si 
               CALL       LCD_DATOS   ;Visualiza caracter 
               INCF        Digito,f             ;Incrementa numero de Digito
               GOTO     REPETIR           ;Vuelve a escribir

acabar   nop
              goto        acabar              ;Buclee infinito

;<<<<<<---------------------- TABLA DE DATOS ------------------------->>>>>>> 

DATO_1 ADDWF  PCL,1 
               RETLW  'H' 
               RETLW  'O'
               RETLW  'L' 
               RETLW  'A' 
               RETLW  ' ' 
               RETLW  'M' 
               RETLW  'U' 
               RETLW  'N' 
               RETLW  'D' 
               RETLW  'O' 
               RETLW 0x00 

*Ejemplo "Hola Mundo"*
HOLA.ASM

*Nota:* Esta rutina solo funciona correctamente con LCD's rápidos, osea los que son un poco mas caros jejej, esto lo descubrió Taiteki que fue uno de los que la probaron y les falló, la solución consiste en usar un LCD bueno o meter delays entre cada llamada a la rutina del LCD. espero que no tengáis muchos problemas con ella. Suerte.

Cortesía : x-robotics.


----------



## MaMu (Sep 3, 2005)

Ulices dijo:
			
		

> HOLA AMIGO SI TUVIERAS ALGUNOS PROYECTOS CON LCD O PAGINAS WEB CON PROYECTOS PARA LCD.
> 
> porque acabo de controlar el LCD Q TENGO



Me alegra mucho que hayas logrado el control del LCD, pero ahora que quizas estés mas metido en el tema, te propongo un desafio mas grande, con resultados mucho mas que satisfactorios. 

*Fuente : * http://www.apetech.de/article.php?artId=3&nnId=12






Puedes darle una miradita a este interesante proyecto... a continuacion te dejo una imagen que demuestra la calidad y el nivel del mismo...






Bajar Proyecto

Saludos, espero que lo encuentres interesante.


----------



## Ivan (Oct 5, 2005)

MaMu tú sabes como podría controlar una lcd de un viejo celular, tengo dos equipos viejos que no ocupo y me gustarìa poder usar algo del celular ya que estos son practimanete desechables, tengo un ericsson CA638 y otro ercsson T18Z... ¿Se puede?


----------



## MaMu (Oct 6, 2005)

Ivan dijo:
			
		

> MaMu tú sabes como podría controlar una lcd de un viejo celular, tengo dos equipos viejos que no ocupo y me gustarìa poder usar algo del celular ya que estos son practimanete desechables, tengo un ericsson CA638 y otro ercsson T18Z... ¿Se puede?



Si consigues el pin out de los display o al menos el modelo de cada uno, podria revisarse.


----------



## mamo (Oct 7, 2005)

Hola,.......sabes que no veo las imagenes,..........podrias enviar el pdf si lo tienes??,....tengo una PICDEM 2 Plus con el ICD 2 y me gustaria controlar algun LCD grafico,.............

Gracias,.......


----------



## maunix (Oct 25, 2005)

mamo dijo:
			
		

> Hola,.......sabes que no veo las imagenes,..........podrias enviar el pdf si lo tienes??,....tengo una PICDEM 2 Plus con el ICD 2 y me gustaria controlar algun LCD grafico,.............
> 
> Gracias,.......



Es raro, hasta ayer estaban! yo las vi.  Y las imágenes del último mensaje de mamu aún estan siendo mostradas.  Tal vez el servidor haga una limpieza de vez en cuando? es esto posible? alguien conoce del tema?


----------



## Andres Cuenca (Oct 25, 2005)

Hola magio, 

Algunos servidores no permiten el enlace remoto de imágenes desde otro servidor, que es lo que pasa en el primer mensaje de este tema (esto con el fin de no permitir el uso de las imágenes sin el consentimiento del autor). 

Si quieren ver las imágenes tienen que remitirse directamente a ellas. Para lo cual se toma la dirección que aparece en las propiedades de la imagen.

Saludos.


----------



## z04d (May 4, 2007)

Oyer podrias volver a subir el archivo para descargar pork ya no existe la pagina, es k se ve interesante el proyecto, y necesito uno ya que esta cerca el dia de la enterga de proyectos en la escuela


----------



## bassir (Sep 17, 2007)

ola a todos 
estoy buscando una pantalla lcd ke me muestre caracteres arabes, si alguien tubiera alguna idea  de esto, me ara un gran plis.  Merci


----------



## tiopepe123 (Sep 17, 2007)

No hay pero puedes utilizar una alfanumerica y generar caracteres arabes, pero no muchos me parece que 8 deberia mirarlo.

Otra solucion es utilizar pantallas graficas, como las del nokia3310 o de color

http://www.sparkfun.com/commerce/categories.php?cPath=76

Pero necesitaras algun micro con bastante rom como un pic18f452


----------



## bassir (Sep 25, 2007)

Gracies  tiopepe123
me parece bien tu solucion, pero una lcd de nokia como se conecta, si eres tan amable 
y otra cosa mas el pic puede reconocer los caracteres arabes o no?


Merci


----------



## aldoperex (Oct 3, 2007)

hola que tal apenas empiezo con esto de los lcds , por ahora tengo el jhd-162astn    .de 16x2  , y programo en ccs con la libreria lcd.c , pero, no logro programar mi lcd es nuevo,
cuando ajusto el contraste logro ver las 16 posiciones del primer renglon variando su contraste, pero los 16 del renglon de abajo no se ven , y tampoco no veo lo que debe desplegar mi programa, eh simulado en el proteus y en el proteus corre bien  si hace lo que le he programado , he verificado pines con el datasheet y todo correecto , es esto normal, o que me recomiendan , gracias.


----------



## gonzac.top (Nov 12, 2007)

hola no tengo un LCD de color ni nada de eso, sino que es un LCD de un estereo viejo. Al parecer es de una sola fila pero tiene 21 pines, y nose cuales son los de control etc. 
Alguien me podria decir como puedo conectarlo? busqué en internet y no encontre nada.


----------



## tiopepe123 (Nov 12, 2007)

bassir dijo:
			
		

> Gracies  tiopepe123
> me parece bien tu solucion, pero una lcd de nokia como se conecta, si eres tan amable
> y otra cosa mas el pic puede reconocer los caracteres arabes o no?
> 
> ...



La LCD del NOKIA 3310 es basicamente un trablero de ajedrez, tu debes indicarle que casilla/pixel debe activar.

Nientras que las LCD alfanumericas le envias la letra 'a' )65 en ascii) y el automaticamente se encarga en trazarla la LCD nokia no debes poner punto a punto.

Esto quiere decir que deberas armarte de paciencia y generar con un programa que hay todas las letras arabes que las guardas en la memoria del pic.

El pic no reconoce los caracteres arabes como no conoce las letras normales, para el todo son numeros, mejor dicho son codigos ASCII





En tu caso cada letra arabe le debes asignar un numero para doder trabajar mas comodamente.



[/img]


----------



## tiopepe123 (Nov 12, 2007)

aldoperex dijo:
			
		

> hola que tal apenas empiezo con esto de los lcds , por ahora tengo el jhd-162astn    .de 16x2  , y programo en ccs con la libreria lcd.c , pero, no logro programar mi lcd es nuevo,
> cuando ajusto el contraste logro ver las 16 posiciones del primer renglon variando su contraste, pero los 16 del renglon de abajo no se ven , y tampoco no veo lo que debe desplegar mi programa, eh simulado en el proteus y en el proteus corre bien  si hace lo que le he programado , he verificado pines con el datasheet y todo correecto , es esto normal, o que me recomiendan , gracias.



Si solo se enciende la fila superior es que no se inicializa correctamente.

Verifica lo siguiente:
Evidentemente mira si has puesto el init_lcd (o algo asi)

Le has indicado la velocidad del cuarzo?
Bajale la velocidad, le dices que tienes un cuarzo mucho mas rapido del que tienes, por ejemplo si tienes un de 4MHZ le dices que tienes uno de 20MHz
Mucha veces el pic corre demasiado y la lcd no lo puede seguir.


----------



## tiopepe123 (Nov 12, 2007)

gonzac.top dijo:
			
		

> hola no tengo un LCD de color ni nada de eso, sino que es un LCD de un estereo viejo. Al parecer es de una sola fila pero tiene 21 pines, y nose cuales son los de control etc.
> Alguien me podria decir como puedo conectarlo? busqué en internet y no encontre nada.



Eso es bastante complejo de conectarlo, seguro que es un cristalito y las patillas, eso quiere decir que es tonta y te obliga a hacer un monton de programacion, hoy en dia al precio que van las lcd alfanumericas no vale la pena.


----------



## aldoperex (Nov 12, 2007)

MUCHAS GRACIAS POR LA AYUDA.! he logrado controlar el lcd , es muy fácil de verdad, ahora veré como adicionar caractéres hechizos o formar dibujos que no esten en la tabla ascii , ésto si me da tiempo,  si requieren cooperación con todo gusto,,! 
Nos vemos en la proxima , espero expongan proyectos interesantes cada vez más


----------



## tapenot (Jun 17, 2008)

Hola, soy nuevo en el foro. Así que no se como funciona muy  bien. Me gustaría saber como has solucionado tu problema aldoperex. A mí me ocurre lo mismo, solo logro ver las 16 posiciones del primer renglón y no las de abajo. Yo utilizo un cristal de 12 Mhz. He puesto frecuencias de trabajo más altas y tampoco me funciona.
Gracias por la ayuda.


----------



## tiopepe123 (Jun 17, 2008)

Te repito lo mismo, haz la rutina leeeenta, asegurate que tanto el nivel alto como el bajo sea leeento.
Hasta que no consigas que se iluminen las dos filas no habras inicializado correctamente la lcd.


Despues ya subiras de vueltas...


----------



## marjisanchez (Jun 24, 2008)

Mediante la señal de un pulsador, el LCD permitirá visualizar en la primera línea un temporizador y en la segunda línea se verá un valor que se incrementa a medida que lo hace el temporizador.
Si tienen ejemplos de código, mucho mejor. Gracias!


----------



## Elvic (Jul 23, 2008)

hola a todos

Pues me encontré este tema de como comenzar a trabajar con los LCD y los PIC.

Recién empiezo también a familiarizarme con esto del LCD,  pues pongo en este mensaje mi primer código que me funciona, escrito en lenguaje C con _sourceboost IDE_, bastantes lineas de código ops: , pero solo así le entendí, para comenzar a trabajar con el LCD; pero seguro se puede reducir las lineas de código empleando funciones, pues casi todo se repite.

espero le sirva a alguien mas

El pic es el 16F73(aunque puede ser aplicado para otro; como el 16f877), y el LCD es estándar de 2x16 caracteres, frecuencia de trabajo del PIC 4MHZ

los pines del LCD correspondiente al PIC son: 
RS   =  RA0, 
R/W =  RA1, 
E     =  RA2 
y 
[DB0...DB7]=[RB0..RB7], respectivamente 

saludos


----------



## Meta (Jul 23, 2008)

Hola:

Lo de Hola Mundo que has puesto así...


```
DATO_1 ADDWF PCL,1
RETLW 'H'
RETLW 'O'
RETLW 'L'
RETLW 'A'
RETLW ' '
RETLW 'M'
RETLW 'U'
RETLW 'N'
RETLW 'D'
RETLW 'O'
RETLW 0x00
```

También vale así.


```
DT     "HOLA MUNDO", 0x00
```

Por cierto, normalmente los LCD del Hitachi 44780*A00* es el estandar pero no  se usa las tildes, lo del 44780*A02* es lo mejor.

Estas cosas hay que tenerlas en cuenta.


----------



## scapc (Jul 29, 2008)

para elvic

a que te refieres con una lcd estandar me podrias decir si puedo usar cualquier referencia siempre y cuando sea  alfanumerica de 16x2

gracias de antemano.


----------



## Meta (Jul 29, 2008)

Busca la diferencia entra la 44780A00 con la 44780A02.


----------



## Elvic (Jul 29, 2008)

hola scapc
pues prácticamente  si el hecho de ser estándar no solo me refería al LCD 16x2, a lo que me refiero es que todos los LCD basado en el chip  hitachi44780 tienen el mismo clase de conexionado (terminales), así que puedes utilizar cualquier LCD que se base en ese chip. 

ahora lo que menciona Meta es muy cierto me puse ha buscarle poquito en google y encontré esto:
http://www2.ate.uniovi.es/fernando/Doc2004/SED/Presentaciones/LCD.pdf

El hecho de A00 o A02 es la versión del Firmware, para la interpretación de los códigos que envíes al LCD; mira la diapositiva del enlace y hay explica las diferencias que existe entre A00 y A02 

suerT

PD. no se si la palabra Firmware este bien aplicada par este caso.


----------



## Meta (Jul 29, 2008)

Elvic dijo:
			
		

> hola scapc
> pues prácticamente  si el escho de ser estándar no solo me refería al LCD 16x2, a lo que me refiero es que todos los LCD basado en el chip  hitachi44780 tienen el mismo clase de conexionado (terminales), asi que puedes utilizar cualquier LCD que se base en ese chip
> 
> ahora lo que menciona Meta es muy cierto me puse ha buscarle poquito en google y encontré esto:
> ...



Muy buena información y en español.


----------



## Ramon.Maldonado (Oct 3, 2008)

Normalmente nunca escribo en foros de nada, pero debido a que despues de intentar echar a andar mi PIC (El cual no coincide con el de este foro con un lcd que tampoco coincide con este foro) les dar{e unos tips para todos aquellos a los que no les funciona porque no tiene el mismo pic que el que postio la rutina tiene.

Primero, deben recordar que la variable DIGITO, DATO_A y DATO_B deben caer en una direccion libre para escribir en su PIC ya que si las dejan asi puede caer en otro registro de control de algo del micro porque no es de diferente modelo.

Segundo, incrementen uno poco el delay que tiene esta rutina (ya que el que lo postio asegura que su Hitachi es rapido y si tu tienes uno mas lento los tiempos de delay no coincidiran asi que incrementa un poco tu delay al cabo si te pasas no hay problema solo escribe mas lento)

Tercero, SUPER IMPORTANTE, asegurate que tus PINS DE I/O son digitales y están configurados como digitales modificado los regsitros ANSEL y ANSELH ya que si no lo haces jamas podrás hacer nada correctamente digitalmente con esos pins.

Todo lo demás está correcto.

Si por alguna razón no jala, intenta hacer una llamada a la funcion DELAY_5MS en la funcion ENABLE netre la activacino y su desactivación. pero deberia funcionar con el puro NOP.

Si nos les jala pidanme el codigo!

saludos,


----------



## pepechip (Oct 4, 2008)

Para comprender mejor el funcionamiento de una pantalla LCD os aconsejo el circuito de la figura en donde con unos simples interruptores y un pulsador enviais al LCD la información deseada.
Despues de jugar un poco con este circuito, resulta mucho mas facil comprender que tipo de señales tiene que mandarle un microcontrolador para su control.


----------



## Moyano Jonathan (Oct 4, 2008)

Tengo las librerias de control de un display LCD de 2 x 16 caracteres en CCS por control sincronico , con lo cual reducimos las lineas de control a solamente 3 DATOS,CLOCK y STROBE el unico incoveniente es que la representacion grafica es un poco lenta debido a que los datos se transmiten de forma serial.


----------



## ojuquearte83 (Oct 20, 2008)

Hola! soy Bernardo y soy nuevo en este foro y la verdad es q ando un poco perdido con mi proyecto, tengo que programar el pic 18f4550 y estoy empezando por intentar controlar un lcd, el programa que uso para el codigo en C es el CCS y luego pretendo simularlo en Proteus, alguien tiene un ejemplo que me pueda enviar para ver como la la asignacion de los pines y como configurarlos y todas esas cosillas

Muchas gracias sois la caña!


----------



## Residente (Nov 13, 2008)

Hola a todos, espero me podáis echar una mano, tengo una lcd 16x2 conexionada con 4bits, el problema es que solo visualizo la primera línea, en la segunda no consigo que salga nada, he probado ha cambiar la librería pero nada..  
Adjunto la librería que estoy utilizando, muchas gracias por todo.
Un saludo.


----------



## DMag00 (Nov 13, 2008)

Puedes hechar un vistazo a este link; donde yo tambien recibi ayuda con este tipo de display; y con el compilador CCS.

https://www.forosdeelectronica.com/f24/llave-electronica-pic-16f877-16637/

Aqui recibi buena asersoria y ademas tiene proyectos de aplicación.

Espero sean de utilidad.


----------



## Residente (Nov 14, 2008)

Muchas gracias por el enlace DMag00 ya he solucionado el problema, era una tonteria. 
un saludo


----------



## El Pelado (Nov 14, 2008)

Salú la barra! ya que estamos en esto de los LCD, me obsequiaron un LCD que está conectado a un PIC 16F628A, me dicen que funciona a travez de tramas por el puerto COM, el pic esta en blanco por lo que solo se ve una linea negra en el lcd (las matrices de puntos) Mi pregunta es aalguno tendra un programita para cargarle al pic? Como funciona esto a travez del COM? Si puedo despues subo fotos.

Gracias!


----------



## DMag00 (Nov 14, 2008)

Puedes revisar el link que he posteado; es para un LCD LM016 y el PIC16F877


----------



## Vlad666 (Ene 8, 2009)

Saludos. Podrias subir el archivo que mencionas. Se ve muy interesante el proyecto.


----------



## Moyano Jonathan (Ene 9, 2009)

La librería LCD.c de CCS te pone todas las indicaciones de como usarla.
sino mirate este link: http://www.ucontrol.com.ar/wiki/index.php/CCS_-_LCD


----------



## kdtguerrag (Abr 8, 2009)

Como estan amigos, necesito una ayuda, tengo un lcd 2x16 controlado con un pic 16f877a, dispongo de un cable de datos de 3 metros y una fuente de 12 V, pero OJO miren lo que me pasa: conecto el pic al lcd con el cable de datos de 3 metros, si conecto la placa del lcd con un cable de energia de 1 metro desde la fuente en el lcd visualizo el texto, ahora si coloco un cable de energia de 3 metros desde la fuente a la placa del lcd ya no visualizo el texto, me parece extrano que variando el cable de energia afecte la parte de datos, en el lcd recibo los mismos 12 voltios y la misma corriente con los 2 cables, ya no se que puede ser, agradesco mucho si alguien sabe que puede ser... saludos


----------



## DMag00 (May 4, 2009)

Hola! tengo un LCD 16X2 un JM162A; y como lo recupere de un equipo viejo; no se si funcione; entonces la pregunta es:
Como saber que un LCD ya no funciona(manualmente)? 
no puedo inicializarlo; ya he usado algun codigo de aqui mismo pero no logro hecharlo a funcionar


----------



## josemaracay (May 31, 2009)

como hago para visualizar en lcd lm016l, cuando un motor dc esta girando a la derecha, girando a la izquierda y parado, trabajando con un pic16f84a, fusionando el programa de funcionamiento del motor y el lcd.
ya yo tengo el programa del motor en asm pero no logro visualizar su funcionamiento en el lcd, seria de mucha ayuda su colaboracion....


----------



## shadow_x (Oct 12, 2009)

saludos tengo la siguiente dua: es peligroso soldar una LCD? acabo de comprar una y no quiero arriesgarme a dañarla; sin embargo tiene 16 orificios para soldar (supongo) y son de doble cara; si se puede soldar... puedo soldar todos los cables a una cara o tienen que intercalarse?


----------



## Chico3001 (Oct 12, 2009)

No es peligroso siempre y cuando no excedas de la temperatura, si tienes un buen cautin y buen pulso puedes soldar y desoldar la LCD cuantas veces consideres necesario....


----------



## Chelouruguay (Oct 13, 2009)

Hola gente, les cuento que consegui un celular motorola v120 (cdma).

Mi idea es usar el lcd del mismo, no se si se puede con un pic, usando serie o usando SPI. 

Alguno ya ha probado algo con este cel?.

Bueno, estoy atento a cualquier sugerencia, muchas gracias!


----------



## shadow_x (Oct 24, 2009)

gracias; listo y funcionando mi display de tipo calculadora. tal vez luego me anime a usar uno de celular


----------



## ElFabroDeLaGente (Dic 5, 2009)

Hola a todos.
Tengo un problema, resulta que quiero mostrar la palabra HOLA en un lcd de 16x2 lineas utilizando un microcontrolador QY4A de motorola.
No logro inicializar bien el lcd.
Por favor si alguien sabe como hacerlo me gustaria que me explicara.
Saludos.


----------



## waterflame (Dic 29, 2009)

Hola, hago esta pregunta aquí porque no se por donde comenzar.

¿Qué necesito para controlar una pantalla LCD SVGA color de un ordenador portatil?

La pantalla es una samsung numero de parte: lmjk6322ntr

Solo quiero mostrar letras y números sobre rectangulos de colores, para empezar.

Gracias


----------



## Chico3001 (Dic 29, 2009)

un procesador muuuuuuy rapido..... por que esas pantallas requieren muchisima velocidad.... de echo es preferible un FPGA o algun micro con modulo de control para TFT


----------



## waterflame (Dic 30, 2009)

Chico3001 dijo:


> un procesador muuuuuuy rapido..... por que esas pantallas requieren muchisima velocidad.... de echo es preferible un FPGA o algun micro con modulo de control para TFT




Me darias un ejemplo de miucro para control de tft, por favor

Gracias!


----------



## Chico3001 (Dic 30, 2009)

AT91SAM9261
OMAP35X
PIC24FJ32GA002
MC9328MX21CJM

etc....etc.... etc....

Cualquier micro que corra por encima de 40MHz (estimo) y tenga suficiente memoria te puede servir para controlar un LCD....


----------



## Omar266 (Feb 22, 2010)

En el libro que tengo como guía, para estudiar PIC utilizan un LCD display LM016l HITACHI el cual consta de 14 pines,. Para practicar solo consigo de 16 pines. 
Los pines del 1 al 14 son iguales. Puedo comprar este último para realizar mis prácticas. Que función tienen el 15 y el 16

Gracias


----------



## mecatrodatos (Feb 23, 2010)

Esos pines son utilizados para otorgarle iluminacion a la pantalla LCD, uno se conecta con una resistencia de 10K a vdd y el otro a GND del circuito.


----------



## Victor Usuga (Mar 8, 2010)

Como están compañeros, Alguien me podrá hacer el favor de explicar como utilizar la memoria CG RAM, Osea como crear los caracteres y un código en assembler de como utilizarlos. Gracias de ante mano


----------



## DMag00 (Mar 28, 2010)

Ya he solucionado mi problema; afortunadamente, mi LCD es compatible para trabajar con 4 u 8 bits, así que esto es más que escelente, ahora estoy usando la libreria Lcd.c de CCS C, y funciona perefctamente.


----------



## reyvilla (Abr 21, 2010)

Aqui dejo un pequeño aporte de como se controlan las lcd tiene 7 experimentos los cuales estan basados en como controlar de manera eficiente la lcd, esta en ingles pero se entiende bastante bien trae un circuito para controlar la lcd a traves de puro swichets...espero les sea de mucha utilidad...saludos...

PD: cualquier duda estoy a la orden


----------



## Kacike07 (May 2, 2010)

hola amigos uds me podrian ayudar lo que quiero es enviar un mensaje a una pantalla 16x2 pero como mi nivel de programacion es nulo yo trabajo con el ldmicro 
espero su respuesta y de antemano muchas gracias


----------



## sammaael (May 2, 2010)

Hola amigos. Tengo una duda que hace tiempo ronda en mi cabeza. Hace algun tiempo atras me lance en un pequeño proyecto solo con fines didacticos para realizar el control de una pantalla lcd 16x2. Para ello utilice la libreria en assembler que encontre en el uy famoso libro desarrollo de proyectos pic 16f84 de la editorial RA-MA. El problema es que al ir a la tienda me encontre con una amplia variedad de pantallas lcd 16x2 alfanuericas por cierto. Cuando me pidieron las caracteristicas de esta no supe que decir... agache la cabeza y me fui.... jajajajja
Creo que cualquier lcd que utilice el microcontrolador hitachi 44780, o no es asi? en el mismo libro mencionan un tal LM016L pero no sabian si tenian ese en la tienda.
Por eso amigo quisiera saber en que aspectos me debo fijar ala hora de coprar una pantalla lcd 16x2 (o cualquiera en general), si existe alguna diferencia sustancial entre un modelo y otro (con el mismo procesador) lo  cual incida en cambios en el programa de control, etc...
La verdad estoy muy perdido en este tema.
Gracias amigos por su tiempo y ayuda
Saludos!


----------



## gzaloprgm (May 2, 2010)

Lo más probable es que cuando pidas un "lcd alfanumerico" o "lcd inteligente" te den uno con el controlador HD44780. Si no es este, preguntales que controlador usa, no suelen diferir tanto uno de otro.

Las diferencias principales entre dos LCD suelen ser: 


 Tamaño (tanto físico como cantidad de caracteres)- el HD44780 soporta hasta 80 caracteres por controlador


 Frecuencia máxima de operación (no suele importar, pero hay que saber que un lcd alfanumerico es relativamente lento y requiere demoras en el programa)


Presencia de backlight y su color (es algo estético más que nada)


Conector (que pata corresponde a qué)
Saludos,
Gonzaol


----------



## Chico3001 (May 2, 2010)

La gran mayoria de los displays LCDs inteligentes usan el controlador de Hitachi o compatible, asi que realmente el problema se reduce a una cuestion de precio y estetica, incluso con cambios minimos puedes usar LCDs mas grandes (20x2 o 20x4) o pequeños

Las diferencias que usualmente encuentras son si tienen backlight y de que color y tipo (led o electrostatico), si tienen el conector doble o sencillo, en que lado de la placa lo tienen, el tamaño de los caracteres... etc... 

Y ya mas a profundidad (aunque casi nadie se fija en eso) es el tipo de cristal liquido que usan, por que algunos LCDs funcionan mejor en condiciones de luz intensa y otros para luz tenue... el tiempo de respuesta y cosas asi... realmente para comenzar con que pidas un 16x2 con backlight es suficiente, y solo te adecuas al modelo que te den... 

Saludos...


----------



## sammaael (May 3, 2010)

ok entonces segun el odelo tendre que incorporar retardos en i rutina por lo que entendi o no es asi?
De ser asi como saber que tiempos de retardo debo incluir, dependera de la frecuencia de operacion del display?


----------



## gzaloprgm (May 3, 2010)

Exactamente, si estás usando un micro a >1 MIPS casi seguro que tendrás que usar esperas.

Los tiempos exactos dependen del controlador, si mal no recuerdo eran un par de millisegundos (<2) para la inicialización y >250 uS para cada comando/dato.

Saludos,
Gonzalo


----------



## Chelouruguay (May 4, 2010)

Yo hice unos proyectos en un LCD con el Hitachi y trabaje a 48khz y anduvo sin problemas.

Habria que ver cada cuanto actualizas los valores del LCD, ahi estas dependiendo de la respuesta que debe tener el mismo, como te dicen aca mas arriba.

Saludos


----------



## diego_z (May 4, 2010)

MaMu dijo:


> Me alegra mucho que hayas logrado el control del LCD, pero ahora que quizas estés mas metido en el tema, te propongo un desafio mas grande, con resultados mucho mas que satisfactorios.
> 
> *Fuente : *http://www.apetech.de/article.php?artId=3&nnId=12
> 
> ...


 hola mamu podrias subir el proyecto que mencionas aqui , ya no esta mas y el link no funciona , un saludo


----------



## FRYCK (May 5, 2010)

sammaael dijo:


> ok entonces segun el odelo tendre que incorporar retardos en i rutina por lo que entendi o no es asi?
> De ser asi como saber que tiempos de retardo debo incluir, dependera de la frecuencia de operacion del display?




Hola *sammaael*  si  para  el  manejo  de la  lcd  se tienen que tener  en cuenta  unos  tiempos   minimos  que  depende del  controlador de esta  y de la  función que se esta realizando si es  de lectura escritura  etc  te  adjunto  algo de información en donde los describen   http://www.docstoc.com/docs/22273558/Curso-de-Microcontroladores-PIC-El-PIC16F84/


----------



## sammaael (May 6, 2010)

Muchas gracias a todos por guiarme ahora falta comprar el lcd y probar cualquier duda vuelvo a preguntar MUCHAS GRACIAS!!!


----------



## maritenz (May 7, 2010)

muy buen aporte, haber utilizado pic en mi secundaria me hubieses facilitado aprender mas rapido a usar un LCD. ja


----------



## cubiella (May 20, 2010)

No consigo nada de esto mas que el pin out de este LCD de fabricante INTECH, es compatible con el conosido HITACHI 44780 de ser asi que tan compatible es? A mi criterio si es compatible perono lo se, quiero estar seguro antes de comprarlo. Que me recomiendan, este bale 32 pesos argentinos el otro unos 140


----------



## Meta (May 22, 2010)

Usando el HITACHI 44780 de 2x16 la configuración 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
```

¿Cómo lo hago para un LCD de 4x20?


----------



## sammaael (May 28, 2010)

Amigos al fin compre un LCD modelo gdm1602k(adjunto un pequeño data) la duda que tengo es que el display consta de una matriz de 5x8 y todas las librerias que he visto esta considerado para 5x7. La libreria que utilizo es la siuiente pero no se exactamente que cambios deberia hacer para que el lcd me funcione.


```
;**************************** Librería "LCD_4BIT.INC" ***********************************

	CBLOCK
	LCD_Dato
	LCD_GuardaDato
	LCD_GuardaTRISB
	LCD_Auxiliar1
	LCD_Auxiliar2
	ENDC

LCD_CaracteresPorLinea	EQU	.16			; Número de caracteres por línea de la pantalla.

#DEFINE  LCD_PinRS	PORTA,0
#DEFINE  LCD_PinRW	PORTA,1
#DEFINE  LCD_PinEnable	PORTA,2
#DEFINE  LCD_BusDatos	PORTB

; Subrutina "LCD_Inicializa" ------------------------------------------------------------
;
; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software,
; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la
; configuración inicial hay que hacerla como sigue:
;
LCD_Inicializa
	bsf		STATUS,RP0				; Configura las líneas conectadas al pines RS,
	bcf		LCD_PinRS				; R/W y E.
	bcf		LCD_PinEnable
	bcf		LCD_PinRW
	bcf		STATUS,RP0
	bcf		LCD_PinRW				; En caso de que esté conectado le indica
									; que se va a escribir en el LCD.
	bcf		LCD_PinEnable			; Impide funcionamiento del LCD poniendo E=0.
	bcf 	LCD_PinRS				; Activa el Modo Comando poniendo RS=0.
	call	Retardo_20ms
	movlw	b'00110000'	
	call	LCD_EscribeLCD			; Escribe el dato en el LCD.
	call	Retardo_5ms	
	movlw	b'00110000'	
	call	LCD_EscribeLCD
	call	Retardo_200micros
	movlw	b'00110000'	
	call	LCD_EscribeLCD
	call	Retardo_20micros		; Este retardo es necesario para simular en PROTEUS.
	movlw	b'00100000'				; Interface de 4 bits.
	call	LCD_EscribeLCD
	call	Retardo_20micros		; Este retardo es necesario para simular en PROTEUS.
	
; Ahora configura el resto de los parámetros: 

	call	LCD_2Lineas4Bits5x7		; LCD de 2 líneas y caracteres de 5x7 puntos.
	call	LCD_Borra				; Pantalla encendida y limpia. Cursor al principio
	call	LCD_CursorOFF			; de la línea 1. Cursor apagado.
	call	LCD_CursorIncr			; Cursor en modo incrementar.
	return

; Subrutina "LCD_EscribeLCD" -----------------------------------------------------------
;
; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin
; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que
; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se
; vuelve a enviar este dato sin cambiarlo.

LCD_EscribeLCD
	andlw	b'11110000'				; Se queda con el nibble alto del dato que es el
	movwf	LCD_Dato				; que hay que enviar y lo guarda.
	movf	LCD_BusDatos,W			; Lee la información actual de la parte baja
	andlw	b'00001111'				; del Puerto B, que no se debe alterar.
	iorwf	LCD_Dato,F				; Enviará la parte alta del dato de entrada
									; y en la parte baja lo que había antes.
	bsf		STATUS,RP0				; Acceso al Banco 1.
	movf	TRISB,W					; Guarda la configuración que tenía antes TRISB.
	movwf	LCD_GuardaTRISB
	movlw	b'00001111'				; Las 4 líneas inferiores del Puerto B se dejan 
	andwf	PORTB,F					; como estaban y las 4 superiores como salida.
	bcf		STATUS,RP0				; Acceso al Banco 0.
;
	movf	LCD_Dato,W				; Recupera el dato a enviar.
	movwf	LCD_BusDatos			; Envía el dato al módulo LCD.
	bsf		LCD_PinEnable			; Permite funcionamiento del LCD mediante un pequeño
	bcf		LCD_PinEnable			; pulso y termina impidiendo el funcionamiento del LCD.
	bsf		STATUS,RP0				; Acceso al Banco 1. Restaura el antiguo valor en
	movf	LCD_GuardaTRISB,W		; la configuración del Puerto B.
	movwf	TRISB
	bcf		STATUS,RP0				; Acceso al Banco 0.
	return

; Subrutinas variadas para el control del módulo LCD -----------------------------------------
;
;Los comandos que pueden ser ejecutados son:
;
LCD_CursorIncr						; Cursor en modo incrementar.
	movlw	b'00000110'
	goto	LCD_EnviaComando
LCD_Linea1							; Cursor al principio de la Línea 1.
	movlw	b'10000000'				; Dirección 00h de la DDRAM
	goto	LCD_EnviaComando
LCD_Linea2							; Cursor al principio de la Línea 2.
	movlw	b'11000000'				; Dirección 40h de la DDRAM
	goto	LCD_EnviaComando
LCD_Linea3							; Cursor al principio de la Línea 3
	movlw	b'10010100'				; Dirección 14h de la DDRAM
	goto	LCD_EnviaComando
LCD_Linea4							; Cursor al principio de la Línea 4
	movlw	b'11010100'				; Dirección 54h de la DDRAM
	goto	LCD_EnviaComando
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.
LCD_PosicionLinea2					; Cursor a posición de la Línea 2, a partir de la
	iorlw	b'11000000'				; dirección 40h de la DDRAM más el valor del
	goto	LCD_EnviaComando		; registro W.
LCD_OFF								; Pantalla apagada.
	movlw	b'00001000'
	goto	LCD_EnviaComando
LCD_CursorON						; Pantalla encendida y cursor encendido.
	movlw	b'00001110'
	goto	LCD_EnviaComando
LCD_CursorOFF						; Pantalla encendida y cursor apagado.
	movlw	b'00001100'
	goto	LCD_EnviaComando
LCD_Borra							; Borra toda la pantalla, memoria DDRAM y pone el 
	movlw	b'00000001'				; cursor a principio de la línea 1.
	goto	LCD_EnviaComando
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. 

; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ------------------------------------
;
; "LCD_EnviaComando". Escribe un comando en el registro del módulo LCD. La palabra de
; comando ha sido entregada a través del registro W.  Trabaja en Modo Comando.
; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carácter ASCII introducido a
; a través del registro W. Trabaja en Modo Dato.
;
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 byte.
	call	LCD_EscribeLCD			; Se envía al visualizador LCD.
	btfss	LCD_PinRS				; Debe garantizar una correcta escritura manteniendo 
	call	Retardo_2ms				; 2 ms en modo comando y 50 µs en modo cáracter.
	call	Retardo_50micros
	return	

; Subrutina "LCD_CodigoCGROM" -----------------------------------------------------------
;
; A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la
; tabla CGROM del LM016L no coinciden con los códigos ASCII. Así por ejemplo, el código
; ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh.
;
; Esta subrutina convierte los códigos ASCII de la "Ñ", "º" y otros, a códigos CGROM para que
; que puedan ser visualizado en el módulo LM016L.
; 
; Entrada:	En (W) el código ASCII del carácter que se desea visualizar.
; Salida:	En (W) el código definido en la tabla CGROM.

LCD_CodigoCGROM
	movwf	LCD_Dato				; Guarda el valor del carácter y comprueba si es
LCD_EnheMinuscula					; un carácter especial.
	sublw	'ñ' 					; ¿Es la "ñ"?
	btfss	STATUS,Z
	goto	LCD_EnheMayuscula		; No es "ñ".
	movlw	b'11101110'				; Código CGROM de la "ñ".
	movwf	LCD_Dato
	goto	LCD_FinCGROM
LCD_EnheMayuscula
	movf	LCD_Dato,W				; Recupera el código ASCII de entrada.
	sublw	'Ñ' 					; ¿Es la "Ñ"?
	btfss	STATUS,Z
	goto	LCD_Grado				; No es "Ñ".
	movlw	b'11101110'				; Código CGROM de la "ñ". (No hay símbolo para
	movwf	LCD_Dato				; la "Ñ" mayúscula en la CGROM).
	goto	LCD_FinCGROM	
LCD_Grado
	movf	LCD_Dato,W				; Recupera el código ASCII de entrada.
	sublw	'º' 					; ¿Es el símbolo "º"?
	btfss	STATUS,Z
	goto	LCD_FinCGROM			; No es "º".
	movlw	b'11011111'				; Código CGROM del símbolo "º".
	movwf	LCD_Dato
LCD_FinCGROM
	movf	LCD_Dato,W				; En (W) el código buscado.
	return

; Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" --------------------------------
;
; Visualiza espacios en blanco.

LCD_LineaEnBlanco
	movlw	LCD_CaracteresPorLinea
	goto	LCD_EnviaBlancos
LCD_UnEspacioBlanco
	movlw	.1
	goto	LCD_EnviaBlancos
LCD_DosEspaciosBlancos
	movlw	.2
	goto	LCD_EnviaBlancos
LCD_TresEspaciosBlancos
	movlw	.3
LCD_EnviaBlancos
	movwf	LCD_Auxiliar1			; (LCD_Auxiliar1) se utiliza como contador.
LCD_EnviaOtroBlanco	
	movlw	' '						; Esto es un espacio en blanco.
	call	LCD_Caracter			; Visualiza tanto espacios en blanco como se
	decfsz	LCD_Auxiliar1,F			; haya cargado en (LCD_Auxiliar1).
	goto	LCD_EnviaOtroBlanco
	return

; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" --------------------------------------------
;
; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el
; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE".
;
; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero 
; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' visualiza "AE"
; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante).
;
; Utilizan la subrutina "LCD_Nibble" que se analiza más adelante.
;
LCD_Byte
	movwf	LCD_Auxiliar2			; Guarda el valor de entrada.
	andlw	b'11110000'				; Analiza si el nibble alto es cero.
	btfss	STATUS,Z				; Si es cero lo apaga.
	goto	LCD_VisualizaAlto		; No es cero y lo visualiza.
	movlw	' '						; Visualiza un espacio en blanco.
	call	LCD_Caracter
	goto	LCD_VisualizaBajo

LCD_ByteCompleto
	movwf	LCD_Auxiliar2			; Guarda el valor de entrada.
LCD_VisualizaAlto
	swapf	LCD_Auxiliar2,W			; Pone el nibble alto en la parte baja.
	call	LCD_Nibble				; Lo visualiza.
LCD_VisualizaBajo
	movf	LCD_Auxiliar2,W			; Repite el proceso con el nibble bajo.
;	call	LCD_Nibble				; Lo visualiza.
;	return

; Subrutina "LCD_Nibble" ----------------------------------------------------------------
;
; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble
; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos:
; - Si (W)=b'01010110', se visualizará "6". 
; - Si (W)=b'10101110', se visualizará "E". 
;
LCD_Nibble
	andlw	b'00001111'				; Se queda con la parte baja.
	movwf	LCD_Auxiliar1			; Lo guarda.
	sublw	0x09					; Comprueba si hay que representarlo con letra.
	btfss	STATUS,C	
	goto	LCD_EnviaByteLetra
	movf	LCD_Auxiliar1,W
	addlw	'0'						; El número se pasa a carácter ASCII sumándole
	goto 	LCD_FinVisualizaDigito	; el ASCII del cero y lo visualiza.
LCD_EnviaByteLetra
	movf	LCD_Auxiliar1,W
	addlw	'A'-0x0A				; Sí, por tanto, se le suma el ASCII de la 'A'.
LCD_FinVisualizaDigito
	goto	LCD_Caracter			; Y visualiza el carácter. Se hace con un "goto"
									; para no sobrecargar la pila.
```

Probe utilizando esta libreria pero no me da resultados y la verdad estaba muy feliz cuando tenia el lcd en mis manos y ahora que no me funcio me he desanimado, pero quien dijo que seria facil....


Porfavor si alguien me puede dar una ayudita un empujoncito o algo...
Ademas estoy utilizando solo 4bits para programarlo, los bits restantes que debo hacer con ellos dejarlos sin coneccion solamente???(obviamente los que "sobran" de D0aD7)

Gracias saludos


----------



## lucasromeiro (May 28, 2010)

Hola amigos, me compré este LCD:

http://cgi.ebay.com/3-5-TFT-LCD-Modu...item2ea9a8bff0

color, pantalla táctil, 320x240, TFT, etc ..
pero no tengo ninguna experiencia con LCDs gráficos, y mucho menos a color, alguien puede darme una mano? cualquier programa, código, circuito, cualquier cosa es bienvenida jeje
Controlar ese aparatito no debe ser fácil ...
Lástima que Proteus no pueda simularlo ...



¿Alguien me puede dar una mano?


Saludos

link LCD: http://cgi.ebay.com/3-5-TFT-LCD-Mod...U_CashRegisterAccessories&hash=item2ea9a8bff0


----------



## Meta (May 29, 2010)

Los gráficos con fotos que sepas esos LCD COLOR son retocado con Photoshop. No se ven tan perfectos como te lo muestra en la publicidad, se ven como pixelado a los móviles de Nokia de antes. 

Los LCD COLOR son extremada mentes lentos y se recomienda manejarlos con PIC de alta gama, incluso de 16 a 32 Bits para manejarlo decentemente si hay muchos cambios de imagen.


----------



## Rijiru (May 31, 2010)

Hola gente del foro, me estoy intoduciendo mas en el tema del manejo de LCD 16x2 con PIC, la verdad la libreria en CCs viene diseñada para los PIC cuya estructura tienen puerto D de 8 bits, para poder manejar LCD con PIC16F84 le adjunto la libreria que utilice para drivearlo en la libreria viene definido el puerto B para manejar LCD y solo hay que guardarlo como archivo de extencion .c, espero y sea de ayuda.



Saludos


----------



## sammaael (May 31, 2010)

Bueno solucione el problema y al fin pude utilizar mi LCD 16x2
Aca les dejo la libreria modificada para utilizarlo con el modulo lcd GDM1602k

SALUDOS!

```
;**************************** Librería "LCD_4BIT.INC" ***********************************
;esta comprobada su utilizacion con el modulo lcd GDM1602K
	CBLOCK
	LCD_Dato
	LCD_GuardaDato
	LCD_GuardaTRISB
	LCD_Auxiliar1
	LCD_Auxiliar2
	ENDC

LCD_CaracteresPorLinea	EQU	.16			; Número de caracteres por línea de la pantalla.

#DEFINE  LCD_PinRS	PORTA,0
#DEFINE  LCD_PinRW	PORTA,1
#DEFINE  LCD_PinEnable	PORTA,2
#DEFINE  LCD_BusDatos	PORTB

; Subrutina "LCD_Inicializa" ------------------------------------------------------------
;
; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software,
; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la
; configuración inicial hay que hacerla como sigue:
;
LCD_Inicializa
	call	Retardo_5ms	;LO AGREGE YOOO
	bsf		STATUS,RP0				; Configura las líneas conectadas al pines RS,
	bcf		LCD_PinRS				; R/W y E.
	bcf		LCD_PinEnable
	bcf		LCD_PinRW
	bcf		STATUS,RP0




	bcf		LCD_PinRW				; En caso de que esté conectado le indica
									; que se va a escribir en el LCD.
	bcf		LCD_PinEnable			; Impide funcionamiento del LCD poniendo E=0.
	bcf 	LCD_PinRS				; Activa el Modo Comando poniendo RS=0.
	call	Retardo_20ms
	movlw	b'00110000'	
	call	LCD_EscribeLCD			; Escribe el dato en el LCD.
	call	Retardo_5ms	
	movlw	b'00110000'	
	call	LCD_EscribeLCD
	call	Retardo_200micros
	movlw	b'00110000'	
	call	LCD_EscribeLCD
	call	Retardo_200micros		; Este retardo es necesario para simular en PROTEUS.
	movlw	b'00100000'				; Interface de 4 bits.
	call	LCD_EscribeLCD
	call	Retardo_200micros		; Este retardo es necesario para simular en PROTEUS.
	
; Ahora configura el resto de los parámetros: 

	call	LCD_2Lineas4Bits5x7		; LCD de 2 líneas y caracteres de 5x7 puntos.
	call	LCD_Borra				; Pantalla encendida y limpia. Cursor al principio
	call	LCD_CursorOFF			; de la línea 1. Cursor apagado.
	call	LCD_CursorIncr			; Cursor en modo incrementar.
	return

; Subrutina "LCD_EscribeLCD" -----------------------------------------------------------
;
; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin
; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que
; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se
; vuelve a enviar este dato sin cambiarlo.

LCD_EscribeLCD
	andlw	b'11110000'				; Se queda con el nibble alto del dato que es el
	movwf	LCD_Dato				; que hay que enviar y lo guarda.
	movf	LCD_BusDatos,W			; Lee la información actual de la parte baja
	andlw	b'00001111'				; del Puerto B, que no se debe alterar.
	iorwf	LCD_Dato,F				; Enviará la parte alta del dato de entrada
									; y en la parte baja lo que había antes.
	bsf		STATUS,RP0				; Acceso al Banco 1.
	movf	TRISB,W					; Guarda la configuración que tenía antes TRISB.
	movwf	LCD_GuardaTRISB
	movlw	b'00001111'				; Las 4 líneas inferiores del Puerto B se dejan 
	andwf	PORTB,F					; como estaban y las 4 superiores como salida.
	bcf		STATUS,RP0				; Acceso al Banco 0.
;
	movf	LCD_Dato,W				; Recupera el dato a enviar.
	movwf	LCD_BusDatos			; Envía el dato al módulo LCD.
	bsf		LCD_PinEnable; Permite funcionamiento del LCD mediante un pequeño
	nop
	;CALL	Retardo_100ms   ;lo agrege yooooooo			
	bcf		LCD_PinEnable			; pulso y termina impidiendo el funcionamiento del LCD.
	bsf		STATUS,RP0				; Acceso al Banco 1. Restaura el antiguo valor en
	movf	LCD_GuardaTRISB,W		; la configuración del Puerto B.
	movwf	TRISB
	bcf		STATUS,RP0				; Acceso al Banco 0.
	return

; Subrutinas variadas para el control del módulo LCD -----------------------------------------
;
;Los comandos que pueden ser ejecutados son:
;
LCD_CursorIncr						; Cursor en modo incrementar.
	movlw	b'00000110'
	goto	LCD_EnviaComando
LCD_Linea1							; Cursor al principio de la Línea 1.
	movlw	b'10000000'				; Dirección 00h de la DDRAM
	goto	LCD_EnviaComando
LCD_Linea2							; Cursor al principio de la Línea 2.
	movlw	b'11000000'				; Dirección 40h de la DDRAM
	goto	LCD_EnviaComando
LCD_Linea3							; Cursor al principio de la Línea 3
	movlw	b'10010100'				; Dirección 14h de la DDRAM
	goto	LCD_EnviaComando
LCD_Linea4							; Cursor al principio de la Línea 4
	movlw	b'11010100'				; Dirección 54h de la DDRAM
	goto	LCD_EnviaComando
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.
LCD_PosicionLinea2					; Cursor a posición de la Línea 2, a partir de la
	iorlw	b'11000000'				; dirección 40h de la DDRAM más el valor del
	goto	LCD_EnviaComando		; registro W.
LCD_OFF								; Pantalla apagada.
	movlw	b'00001000'
	goto	LCD_EnviaComando
LCD_CursorON						; Pantalla encendida y cursor encendido.
	movlw	b'00001110'
	goto	LCD_EnviaComando
LCD_CursorOFF						; Pantalla encendida y cursor apagado.
	movlw	b'00001100'
	goto	LCD_EnviaComando
LCD_Borra							; Borra toda la pantalla, memoria DDRAM y pone el 
	movlw	b'00000001'				; cursor a principio de la línea 1.
	goto	LCD_EnviaComando
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. 

; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ------------------------------------
;
; "LCD_EnviaComando". Escribe un comando en el registro del módulo LCD. La palabra de
; comando ha sido entregada a través del registro W.  Trabaja en Modo Comando.
; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carácter ASCII introducido a
; a través del registro W. Trabaja en Modo Dato.
;
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 byte.
	call	LCD_EscribeLCD			; Se envía al visualizador LCD.
	btfss	LCD_PinRS				; Debe garantizar una correcta escritura manteniendo 
	call	Retardo_2ms				; 2 ms en modo comando y 50 µs en modo cáracter.
	call	Retardo_50micros

	return	

; Subrutina "LCD_CodigoCGROM" -----------------------------------------------------------
;
; A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la
; tabla CGROM del LM016L no coinciden con los códigos ASCII. Así por ejemplo, el código
; ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh.
;
; Esta subrutina convierte los códigos ASCII de la "Ñ", "º" y otros, a códigos CGROM para que
; que puedan ser visualizado en el módulo LM016L.
; 
; Entrada:	En (W) el código ASCII del carácter que se desea visualizar.
; Salida:	En (W) el código definido en la tabla CGROM.

LCD_CodigoCGROM
	movwf	LCD_Dato				; Guarda el valor del carácter y comprueba si es
LCD_EnheMinuscula					; un carácter especial.
	sublw	'ñ' 					; ¿Es la "ñ"?
	btfss	STATUS,Z
	goto	LCD_EnheMayuscula		; No es "ñ".
	movlw	b'11101110'				; Código CGROM de la "ñ".
	movwf	LCD_Dato
	goto	LCD_FinCGROM
LCD_EnheMayuscula
	movf	LCD_Dato,W				; Recupera el código ASCII de entrada.
	sublw	'Ñ' 					; ¿Es la "Ñ"?
	btfss	STATUS,Z
	goto	LCD_Grado				; No es "Ñ".
	movlw	b'11101110'				; Código CGROM de la "ñ". (No hay símbolo para
	movwf	LCD_Dato				; la "Ñ" mayúscula en la CGROM).
	goto	LCD_FinCGROM	
LCD_Grado
	movf	LCD_Dato,W				; Recupera el código ASCII de entrada.
	sublw	'º' 					; ¿Es el símbolo "º"?
	btfss	STATUS,Z
	goto	LCD_FinCGROM			; No es "º".
	movlw	b'11011111'				; Código CGROM del símbolo "º".
	movwf	LCD_Dato
LCD_FinCGROM
	movf	LCD_Dato,W				; En (W) el código buscado.
	return

; Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" --------------------------------
;
; Visualiza espacios en blanco.

LCD_LineaEnBlanco
	movlw	LCD_CaracteresPorLinea
	goto	LCD_EnviaBlancos
LCD_UnEspacioBlanco
	movlw	.1
	goto	LCD_EnviaBlancos
LCD_DosEspaciosBlancos
	movlw	.2
	goto	LCD_EnviaBlancos
LCD_TresEspaciosBlancos
	movlw	.3
LCD_EnviaBlancos
	movwf	LCD_Auxiliar1			; (LCD_Auxiliar1) se utiliza como contador.
LCD_EnviaOtroBlanco	
	movlw	' '						; Esto es un espacio en blanco.
	call	LCD_Caracter			; Visualiza tanto espacios en blanco como se
	decfsz	LCD_Auxiliar1,F			; haya cargado en (LCD_Auxiliar1).
	goto	LCD_EnviaOtroBlanco
	return

; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" --------------------------------------------
;
; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el
; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE".
;
; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero 
; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' visualiza "AE"
; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante).
;
; Utilizan la subrutina "LCD_Nibble" que se analiza más adelante.
;
LCD_Byte
	movwf	LCD_Auxiliar2			; Guarda el valor de entrada.
	andlw	b'11110000'				; Analiza si el nibble alto es cero.
	btfss	STATUS,Z				; Si es cero lo apaga.
	goto	LCD_VisualizaAlto		; No es cero y lo visualiza.
	movlw	' '						; Visualiza un espacio en blanco.
	call	LCD_Caracter
	goto	LCD_VisualizaBajo

LCD_ByteCompleto
	movwf	LCD_Auxiliar2			; Guarda el valor de entrada.
LCD_VisualizaAlto
	swapf	LCD_Auxiliar2,W			; Pone el nibble alto en la parte baja.
	call	LCD_Nibble				; Lo visualiza.
LCD_VisualizaBajo
	movf	LCD_Auxiliar2,W			; Repite el proceso con el nibble bajo.
;	call	LCD_Nibble				; Lo visualiza.
;	return

; Subrutina "LCD_Nibble" ----------------------------------------------------------------
;
; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble
; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos:
; - Si (W)=b'01010110', se visualizará "6". 
; - Si (W)=b'10101110', se visualizará "E". 
;
LCD_Nibble
	andlw	b'00001111'				; Se queda con la parte baja.
	movwf	LCD_Auxiliar1			; Lo guarda.
	sublw	0x09					; Comprueba si hay que representarlo con letra.
	btfss	STATUS,C	
	goto	LCD_EnviaByteLetra
	movf	LCD_Auxiliar1,W
	addlw	'0'						; El número se pasa a carácter ASCII sumándole
	goto 	LCD_FinVisualizaDigito	; el ASCII del cero y lo visualiza.
LCD_EnviaByteLetra
	movf	LCD_Auxiliar1,W
	addlw	'A'-0x0A				; Sí, por tanto, se le suma el ASCII de la 'A'.
LCD_FinVisualizaDigito
	goto	LCD_Caracter			; Y visualiza el carácter. Se hace con un "goto"
									; para no sobrecargar la pila.
```


----------



## pablofer (Jun 4, 2010)

hola sammaael quisiera preguntarte si tu libreria funciona con el pic16f877a??
yo conozco esta libreria es de un libro sobre el pic 16f84a y viene con cd con todas sus librerias pero alguna vez probe en el pic16f877a y no da y quisiera saber la tuya modificada va dar de antemano gracias , y si quieren le puedo publicar todas las librerias y la mayoria funca para el pic16f877a pero el elc y el de mensaje no me funcionan pero haber si alguien me la puede adaptar al otro pic ya intente mucho pero no me puedo dar cuenta de mis errores


----------



## lycans2005 (Jun 6, 2010)

Quiero controlar una LCD TFT de 7'' las que viene con los portaretratos, alguien sabe como se hace?


----------



## sammaael (Jun 10, 2010)

nop claro que no funciona ya que los puertos son diferentes asi como tammbien la posicion de algunos registros pero eso no deberia frenarte no es tan dificil modificar la libreria para lo que quieres


----------



## RUBITHZA (Jun 24, 2010)

mmm...holitas tengo una dudda en lcd que tengo es tc 1602d-02(R) no encuentro su hoja de datos como puedo ver si es compatible con el hitachi???


----------



## sammaael (Jun 24, 2010)

si, tambien tiene incorporado el hitachi


----------



## Robo (Jun 30, 2010)

hola gente, en estos dias estaba buscando cosas y me encontre un telefono, no lo necesitaba asi qu lo deshuese jeje, me encontre con que tenia una lcd, que funcionaba y se la saque,lo que pasa es que no tiene ni 14 ni 16 pines, tiene 15, y he visto que las que tienen iluminacion tienen 16 y las que no 14, entonces como puedo conectar esta pantalla??
PD: ya tengo el pic programado esperando la pantalla
gracias


----------



## sdel (Jul 21, 2010)

Hola amigos, vine a postear mi problema y me encontre con este tema que me viene al pelo...
estoy tratando de hacer funcionar mi lcd, es marca casil y por lo que dice el datasheet tiene el hitachi 44780 y el conexionado es igual que el lm016 que usa el libro del pic16f84 el cual estoy estudiando, adjunto datasheet del lcd.
el problema es que quiero hacerlo funcionar para el proyecto de un temporizador, es el que esta en el libro

http://www.pic16f84a.org/index.php?option=com_content&view=article&id=52&Itemid=95

utilizo el programa y rutina del libro y no logro ver nada en el lcd, solo se ve una linea mostrando las matrices enteras y la otra linea en blanco.

por comentarios mas arriba dice que no se inicializa bien, yo pregunto:
si el lcd que esta en el libro el lm016 usa el hitachi 44780 y el que yo uso tambien, los tiempos de inicializadcion no deberian ser iguales?
tendria que modificar las rutinas del manejo del lcd?
si alguien monto ese proyecto le andubo bien? saludos


----------



## sdel (Jul 22, 2010)

ya lo hice andar, no tenia conectado el reset del pic a 5v jeje que pavo.


----------



## elado (Jul 27, 2010)

hola!! alguien tiene una libreria para controlar LCD q funcione con el pic16f877


----------



## albertmecatronic (Jul 27, 2010)

hola elado mmmm...
 podrias especificar libreria de que ???

algun simulador , compilador etc 
explicate mejor para que te podamos echar la mano ok  kuidate

alguien  podria ayudarme::

tengo que mostrar 2 mensajes en una lcd , la lcd la estoy controlando con un pic 16f877 realice un programa para ver que la lcd  funcionara  programandole algunos mensajes y me corrio bn.  el problema es condicionar los mensajes es decir 

pulsador cerrado=  ACTIVO
pulsador abierto=   INACTIVO

NECESITO CONDICIONAR ESOS 2 MENSAJES, EL INTERRUPTOR LO TENGO CONECTADO EN RB0, HE INTENTADO CON LA CONDICION IF PERO P NO PUEDO VER NADA   NECESITO QUE ALGUIEN ME DIGA COMO USAR  LA CONDICION IF  ESPERO ME PUEDAD AYUDAR  MUCHAS GRACIAS.


----------



## elado (Jul 27, 2010)

Si una libreria en asm para el mplab, algo como las que vienen en el cd del libro 16f84,pero para el 16f877?


----------



## Meta (Jul 27, 2010)

elado dijo:


> Si una libreria en asm para el mplab, algo como las que vienen en el cd del libro 16f84,pero para el 16f877?



Adaptalas del 16F84 al 16F877A. Se recomienda el 16F887.


----------



## nietzche (Jul 28, 2010)

de casualidad alguien sabe que valor tienen los registros de proposito general en su estado inicial ?


----------



## jccelular12 (Ago 31, 2010)

buenas tardes lo q yo estoy buscando  es conectar un pic 16f628 a un lcd 2x16
y visualisar la informacion q reciba por puerto serial
saludos a todos


----------



## Meta (Ago 31, 2010)

Aquí puedes poner un ejemplo.

http://www.pic16f84a.org/index.php?...w=article&id=66&Itemid=87#Proteus_Capitulo_13

Saludo.


----------



## Rijiru (Ago 31, 2010)

jccelular12 dijo:


> buenas tardes lo q yo estoy buscando es conectar un pic 16f628 a un lcd 2x16
> y visualisar la informacion q reciba por puerto serial
> saludos a todos


 


 Saludos, disculpa si es en CCS ya intentaste usar

#DEFINE use_portb_lcd TRUE

 La definicion anterior sirve para conectar el puerto B en el LCD 16x2.

Saludos


----------



## victormanuel12 (Sep 13, 2010)

Primero de todo, buenas tardes a todos! Escribo para pedir ayuda a algun buen samaritano que me puedo echar una mano. Soy novato en el tema de los PICs. Estoy siguiendo un libro sobre el compilador C CCS y Simulador Proteus. He metido mi pregunta aqui, y pido mil disculpas si no es el lugar apropiado. Mi pregunta es la siguient:
Estoy realizando un circuito con el PIC16F876 y un LCD LM016L. Tiene dos pulsadores y tres leds. El lcd debe mostrar un menu de 3 funciones. Un pulsador debe seleccionar una de los 3 y el otro seleccionandolo. Cada una de las funciones simplemente es encender uno de los leds. Mi problema es que cuando compilo el archivo.c para hacer el archivo.h que le meto al PIC, me da error, pero en el archivo lcd.c

Os copio ambos, y si alguien ve el fallo, por favor, hacedmelo saber. Tened en cuenta que soy super novato. Gracias de anticipado.


```
#include <16F876.h>
#fuses XT, NOWDT
#use delay (clock=4000000)
#include <lcd.c>
#use standard_io(C)
#use standard_io(A)
enum funciones {med,cal,ini};

void medir(void){
   output_toggle(pin_C0);}
   
void calibrar(void){
   output_toggle(pin_C1);}
   
void inicializar(void){
   output_toggle(pin_C2);}
   
void run_func(int numfunc){
   switch(numfunc){
      case med:
         medir();
         break;
      case cal:
         calibrar();
         break;
      case ini:
         inicializar();
         break;
   }
}

void main(){
   char item;
   char n_menus=3;
   lcd_init();
   
   while(1){
      if(input(PIN_A0)==1){
         item++;
         delay_ms(300);
         lcd_putc('\f');}
      
      if(item>(n_menus-1)){
         item=0;}
      
      switch(item){
         case 0:
            lcd_gotoxy(1,1);
            printf(lcd_putc,"MEDIR");
            lcd_gotoxy(1,1);
            break;
         case 1:
            printf(lcd_putc,"CALIBRAR");
            lcd_gotoxy(1,1);
            break;
         case 2:
            printf(lcd_putc,"INICIALIZAR");
            lcd_gotoxy(1,1);
            break;
      }
      
      if(input(PIN_A1)==1)
         {delay_ms(200);
         run_func(item);}
   }
}



///////////////////////////////////////////////////////////////////////////
////                             LCDD.C                                ////
////                 Driver for common LCD modules                     ////
////                                                                   ////
////  lcd_init()   Must be called before any other function.           ////
////                                                                   ////
////  lcd_putc(c)  Will display c on the next position of the LCD.     ////
////                     The following have special meaning:           ////
////                      \f  Clear display                            ////
////                      \n  Go to start of second line               ////
////                      \b  Move back one position                   ////
////                                                                   ////
////  lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)    ////
////                                                                   ////
////  lcd_getc(x,y)   Returns character at position x,y on LCD         ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2007 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
// #define use_portb_lcd TRUE


struct lcd_pin_map {                 // This structure is overlayed
           BOOLEAN enable;           // on to an I/O port to gain
           BOOLEAN rs;               // access to the LCD pins.
           BOOLEAN rw;               // The bits are allocated from
           BOOLEAN unused;           // low order up.  ENABLE will
           int     data : 4;         // be pin B0.
        } lcd;


#if defined use_portb_lcd
   //#locate lcd = getenv("sfr:PORTB")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf81
   #else
    #locate lcd = 6
   #endif
   #define set_tris_lcd(x) set_tris_b(x)
#else
   //#locate lcd = getenv("sfr:PORTD")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf83
   #else
    #locate lcd = 8
   #endif
   #define set_tris_lcd(x) set_tris_d(x)
#endif

#ifndef lcd_type
#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines
#endif

#define lcd_line_two 0x40    // LCD RAM address for the second line


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.


                             // The following are used for setting
                             // the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in



BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}


void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}


void lcd_send_byte( BYTE address, BYTE n ) {

      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}


void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}


void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;

   if(y!=1)
     address=lcd_line_two;
   else
     address=0;
   address+=x-1;
   lcd_send_byte(0,0x80|address);
}

void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}

char lcd_getc( BYTE x, BYTE y) {
   char value;

    lcd_gotoxy(x,y);
    while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}
```


----------



## sammaael (Sep 13, 2010)

cual es el error que te advierte?


----------



## victormanuel12 (Sep 13, 2010)

3 errores, en las lineas 91, 103 y 133, el mismo:
Undefined identifier --set_tris_d

nadie me puede echar una mano? falta informacion o algo?


----------



## pablofer (Sep 14, 2010)

hola compañero de la electronica yo tenia el mismo problema con el pic16f877a y tengo el libro que estas estudiando, lo que me recomendaron en el foro fue que revisara la alimentacion fijarme bien los pines de reloj de reset en en fin cosas que parecen triviales pero descubri que solo se veia matrices negritas en el lcd por 2 razones :
1 puede ser que tu programa no este bien grabado en el pic o que el pic ya este mal , tambien puede ser que el reloj del pic no este funcoinando debido a mala coneccion del protoboard con los componentes, te aconsejo que revises la conectividad de tu proto con los componentes.
2 podria ser que las conecciones del pic con el lcd no sean con los pines correctos, o que tu grabador de pics tenga algun defecto.
en realidad en mi caso era por mala coneccion en el protoboard tube que probar en 4 o 5 protos y recien funciono.
yo personalmente probe cada uno de los programitas del libro con el pic16f84a y te puedo asegurar que funcionan ala perfeccion. para que estes seguro de los programas carga los archivos .HEX del cd que viene con el libro   :estudiando:


----------



## sammaael (Sep 14, 2010)

el error esta en la libreria yo use otra y funciono bien osea almenos compila....
aca dejo la libreria

```
///////////////////////////////////////////////////////////////////////////
////                             LCD.C                                ////
////                 Driver for common LCD modules                     ////
////                                                                   ////
////  lcd_init()   Must be called before any other function.           ////
////                                                                   ////
////  lcd_putc(c)  Will display c on the next position of the LCD.     ////
////                     The following have special meaning:           ////
////                      \f  Clear display                            ////
////                      \n  Go to start of second line               ////
////                      \b  Move back one position                   ////
////                                                                   ////
////  lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)    ////
////                                                                   ////
////  lcd_getc(x,y)   Returns character at position x,y on LCD         ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////
//
// As defined in the following structure the pin connection is as follows:
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.
//
// Un-comment the following define to use port B
 #define use_portb_lcd TRUE
//
//
struct lcd_pin_map {                 // This structure is overlayed
           BOOLEAN enable;           // on to an I/O port to gain
           BOOLEAN rs;               // access to the LCD pins.
           BOOLEAN rw;               // The bits are allocated from
           BOOLEAN unused;           // low order up.  ENABLE will
           int     data : 4;         // be pin B0.
        } lcd;
//
#if defined(__PCH__)
#if defined use_portb_lcd
   #byte lcd = 0xF81                   // This puts the entire structure
#else
   #byte lcd = 0xF83                   // This puts the entire structure
#endif
#else
#if defined use_portb_lcd
   #byte lcd = 6                  // on to port B (at address 6)
#else
   #byte lcd = 8                 // on to port D (at address 8)
#endif
#endif
//
#if defined use_portb_lcd
   #define set_tris_lcd(x) set_tris_b(x)
#else
   #define set_tris_lcd(x) set_tris_d(x)
#endif
//
#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40    // LCD RAM address for the second line
//
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.
//
                             // The following are used for setting
                             // the I/O port direction register.
struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in
//
BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}
//
void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}
//
void lcd_send_byte( BYTE address, BYTE n ) {
      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}
//
void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}
//
void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;   
  if(y!=1)
    address=lcd_line_two;
  else
    address=0;
  address+=x-1;
  lcd_send_byte(0,0x80|address);
}
//
void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}
//
char lcd_getc( BYTE x, BYTE y) {
   char value;
    lcd_gotoxy(x,y);
    while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}
```

saludos y paciencia que la ayuda tarda pero llega


----------



## javierdavid2006 (Sep 15, 2010)

Alguien sabe que lcd a color se puede usar con el pic 16f877a usando el ccs


----------



## jairosaw (Sep 28, 2010)

Gente del foro q tal!!

He manejado un poco los LCD 2x16 , 2x20 y ahora 4x 20, y realmente quisiera manejar las rutinas para crear caracteres especiales, o ejemplo crear una sola LETRA  del tamaño de las 4 filas por ejemplo.


----------



## javierdavid2006 (Oct 2, 2010)

Hola tengo una pregunta de GLCD, yo estoy usando elGLCD jhd12864e, y con el pic 16f877a me funciona de maravilla sea de 4Mhz o 20 Mhz el cristal, pero cuando uso el 18f452 a 20mhz la imagen me aparece comida, como si algunos pixeles no se activan, pero esto no sucede a 4 Mhz, por favor expliquenme lo que esta pasando, mi programacion es en CCS


----------



## javierdavid2006 (Oct 16, 2010)

Hola a todos, tengo un problema y es que quiero mostrar una conversion  analogia a digital en una glcd de controlador ks0108 realizado en ccs de  pcw, pero no se como poner la variable de voltaje en el glcd, para los  textos fijos no tengo problemas.

Gracias a todos.


----------



## fey116 (Oct 19, 2010)

hola a todos soy nuevo en este foro espero que me ayuden con este problema

Es nesesario que se conecte el pin de reset del pic para que funcione el lcd te envio la imagen porque yo lo arme en un protoboard y no  funciona solo el lcd se prende sale como cuadritos pequenos pero no sale el texto ayuda por favor










MaMu dijo:


> *
> Rutinas con PIC micro
> 
> Aqui en este thread he apartado las rutinas y esquemas necesarios para el manejo de dispositivos tipicos en el area digital, y muy utilizado en el ámbito de la Domotica.
> ...


----------



## serra2310 (Oct 21, 2010)

Se agradece el material! Me sirvió mucho para empezar el proyecto que estoy realizando!


Saludos!!!


----------



## marcelo2112 (Oct 23, 2010)

Hola compa, tengo un problema con un LCD fdcc1602g, el cual me muestra solo cuadritos al encenderlo, pero cuando desconecto la fuente, me muestra el texto como deberia ser antes de apagarse.  Que puede ser?Gracias


----------



## javierdavid2006 (Oct 23, 2010)

Hola victormanuel12, yo tenia el mismo problema con esa libreria y despues vi, que tenia que descomentar (quitar las lineas diagonales) al comentario //#define use_portb_lcd TRUE, tal como dice el libro y de ahi, me funciona a la maravilla.


----------



## el-rey-julien (Oct 23, 2010)

marcelo2112 dijo:


> Hola compa, tengo un problema con un LCD fdcc1602g, el cual me muestra solo cuadritos al encenderlo, pero cuando desconecto la fuente, me muestra el texto como deberia ser antes de apagarse.  Que puede ser?Gracias



revisa  el   terminal del contraste  del  lcd ,la   mayoría tiene un  pre-set para regularlo o   una resistencia de  330  ohm y un capacitor electrolitico ,si  ese terminal  lo pones a  masa ,solo se ven   cuadritos ,si  no  le pones la  masa no se  ve nada
es  el terminal    numero   3  el   contraste ,proba ponerle una  resistencia al  negativo ,o sea  desde  la   patita   numero 3  a negativo


----------



## marcelo2112 (Oct 24, 2010)

Gracias, eso era todo. Como siempre veo en las simulaciones de proteus que lo conectan a masa, yo tambien lo mande a masa. Ahora con una r de 1k anda perfcto.


----------



## EGIST (Nov 20, 2010)

Buenas, tengo un problema no se si alguien me puede colaborar, tengo que transmitir datos de un teclado matricial 4x4 hacia un LCD usando un PIC18F4550 en formato assembler, alguien podria colaborarme, es urgente, muchas gracias


----------



## COSMICO (Dic 2, 2010)

Hola a todos.
tengo un problemilla.
resulta que tengo dos lcd uno de referencia..QY162A y otro EL1602A.
Trabajando con la libreria del ccs c, solo consigo que me funcione el primero
pero al colocar el otro lcd no sale nada,,QY162A PERFECTO. EL1602A nada
Estoy trabajando a cuatro bits  y el bendito lcd nada que arranca, las referencia de los controladores de cada uno, no la se, son de esos chips inyectados que no traen ref alguna; ¿ a alguien le ha pasado?
Necesito estregar este trabajo mañana. y preciso con este lcd.  El profe, me lo puso de penitencia..
Gracias por su ayuda


----------



## Fortivo (Dic 2, 2010)

Mamu'' realmente imprecionante, llevo tiempo guardando pantallas de camaras de fotos digitales, de impresoras digitales , etc etc, pero cada vez que busco sus datashet con su codigo que trae no me sale nada , no encuentro nada para saber como se conecta cada patillaje de su cinta.. y es una pena, tengo pantallas de buena resolucion que podria hacer grandes proyectos con ella... 

saludos amigo y sige asi ¡¡


----------



## Omar266 (Dic 8, 2010)

Hola, soy nuevo en el tema de los LCD, aunque con la informacion recopilada de este foro y otros. He logrado hacer funcionar mi LCD 2x16. En 8 y 4 Bits,con una y dos líneas, con movimiento y sin el. ahora deseo crear mis propios caracteres, he encontrado algunos generadores de caracteres. Mi pregunta es: cuando creo y escribo mi caracter en el CGRAM, este queda grabado para siempre o cada vez que lo voy a utilizar lo tengo que volver a grabar. Muchas gracias


----------



## el-rey-julien (Dic 8, 2010)

julien dijo:
			
		

> omar  te recomiendo el uso de librerias,busca el libro  pic16f84 elarchivo  lcd.inc ay lo explica muy bien


Su majestad ha hablado con fuerza de {ley|norma|decreto|mandato|resolución|conciliación }, notifíquese,[ publíquese,] comuníquese y/o archívese. y la firma es lo amarillo de mas abajo.
saludos de su majestad ,rey de todas las cosas  incluido el lcd


----------



## Omar266 (Dic 10, 2010)

Muchas gracias por su ayuda, logre crear mis primeros caracteres y mostrarlos en la LCD,  encontré un articulo http://www.ucontrol.com.ar/wiki/index.php?title=Usando_LCDs
en el cual dice “La única diferenciación que existe entre el uso de la tabla de caracteres de ROM y los caracteres generados en CGRAM es que estos últimos no quedan grabados en el display, ya que es memoria volátil, por lo tanto deberán ser cargados cada vez que se inicializa el display.”

Mil gracias


----------



## davilillo89 (Dic 22, 2010)

Hola a todos. 

Para mi pregunta aprovecho esta hebra que trata sobre el LCD. Necesito hacer un proyecto en el que he de programar un PIC en C y, para comenzar por el principio, necesito que al inicio se muestre la fecha y hora actual (entre otras cosas, pero el resto sí sé hacerlas). Pues no sé cómo podría hacerlo. Para mostrar la fecha y hora en el LCD, empleo el PCF8583, pero al programarlo tengo que inicializar a unos ciertos valores. La pregunta es cómo hacer para que esa inicialización se extraiga de la fecha y hora actuales en el momento en el que se ejecuta el programa....

De no conseguirlo tendré que recurrir a que se me pida por teclado matricial que el usuario teclee la fecha y hora actuales, pero quedaría mejor de la otra forma.

Espero que hayáis entendido mi pregunta y muchas gracias!


----------



## COSMICO (Dic 22, 2010)

Por que no usas ds1307 hay mucha informacion al respecto en la red.
Es un reloj calendario en tiemnpo real con interfaz i2c, y existen muchos ejemplos y librerias en la red.


----------



## davilillo89 (Dic 22, 2010)

Pues porque en clase habíamos probado con el que yo puse anteriormente...de todas formas no creo que haya problema con usar el que me dices...buscaré cosas por internet a ver qué encuentro...


----------



## Meta (Dic 22, 2010)

Aquí hay con código fuente y todo del DS1307.
http://www.pic16f84a.org/index.php?...w=article&id=66&Itemid=87#Proteus_Capitulo_24


----------



## Unikfriend (Dic 22, 2010)

Davilillo, cual fue el RTC que probaste en clase?


----------



## davilillo89 (Dic 22, 2010)

Pues probamos con el reloj PCF8583, pero he visto que teníamos que poner en el código fuente una fecha y hora de inicialización, y a partir de ahí ya sí contaba como un reloj. Entonces sería un poco engorroso tener que introducir por teclado matricial la fecha y hora actual cada vez que queramos ejecutar el proyecto, de ahí que busco algo que lo muestre en el LCD automáticamente actualizado. No he buscado demasiado, quizás con el PCF8583 también se puede hacer como con el ds1307, pero no estoy tan seguro (quizás haciendo uso de memoria EPROM para coger los valores de inicialización, o no se me ocurre otra cosa...). 

Un saludo


----------



## Unikfriend (Dic 22, 2010)

Davilillo, si es algo gorroso si hasta parace que lo hacen a proposito jijiji, pero así son todos los electrodomesticos, despertadores, VCR, microondas, estufa y lavadora; por eso es muy comun verlos que parpadean --:--; jijijij

el PCF8583, no lo conozco... pero todos los RTC deben tener su propia alimentación para guardar la hora o en su defecto un supercap que es un capacitor mas grandote que puede mantener trabajando al RTC por unas dos semanas. Tienes esquematico o diagrama de tu aplicación?

Saludos


----------



## duile (Dic 22, 2010)

tengo un LCD de un motorola c215 a color y quiero saber si la puedo controlar con algun pic o desde mi pc...


----------



## Unikfriend (Dic 22, 2010)

Duile, tienes los datos del display resolution y bits de color?


----------



## davilillo89 (Dic 23, 2010)

Unikfriend gracias por la respuesta...pues sí tengo el esquemático pero esto que te comento es una mínima parte de lo que tengo que realizar (solo el principio). Sabiendo lo que me has dicho, lo que haré simplemente es cada vez que inicio introducir desde el teclado matricial la fecha y hora actuales y punto (eso ya sí se cómo hacerlo). De todas formas me surgirán nuevas preguntas. Por ejemplo, una de ellas es la siguiente: necesito hacer un sistema de calentamiento de agua (según la temperatura que nosotros deseemos a la que esté el agua). ¿Eso cómo puedo hacerlo? Tengo la idea de que lo suyo sería con un motor, pero no se cómo sería el diagrama en proteus ni como podría hacerlo....esta mañana ese es mi reto, así que espero respuestas, o que la siguiente respuesta sea la mía indicando que ya lo he conseguido.

Muchas gracias y un saludo!


----------



## Unikfriend (Dic 23, 2010)

Hi davilillo!, sería más facil si describieras tu proyecto completo;
por ejemplo cuantos litros de agua deseas calentar? y en cuanto tiempo? 
cual es limite de temperatura superior?
y cual es uso que se leva dar al sistema?
teniendo eso se pueda buscar la mejor alternativa...


Saludos...


----------



## davilillo89 (Dic 23, 2010)

Hola unikifriend! Pues no quise dejar todo el planteamiento del proyecto porque tampoco es una cosa muy sofisticada, aunque no por eso no significa que tenga ciertas dudas, porque empecé ayer a realizar el proyecto y al princpio siempre cuesta estructurarlo. Se trata de diseñar un sistema electrónico que controle la depuración y temperatura de una piscina climatizada, y hemos de programar las horas de encendido y apagado de la depuradora y los valores de temperatura y turbidez, así como la concentración de cloro del agua. No se nos exige un tiempo de calentamiento del agua, y tampoco se nos indica cuántos litros hemos de llenar. Sí he de decirte que una de las mejoras del proyecto es añadir un control de llenado de la piscina, con un sensor de medida del nivel de agua y la actuación sobre una electroválvula de entrada de agua, aunque esto no sé cómo puedo hacerlo (y tampoco me he parado aún a pensarlo, prefiero hacer las cosas obligatorias). Entonces por eso pregunté por cómo hacer el calentamiento del agua de la piscina (no importa escoger una forma más lenta o menos optimizada, puesto que no tenemos un tiempo límite). Espero haberme explicado bien.

Un saludo y gracias por tus respuestas!


----------



## Unikfriend (Dic 23, 2010)

Hola de nuevo davilillo;

Pues un dato muy importante es el volumen de agua y el otro es la temperatura maxima a la que deseas calentarlo. Sin esos datos va ser muy dificil que se seleccione la opción más optima.

Cuando hablabas de calentar el agua en tu anterior post yo estaba imaginandome un cafetera jijiji o casi un calentador de agua para la ducha... no hubiera pensado que se trataba de una piscina.

y este proyecto es propio o de tu licenciatura?


----------



## duile (Dic 23, 2010)

Unikfriend dijo:


> Duile, tienes los datos del display resolution y bits de color?



en la lcd dice 
(PARTE ODM, 3330500083 MDL LCD)
(Mfg P / N	3330500083)
resolución de (65x96 píxeles)
tiene 22 pines
pero no necesito saber para que sirven cada pins


----------



## Unikfriend (Ene 4, 2011)

Hi Duile!...
Con solo este numero va hacer difícil encontrar la spcecs, debido a que es un componente ODM.  El Display tiene circuitos integrados?  El controlador debe tener la marcar del manufacter como Toshiba,  Seiko o Epson.


----------



## Cesiir (Ene 15, 2011)

hola foreros, que tal?? estoy realizando un proyecto para el instituto, y estoy haciendo un termómetro, y quiero mostrar la temperatura en el lcd. Pues bien, de momento solo veo la linea de arriba, la del contraste, y no se exactamente si le llegan datos al lcd,creo que si... entonces pongo mi programa a continuacion para ver si me podéis echar una mano y lográis ver algo que pueda modificar.
Cuando pruebo el lcd aun no le conecto el sensor de temperatura lm35, y he probado otros programillas en plan mostrar un "hola mundo" y nada. MXAS GRACIAS


#include <18f4550.h>
#device adc =16
#fuses XTPLL,noMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV, PLL3,CPUDIV1,NOVREGEN,INTRC_IO
#use delay(clock=12000000)
#use standard_io(A)
#use standard_io(B)
#use standard_io(C)
#use standard_io(D)
#include <lcd.c>

void main()
{
long vtem=0;
int temp=0; //temperatura a mostrar en grados.

//setup_oscillator(OSC_4MHZ);
lcd_init();
setup_adc_ports(AN0||VSS_VDD); //Se configura el CAD.
setup_adc(ADC_CLOCK_INTERNAL);
//setup_counters(RTCC_INTERNAL,RTCC_DIV_2); //TIMER0: Clock Interno y Preescaler
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_oscillator(False);

while (TRUE)
{

set_adc_channel(0); //seleccion de canal cad.
vtem=read_adc(); //Se carga variable con el valor del cad.
temp=(vtem*5)/655.35; //Formula Para pasar de decimal a grados.


//printf(lcd_putc,"\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"vtem= %ld",vtem);
delay_ms(50);
lcd_gotoxy(1,2);
printf(lcd_putc,"TEMP: %d",temp);
delay_ms(50);
//delay_ms(6000);

}
}


----------



## duile (Ene 16, 2011)

Unikfriend dijo:


> Hi Duile!...
> Con solo este numero va hacer difícil encontrar la spcecs, debido a que es un componente ODM.  El Display tiene circuitos integrados?  El controlador debe tener la marcar del manufacter como Toshiba,  Seiko o Epson.



consegui otra LCD que en la parte de atras dice 
WD-X0908W
Career F15a94V-0


----------



## f0raster0 (Ene 20, 2011)

Amig@s quisiera me puedan echar una mano con lo siguiente..

Tengo un pic 16F887 y una LCD

Lo que deseo es mostrar el mensaje "Hola Mundo" en la LCD, al simular en proteus funciona con errores y en proto no veo nada pero el LCD está encendido mostrando cuadritos..

La LCD está conectada al puerto D y con comunicación de 4 bits

En Proteus:






[/URL][/IMG]

En protoboard tengo las siguientes conexiones:





[/URL][/IMG]

El código es el siguiente y agradeceré me puedan explicar lo que marque con "¿?"
Estoy usando CCS y compila perfecto..

#include <16f887.h>                      
#fuses XT,NOWDT,NOPROTECT,NOLVP           
#use delay (clock=4000000)               
#use fast_io(b)         //¿?                  
#use fast_io(c)         //¿?                
#INCLUDE "lcd.c"                         

void lcd_saludo_inicial(void);

void main(void) {

   #byte PORTB=0xF81  //¿?
   #byte PORTC=0xF82  //¿?
   #byte PORTD=0xF82 //¿?

   lcd_init();
   lcd_saludo_inicial();
}

void lcd_saludo_inicial(void) {
   Lcd_putc ("Hola Mundo");   //Escribo en la primera fila
   delay_ms(2000);                 //Espero dos segundos
   lcd_gotoxy(4,2);                //columna 4, fila 2
   Lcd_putc( "hi word..¡¡");       //Escribo en la segunda fila

}

Creo que mi problema está por el lado de hardware..


----------



## COSMICO (Ene 20, 2011)

colocaste en el protoboard, un reostato para ajustar el contraste
Entre el pin vee- tierra y 5volts?


----------



## f0raster0 (Ene 21, 2011)

mm nop.. ahora voy a probar aquello..( hoy logré encontrar uno de 10K)

lo que si he probado:

a) En LCD: Pin 16 a tierra; pin 15 a R=330Ω y luego Vcc, con Vee a GND
Muestra LCD azul, pero con cuadritos..

b) En LCD: Pin 16 a tierra; pin 15 a R=330Ω y luego Vcc, con Vee a R=1KΩ (o de 330Ω) y luego Vcc (5v)
Muestra LCD muy azul y sin cuadritos..

He probado con el potenciometro..
Con el potenciometro, puedo lograr llegar de LCD completamente azul a LCD con cuadritos y viceversa.. pero no he logrado ver el mensaje..

Continuando con la busqueda 
https://www.forosdeelectronica.com/f24/llave-electronica-pic-16f877-16637/

Creo que el problema es de conexiones y no logro ver donde esta..


----------



## COSMICO (Ene 21, 2011)

El tap central del pote al pin 3 del lcd
los extremos del pote, una a vss y el otro a vdd
mover el pote hasta encontrar el punto optimo
El pin 15 y 16, son para la luz de respaldo del lcd..
revisa que las conexiones de los pines 4,5y 6, esten bien con respecto a los pines del pic.


----------



## f0raster0 (Ene 21, 2011)

COSMICO, primero gracias por tu tiempo e idea..

pero puff¡¡ potenciometro está conectado a pin3 desde tap central y si, puedo regular bien la intensidad..

por el lado de las conexiones, diablos, creo tener todo correcto, he vuelto a revisar.. también continuidad pin por pin..

 en LCD pin1  a GND común con pic
 en LCD pin2  a Vcc común con pic
 en LCD pin3  a tap central de potenciometro
 en LCD pin4  a pic en puerto D1 del pic
 en LCD pin5  a pic en puerto D2
 en LCD pin6  a pic en puerto D0 del pic
 en LCD pin11 a pic en puerto D4 del pic
 en LCD pin12 a pic en puerto D5 del pic
 en LCD pin13 a pic en puerto D6 del pic
 en LCD pin14 a pic en puerto D7 del pic

 en LCD pin15 a R=330 y luego a Vcc
 en LCD pin16 a GND

ahora estoy culpando al oscilador.. aquí tengo dudas de nuevo..
el cristal que  estoy utilizando es de 4Mhz mm voy a ver si logro entender como utilizar el oscilador interno.. para descartar eso..

puff.. quizás por eso me gusta la electrónica.. finalmente era un tontera..

Me preocupe tanto del LCD, que al PIC no le llegaba Vcc o le llegaba pero con mal contacto, arme todo de nuevo y..

puedo ver:

Primera línea "Hola Mundo"

luego de unos segundo y en segunda línea "Hi Word"


----------



## COSMICO (Ene 21, 2011)

Ok me alegra


----------



## Lvcios (Feb 6, 2011)

Alguien ha usado PORTA en su totalidad para controlar el LCD? Yo lo he intentando con el pic16f628a y no puedo, desactive los comparadores, lo declaré como salida PORTA y nada. Adjunto el código por si ven algun detalle. Estoy usando mikroc.

```
void main() {
  CMCON = 0x07;
  TRISA = 0;
  Lcd_Config(&PORTA,0,1,2,7,6,4,3);
  Lcd_Init (&PORTA);
  Lcd_Cmd(Lcd_CLEAR);
  Lcd_Cmd(Lcd_CURSOR_OFF);
  Lcd_Out(1,1,"Lvcios Informatico");
}
```

Si ese mismo código lo usamos pero con PORTB y quitando el CMCON funciona de maravilla ¬¬


----------



## dukex (Feb 15, 2011)

Lvcios dijo:


> Alguien ha usado PORTA en su totalidad para controlar el LCD? Yo lo he intentando con el pic16f628a y no puedo, desactive los comparadores, lo declaré como salida PORTA y nada. Adjunto el código por si ven algun detalle. Estoy usando mikroc.
> 
> ```
> void main() {
> ...



ya revizaste las funciones del PORTA?? que este bien configurado el puerto??

saludos.


----------



## banistelrroy (Feb 17, 2011)

Hola a todos en el foro muchas gracias por las dudas que son despejadas a muchos de los integrantes de este foro pues aquí les traigo un resulta que tome un ejemplo de manejo del LCD del libro de Micro controladores Pic Basic - Carlos A Reyes que trabaja con el PIC16F628A y he realizado el ejemplo en el cual he adjuntado en libro explica detalladamente de cómo realizarlo pero al simularlo en proteus no funciona.
Algo importante este programa no configura los bits pertenecientes al LCD pues se dice que cuando no especificas la configuración este lo programa por defecto y el lcd lo reconoce como si estuviera conectado por defecto quedando asi :
BITS DEL LCD A0----A3/PROPORCIONALMENTE /D4…..D7 RS: A4 RW:GND E:RB3
Invoco a los miembros de este foro para solucionar este incoveniente
anexo la simulacion en proteus


----------



## salsero (Feb 20, 2011)

tiopepe123 dijo:


> Te repito lo mismo, haz la rutina leeeenta, asegurate que tanto el nivel alto como el bajo sea leeento.
> Hasta que no consigas que se iluminen las dos filas no habras inicializado correctamente la lcd.
> 
> 
> Despues ya subiras de vueltas...



Hola, tambien soy nuevo por aqui, resulta que el lcd no esta mostrando claramente los mensajes desde la izquierda hasta la mitad, de la mitad a la derecha los muestra bien, cuando muevo las conexiones para vrificar si esta haciendo buen contacto, se enciende la primera fila completa como si estubiera bueno el lcd, pero no se que le pasa, todo esta bien, la velocidad, las conexiones y no se, porque cuando probe por primera vez el lcd funciono perfecto, muchas gracias!


----------



## gusarielmanfredi (Feb 22, 2011)

Como hago para seleccionar modo 4 bits o 8 bits en ccs?


----------



## salsero (Feb 22, 2011)

tengo una duda mas, cuando voy a introducir varios mensajes, uno tras otro, en diferentes partes del programa, se me borra los anteriores o no salen bien, hablo del lcd, por ejemplo si escribo "mikroelctronica" y luego escribo otras palabras las siguientes no me aparecen bien, o estas se daña, sin haber aparecido, sera un problema de memoria como lo puedo solucionar?


----------



## jvcsd (Mar 6, 2011)

MaMu dijo:


> *
> Rutinas con PIC micro
> 
> Aqui en este thread he apartado las rutinas y esquemas necesarios para el manejo de dispositivos tipicos en el area digital, y muy utilizado en el ámbito de la Domotica.
> ...



le agradeceria si me envia una lista con los implementos necesarios a correo velez450@etb.net.co


----------



## ulimar7813 (Abr 2, 2011)

HOLA A TODOS DEL FORO, NECESITO AYUDA YO TAMBIEN CON LAS LIBRERIAS DE LCD EN PIC CCS NO ENTIENDO COMO DEVO CAMBIAR LOS PINES DEL LCD.

TENGO ESTE PROGRAMA Y QUIERO USARLO EN MI ENTRNADORA PERO NO PUEDO CONFIGURAR EL ARCHIVO DE LIBRERIA  
SE LOS PASO PARA QUIEN ME PUEDA AYUDAR.


ESTE ES EL MANUAL DE MI ENTRENADORA

Configuracion de LCD a 4 BITs

RB0 a RB3   datos 
RB4 RS
RB5 rw
RB6 E

Todo el ( Puerto B ) ademas de ser configurado directamente a LCD contiene disponibles 
de manera paralela a los LEDs desde RB0 a RB7.

Los leds estan seteados en dos partes RB0 a RB3 y RB4 a RB7 a negativo, por un jumper que puede ser levantado para disponer del HEADER y usar un protoboard externo, como entradas etc, independientemente.

Los pulsadores RA0 a RA3 contienen una resitencia pull up de 4k7 y capacitores de .1 para eliminar ruidos.

Las resistencias de los pulsadores RA0 y RA1 estan eliminadas opcionalemnte de fabrica de manera que al colocar los PRESET analogicos para desarrollar aplicaciones analogicas no compliquen su uso, de manera
que si se requiere tener estos pull up se alojan los presets en el centro, para poder usar digitalmente las entradas, si no fuere asi dispone de RA0 y RA1 normalmente para conversiones analogas en PICs como los 16F818. 

El reloj de tiempo real a 32khz esta directamente conectado a la linea de 28 y 40 dip para su uso.

La memoria Serial 24LC256 esta conectada directamente a la linea de 28 y 40 dip por SCK y SDK de esta linea de PIC.

El Max232 esta comunicado directamente a las señales RX y TX para la linea 28 y 40 DIP.

El reset es general para todas las lineas desde 18 a 40 dip.

El cristal general des de 4mhz.

El buzzer y o led PWM esta conectado y seteado segun se elija uno u otro por jumper a PWM RC2.

El sensor de temperatura es del tipo TC74   RC4 y RC3

La programacion puede ser via ISCP por RJ o por Header lineal.

La alimentacion puede ser por batteria 9v.

La alimentacion maxima 12v 500 ma.


TODOS LOS ZOCALOS PARA PIC DESDE 18, 28 Y 40 DIP, ESTAN COMUNICADOS DE MANERA PARALELA CON SUS CORRESPONDIENTES PORTS DE MANERA DE PODER USAR Y EMIGRAR DE MICRO SIN PROBLEMAS.


----------



## cristhian joan (Abr 5, 2011)

hola amigos les cuento mi problema tengo pic 16f628a lo programo lo instalo con mi display yj-162a y no me muestra nada no se cual es el problema y lo cargo en el proteus y de lujo corre q hago gracias este es mi codigo no se si el display tiene una configuracion especial


DEFINE LCD_DREG PORTB ' Indica que el Bus de datos estará conectado
' en el Puerto B.
DEFINE LCD_BITS 4 ' El bus de datos de la LCD será de cuatro bits.
DEFINE LCD_DBIT 0 ' Selección del Bit de inicio del puerto en el uC para el
' bus de datos de la LCD
DEFINE LCD_RSREG PORTA ' Indica al uC que el pin “RS” estará en el Puerto A
DEFINE LCD_RSBIT 0 ' “RS” estará conectado en RA0
DEFINE LCD_EREG PORTA ' Indica al uC que el pin “E” estará en el Puerto B
DEFINE LCD_EBIT 1 ' “E” estará conectado en RA1



Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
Pause 500
LCDOut $fe, 1 ' Limpia la pantalla
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut "* Pantalla LCD *"
LCDOut $fe,$C0, "* Alfanumerica *"
LCDOut $fe,$90, "* 1234567890 *"
LCDOut $fe,$D0, "* AaBbCcDdEeFf *"
Inicio:
GoTo Inicio ' Salta a la etiqueta inicio

end




gracias


----------



## el-rey-julien (Abr 5, 2011)

fijate en el error mas común ,,,el contraste del display ,si corre en proteus,tiene que funcionar 
saludos


----------



## norman sanchez (May 15, 2011)

hey, buenas noches a todos estoy realizando un proyecto y necesito de varias ayudas agradeceria mucho, ando haciendo un tablero digital en el que necesito varios displays de 12 voltios pero el micro funciona a 5 voltios quisiera si me pudieran colaborar como alimento o que solucion pudiera hacer en este caso ..... espero de su ayuda gracias ....


----------



## Unikfriend (May 17, 2011)

Hi norman,
creo que falta algo de informacion.
cuanta corriente consume cada display? cuantos displays son?
Y cuanta corriente consume la parte digital?
Vas a utilizar baterias o corriente AC?


----------



## spaijd (Jun 22, 2011)

por lo que me explicaron la libreria LCD.C funciona para el pic 16f877a pero nose con cual otro pic pueda funcionar


----------



## COSMICO (Jun 22, 2011)

La libreria puede ser utilizada con cualquier pic, es solo hacerle pequeñas reformas para poder acceder a cualquier puerto, para su control.


----------



## begahe (Ago 3, 2011)

tiopepe123 dijo:


> Te repito lo mismo, haz la rutina leeeenta, asegurate que tanto el nivel alto como el bajo sea leeento.
> Hasta que no consigas que se iluminen las dos filas no habras inicializado correctamente la lcd.
> 
> 
> Despues ya subiras de vueltas...



oye yo tengo un problema similar no logro ver nada en mi lcd aunque esta encendido totalmente no se ve nada


----------



## begahe (Ago 4, 2011)

el-rey-julien dijo:


> fijate en el error mas común ,,,el contraste del display ,si corre en proteus,tiene que funcionar
> saludos



oye como se hace lo del contraste no entiendo


----------



## Sofiia (Sep 2, 2011)

Alguien me puede ayudar con una rutina para usar lcd 16x4 para programar en asm con el pic16f877 =( ya q veo q la mayoria usa 16x2 y ese no me sirve... Gracias de ante mano


----------



## Chico3001 (Sep 2, 2011)

La rutina es exactamente la misma... solo cambian las direcciones a donde envias los datos... 

Linea 1: direcciones 00 a 0F
Linea 2: direcciones 40 a 4F
Linea 3: direcciones 10 a 1F
Linea 4: direcciones 50 a 5F


----------



## Meta (Sep 2, 2011)

Si quieres en ASM lo puedes descargar aquí.




LCD_4Lineas (7.77 kB)Manejo de LCD de 4 líneas 

Un saludo.


----------



## R-Mario (Sep 2, 2011)

Hola ola  una pregunta, relacionada al tema, Que tecnicas usan ustedes para controlar la LCD, resulta que tengo que controlar 4 display 7 segmentos, a la misma ves que senso un optoacoplador, y tengo que mostrar el dato numero en los 8 display y a su vez en la display, el problema viene cuando hago en envio de la info al display este tarda mucho y se nota el parpadeo en los de 7 segmentos, como solucionan ese problema, nota el dato sensado varia muy rapido, aunque trabajara a 8Mhz el problema esta en la LCD lo lenta que es, ya reduje al maximo los tiempos de espera


----------



## Chico3001 (Sep 2, 2011)

Casi seguro es problema de software... hay que ver como manejas las interrupciones o que te esta retrasando el muestreo en el display...


----------



## R-Mario (Sep 2, 2011)

Haaa pues lo que pasa es que hago varias calculos incluido divisiones enteres, cada vez que leeo el sensor, pero eso no consume mucho tiempo porque estoy trabajando a 8 Mhz el problema es cuando tengo que esperar a que las instrucciones del LCD terminen por ejemplo una instruccion de limpieza lleva casi 2 mS y


----------



## washimosfet (Nov 30, 2011)

holaaa a todos esto me pasa....


tengo en el pin3 conectado con toma central al potenciometro logarítmico, hice algo simple un mensaje" x"
y luego lcdout $fe,1
y luego el mensaje $lcdout $fe,$c0 " yyy"

Al rato de simularlo todo 10 en proteus, lo grabo en el pic y lo hago funcionar sirve si incluso se borra la pantalla, pero no logro ver nada por el contraste de los cuadros siempre están negros " ▓ ▓ ▓ ▓ ▓ ▓"  siempre me muestra así, no se como bajar el contraste de los caracteres ayudaaaaaaaa........


----------



## f0raster0 (Nov 30, 2011)

washimosfet dijo:


> holaaa a todos esto me pasa....
> 
> 
> tengo en el pin3 conectado con toma central al potenciometro logarítmico, hice algo simple un mensaje" x"
> ...



quizás te sirva leer el post #130 de este mismo hilo..


----------



## Kalamarus (Ene 3, 2012)

Queridos foreros, Necesito ayuda en proyecto con LCD LM016L y PIC 16f876.Es mi primer proyecto con LCD asi que ando algo perdido... Uso MPLAB IDE con HI-Tech ANSI C. Me es indiferente si es controlado por 4 bits o 8...
Me he hecho con una libreria "lcd.c" y con la "lcd.h" pues en todos los ejemplos que he visto, las usan, sobretodo para el PIC 16f877. Pero el compilador no me reconoce las instrucciones que le doy, y me da error al compilar.
Alguien pudiera decirme si...:

-Debo añadir alguna libreria más?
-Debo definir los puertos en las librerias? o en el mismo programa?
-Existe alguna sentencia que difiera para el manejo de estas librerias en CCS o en HI-tech?
-En el caso que lo hiciera entrando los codigos "manualmente"...debo seguir el orden tal como están en el post #1? Debo dejar el pin E del LCD en estado alto o resetearlo para cada instrucción?

Gracias de antemano.


----------



## Rijiru (Ene 6, 2012)

Buen dia kalamarus, actualmente transcribi la libreria de CCS "LCD.c" a Hight-Tech. Si te interesa, mandame un INBOX y te envio el driver. Lo adapte para PIC16F628A.


 Saludos


----------



## outfiel (Ene 21, 2012)

Hola que tal a todos no se si me puedan ayudar acerca de un LCD Hitachi controlado por un PIC 16F628A mi problema es que soy novato en esto y aun no me queda muy claro el uso de las librerias y menos se como utilizarlas no se si son .lst o . inc e encontrado varios programas .asm que simulan un programa sencillo pero hacen uso de librerias como LCD_Inicializa o LCD_4bit y como yo no tengo me marca demasiados errores e descardo varias librerias pero aun asi me marca errores no se si yo las tengo que hacer o que es lo que esta mal.  Espero y puedan ayudarme de antemano Gracias.


----------



## D@rkbytes (Ene 21, 2012)

outfiel dijo:


> Hola que tal a todos no se si me puedan ayudar acerca de un LCD Hitachi controlado por un PIC 16F628A mi problema es que soy novato en esto y aun no me queda muy claro el uso de las librerias y menos se como utilizarlas no se si son .lst o . inc e encontrado varios programas .asm que simulan un programa sencillo pero hacen uso de librerias como LCD_Inicializa o LCD_4bit y como yo no tengo me marca demasiados errores e descardo varias librerias pero aun asi me marca errores no se si yo las tengo que hacer o que es lo que esta mal.  Espero y puedan ayudarme de antemano Gracias.


Saludos.
Espero que estos ejemplos te puedan servir como un comienzo.
1 esta en Ensamblador y no usa librerias, los otros 2 estan en PIC Basic
Suerte.


----------



## outfiel (Ene 21, 2012)

Muchas Gracias Darkbytes me fue de gran ayuda los programas que me hiziste favor de pasar exelente y como una pregunta adicional si no es molestia crees que se pueda hacer un carro seguidor de linea y que contenga el display o es mucho es que es un proyecto que tengo que entregar pero yo creo que no por que ni el display pude hacer acaso sera bastante dificil que opinas pero de todas formas muchas gracias me fue de gran ayuda.


----------



## D@rkbytes (Ene 22, 2012)

outfiel dijo:


> Muchas Gracias Darkbytes me fue de gran ayuda los programas que me hiziste favor de pasar exelente y como una pregunta adicional si no es molestia crees que se pueda hacer un carro seguidor de linea y que contenga el display o es mucho es que es un proyecto que tengo que entregar pero yo creo que no por que ni el display pude hacer acaso sera bastante dificil que opinas pero de todas formas muchas gracias me fue de gran ayuda.


Saludos.
Pues mira, sobre el carro seguidor de líneas ya hay varios temas en este foro.
Así que puedes ver los proyectos y comentarios al respecto por aqui.
Y sobre la implementación del LCD conjuntamente con el proyecto
ya tienes los ejemplos de uso del LCD, solo es cuestión de que lo adaptes a tu programa.
Suerte y hasta luego.


----------



## Meta (Ene 23, 2012)

Aquí hay ejemplos y librerías fáciles.

http://www.pic16f84a.org/proteus.html#Proteus_Capitulo_13

Saludo.


----------



## nestor07 (Abr 27, 2012)

Buenas amigos. Necesito por favor de su gran ayuda. Estoy haciendo un proyecto el cual contempla mostrar una serie de mensajes via LCD usando el pic 16F84. Probé las rutinas que hay por ahí en asembler y me funciona bien, con la excepción de que sólo puedo colocar mensajes en la primera línea. El lcd que estoy usando es compatible con el hitachi 4478. El LCD que estoy usando es específicamente el modelo TC1602A-09T. Adjunto coloco la guía que use para realizar el programa. Necesito poder colocar mensajes en la otra línea para hacer mas eficiente y mejor presentable mi proyecto. Ayudenme!!!


----------



## DJ T3 (Abr 27, 2012)

Quizás no iniciaste bien el LCD...

Por qué no pones el programa que usas, para ver si tiene un error, o algo.

Busca en el foro, hay muchísimos datos y códigos que te pueden servir..

Saludos


----------



## D@rkbytes (Abr 27, 2012)

Si el LCD no estubiera bien inicializado no se vería nada.
Lo que tiene que hacer es pasar a la línea 2 escribiendo la dirección inicial.

Por ejemplo para los LCD que son como el Hitachi 44780
La primer línea empieza en la posición 80 hasta la 8F (16 espacios)
La segunda línea empieza en la posición C0 hasta la CF (16 espacios)

Así que para pasar a la línea 2 hay que escribir en la posición C0 con algo así.

    movlw    C0h 
    call posicion
    movlw 'L'
    call    escribe
    movlw    C1h 
    call posicion
    movlw 'C'
    call    escribe
    movlw    C2h 
    call posicion
    movlw 'D'
    call    escribe

Osea que tienes que escribir de la posición C0 en adelante hasta CF para pasar a la segunda línea.

Saludos.


----------



## Omar266 (Abr 28, 2012)

Pues tiene que indicarle que que linea desea :
Para la linea 1
    MOVLW   b'10000000' 
    GOTO    LCD_COMANDO
Para la linea 2
    MOVLW   b'11000000' 
    GOTO    LCD_COMANDO 

En mi caso LCD_COMMANDO esta en el archivo inc

Espero le sirva de algo


----------



## DJ T3 (May 2, 2012)

Darkbytes dijo:


> Si el LCD no estubiera bien inicializado no se vería nada.



¿Estás seguro?, eh leído en el foro que si no lo inicias bien (osea, le indicás que vas a "trabajar", con 2 líneas), solo te reconoce 1....



Darkbytes dijo:


> Lo que tiene que hacer es pasar a la línea 2 escribiendo la dirección inicial.



Exacto, habría que ver en qué lenguaje trabaja...

Saludos


----------



## D@rkbytes (May 2, 2012)

DJ T3 dijo:


> ¿Estás seguro?, eh leído en el foro que si no lo inicias bien (osea, le indicás que vas a "trabajar", con 2 líneas), solo te reconoce 1....
> 
> Saludos


OK. Me parece que hay una confusión.
A lo que debes referirte a de ser a configuración no ha inicialización.
ya que es diferente inicializarlo que configurarlo.

Saludos.


----------



## reyvilla (May 2, 2012)

Hola disculpen que me entrometa, hace mucho pero mucho tiempo estuve experimentando con un modulo de pruebas o de practicas para lcd, con una guia muy buena que les adjuntos esta en ingles, alli van a encontrar casi o si no todo lo necesario para manejar una lcd ya sea de forma manual con switches y pulsadores o con pic, tiene los set de funtion donde se indica si se va a trabajar con una linea o dos, con 4 bit o 8 bit, etc...Espero les sea de utilidad.

Esta aquí:https://www.forosdeelectronica.com/attachment.php?attachmentid=32493&d=1271906537


----------



## piceng (May 5, 2012)

Buenas tardes compañeros,

no consigo desactivar el display de un lcd. Estoy programando con css y no encuentro la forma de desactivarlo. 
He probado a meterle
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 
0 0 0 0 0 0 1 0 0 0 

Pero el display no se desactiva, me pueden ayudar??

Muchas gracias.


----------



## DJ T3 (May 5, 2012)

piceng dijo:


> He probado a meterle
> RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
> 0 0 0 0 0 0 1 0 0 0
> 
> Pero el display no se desactiva, me pueden ayudar??





¿Usás las librerías del CCS?, ¿o estás programando en ASM?.. 

En CCS, tenés las librerías que manejan los LCD, es lo más fácil de usar...

Saludos


----------



## piceng (May 6, 2012)

Buenso días, en primer lugar gracias por contestar.

Utilizo css, y una libreria para su control. Pero en la libreria no he encontrado nada para desactivarlo.


----------



## angeldemx (May 7, 2012)

piceng dijo:


> Buenso días, en primer lugar gracias por contestar.
> 
> Utilizo css, y una libreria para su control. Pero en la libreria no he encontrado nada para desactivarlo.



como que para desactivarlo?


----------



## DJ T3 (May 8, 2012)

piceng dijo:


> no he encontrado nada para desactivarlo.





angeldemx dijo:


> como que para desactivarlo?



¿No querrás decir poner la pantalla "en blanco"?, osea que no aparezca nada en la pantalla...

Saludos


----------



## marcotronic (Jun 8, 2012)

saludos a todos, bueno, soy nuevo por aca, y pues apenas entro en el interesante mundo de los PICs y como puedo llegar a controlar un LCD. encontre varios temas al respecto. pero todavia tengo una duda: que programas se usa para programar en C    me dijeron que aprender este lenguaje es muy bueno.

Bueno, deje que soy nuevo en esto, pero me interesa mucho, en el instituto el profe nos esta enseñando a programar en niple que es un atajo segun el para estos lenguajes de programación. 

a modo de colaborar con el tema, en esta direccion ( http://isa.umh.es/asignaturas/sea/practicas2C/ )ponen practicas muy interesantes, pinchen la practica 7, ahi dejan un pdf y ejemplos listos para subirlos al programa en formato .asm
espero les sirva, y si es que alguien me responde, muy agradecido.


----------



## Chico3001 (Jun 8, 2012)

Una cosa es desactivar y otra es borrar... aunque aparentemente las 2 hacen lo mismo en realidad son diferentes... 

Por favor aclara bien la duda para que te podamos ayudar..


----------



## f0raster0 (Jun 9, 2012)

marcotronic dijo:


> saludos a todos, bueno, soy nuevo por aca, y pues apenas entro en el interesante mundo de los PICs y como puedo llegar a controlar un LCD. encontre varios temas al respecto. pero todavia tengo una duda: que programas se usa para programar en C    me dijeron que aprender este lenguaje es muy bueno.
> 
> Bueno, deje que soy nuevo en esto, pero me interesa mucho, en el instituto el profe nos esta enseñando a programar en niple que es un atajo segun el para estos lenguajes de programación.
> 
> ...



para iniciar.. busca esto en google: "Compilador C Ccs Y Simulador Proteus Para Microcontroladores Pic"


----------



## VESAAY (Oct 30, 2012)

Hola que tal necesito hacer desplazamientos de letras en un lcd pero de izquierda a derecha uso el pic 16f877a y programo en pbp lo que quiero es que me salga por ejemplo en la primera linea:

Odnum aloh

y que se desplace asi y en la segunda linea que aparesca

hola mundo

pero la linea de arriba debe desplazarse de izquierda a derecha y la segunda linea de derecha a izzquierda alguna idea???????????


----------



## reyvilla (Oct 31, 2012)

VESAAY dijo:


> Hola que tal necesito hacer desplazamientos de letras en un lcd pero de izquierda a derecha uso el pic 16f877a y programo en pbp lo que quiero es que me salga por ejemplo en la primera linea:
> 
> Odnum aloh
> 
> ...



Hola hace ya un tiempo realice un vídeo de lo quieres realizar en PBP, similar a lo que intentas hacer chequealo y si puedes y tienes un ejemplo de tu codigo y un diagrama para simularlo te echo una mano.


----------



## eruditoproxy (Nov 5, 2012)

Hola a todos los amigos de la comunidad, acabo de unirme por recomendación de un amigo...en fin, estoy trabajando en microcontroladores y actualmente utilizo el ccs para crear los códigos de mi micro. Mi misión es crear un código que me muestre es una pantalla lcd 2*16 un mensaje que vaya apareciendo letra a letra, al final el mensaje debe empezar a parpadear; como si prendiera y apagara la pantalla pero con el mensaje ahí, ya tengo la primera parte lo de letra a letra me gustaría saber si existe alguna función para lo del parpadeo....

```
#INCLUDE <18F4550.H>
#FUSES HS,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOPBADEN  //PALABRA DE CONFIGURACION
#USE DELAY(CLOCK=20M)
#INCLUDE <LCD.C>


VOID MAIN(VOID)
{
   LCD_INIT();
   DELAY_MS(50);
   
   
  
LCD_GOTOXY(4,1);

  INT J;
   FOR(J=1;J<15;J=J+1)
   {

   SWITCH(J)
   {
   CASE 1:
   PRINTF(LCD_PUTC,"B");
   BREAK;
   CASE 2:
   PRINTF(LCD_PUTC,"I");
   BREAK;
   CASE 3:
   PRINTF(LCD_PUTC,"E");
   BREAK;
   CASE 4:
   PRINTF(LCD_PUTC,"N");
   BREAK;
   CASE 5:
   PRINTF(LCD_PUTC,"V");
   BREAK;
   CASE 6:
   PRINTF(LCD_PUTC,"E");
   BREAK;
   CASE 7:
   PRINTF(LCD_PUTC,"N");
   BREAK;
   CASE 8:
   PRINTF(LCD_PUTC,"I");
   BREAK;
   CASE 9:
   PRINTF(LCD_PUTC,"D");
   BREAK;
   CASE 10:
   PRINTF(LCD_PUTC,"O");
   BREAK;
   CASE 11:
   PRINTF(LCD_PUTC,"S");
   BREAK;
   
   }
   
  DELAY_MS(100);
   }
   

}
```


----------



## micronica (Nov 5, 2012)

Mira en las librerias el tipo de LCD y si es compatible con el protocolo Hitachi HD44780, existe un comando que pone el display en On/Off (mensaje no mensaje) que con el ratardo adecuado puede simular el parpadeo.

En este enlace tienes un ficherito con los comandos del protocolo Hitachi (no hace falta que el LCD sea marca Hitachi):

ftp://80.24.233.45/ELCA/ASI/PIC/COMANDOS_LCD.pdf


----------



## eruditoproxy (Nov 5, 2012)

Amigo, mil gracias. era lo que necesitaba.


----------



## uliyo (Nov 19, 2012)

hola buen día a todos yo t*a*mb*ié*n soy un principiante en esto de los pics y lcd's y tengo un problema que ya fue posteado a*qu*í en el foro y es que en mi lcd solo aparecen los cuadritos en negro en una sola linea (mi lcd es un JHD162A 16x2) y y seguí todos los consejos que aparecen y nada me funciona seguí lo *que* mencionaron acerca del contraste y lo hice con un potenciómetro y si puedo manejar el contraste pero sigue sin aparecer el texto revise ya todas las conexiones y todo parece estar en su lugar investigue y según vi en casos es necesario poner transistores en las salidas y también leí que la corriente que sale del pic debería ser suficiente para prender un led normal lo cual hice la prueba poniendo leds en donde de*b*erían de ser los bits 0-7 y p*ue*s igual no prenden quizá el problema sea mi pic o mi programa ya que estoy seguro que el circuito (sin transistores) esta bien hecho algún consejo de como saber si mi pic esta trabajando correctamente???? y t*a*mb*ié*n les dejo el programa que hice ya lo simule en proteus y en proteus si funciona perfectamente el pic que uso es un PIC16F887 uso el puerto c para los bits 0-7 y D0-D1 para RS y E baje la velocidad del oscilador a 4 MHZ y ya no se que hacer ni que este mal del por que no funciona ayuda por-favor 

PD soy nuevo en el foro espero me ayuden gracias



```
processor 16F887
include <P16F887.INC>

    ;Variables para DELAY
val1 equ 0x30
val2 equ 0x31
        

    org 0              ;Vector de RESET
    goto INICIO            
    org 5              ;Inicio del Programa
        
    ;Configuración de puertos
INICIO:
     clrf PORTC         ;Limpia PORTC    
    clrf PORTD         ;Limpia PORTD
    bsf STATUS, RP0  
    bcf STATUS, RP1    ;Selecciona el banco 1
    clrf TRISC         ;Configura PORTC como salida
    clrf TRISD         ;Configura PORTD como salida
    bcf STATUS,RP0     ;Regresa al banco 0
  

START_LCD:        
    call INICIA_LCD    ;Configura el LCD
    call M1            ;Muestra Mensaje
    call LINEA2        ;Configura linea 2
    call M2            ;Muestra Mensaje
    call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
   
    goto START_LCD1
START_LCD1:
call INICIA_LCD    ;Configura el LCD
    call M3            ;Muestra Mensaje
    call LINEA2        ;Configura linea 2
    call M4            ;Muestra Mensaje
       call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    
    goto START_LCD2
START_LCD2:
    call INICIA_LCD    ;Configura el LCD
    call M5            ;Muestra Mensaje
    call LINEA2        ;Configura linea 2
    call M6            ;Muestra Mensaje
       call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    
    goto START_LCD3
START_LCD3:
    call INICIA_LCD    ;Configura el LCD
    call M7            ;Muestra Mensaje
    call LINEA2        ;Configura linea 2
    call M8            ;Muestra Mensaje
       call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    call DELAY2
    
    goto START_LCD
    
    ;Mensaje a enviar
M1:
    movlw 'P'          ;Mueve 'P' a W
    movwf PORTC        ;Mueve lo que hay en W a PORTC
    call ENVIA         ;Imprime en LCD
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'S'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'O'
    movwf PORTC
    call ENVIA
    movlw 'N'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '1'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA 
    movlw 'P'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    return     
M2:
    movlw 'B'         ;Mueve 'B' a W
    movwf PORTC       ;Mueve lo que hay en W a PORTc
    call ENVIA        ;Imprime en LCD
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'B'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'D'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '1'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    
    return     
    
    M3:
    movlw 'P'          ;Mueve 'p' a W
    movwf PORTC        ;Mueve lo que hay en W a PORTc
    call ENVIA         ;Imprime en LCD
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'S'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'O'
    movwf PORTC
    call ENVIA
    movlw 'N'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '2'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA 
    movlw 'P'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    return    
    
    M4:
    movlw 'B'         ;Mueve 'b' a W
    movwf PORTC       ;Mueve lo que hay en W a PORTc
    call ENVIA        ;Imprime en LCD
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'B'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'D'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '2'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    return     
    
    M5:
    movlw 'P'          ;Mueve 'p' a W
    movwf PORTC        ;Mueve lo que hay en W a PORTc
    call ENVIA         ;Imprime en LCD
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'S'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'O'
    movwf PORTC
    call ENVIA
    movlw 'N'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '3'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA 
    movlw 'P'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    return    
    
    M6:
    movlw 'B'         ;Mueve 'b' a W
    movwf PORTC       ;Mueve lo que hay en W a PORTc
    call ENVIA        ;Imprime en LCD
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'B'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'D'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '3'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
       movwf PORTC
    call ENVIA   
    return
    
    M7:
    movlw 'P'          ;Mueve 'p' a W
    movwf PORTC        ;Mueve lo que hay en W a PORTC
    call ENVIA         ;Imprime en LCD
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'S'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'O'
    movwf PORTC
    call ENVIA
    movlw 'N'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '4'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA 
    movlw 'P'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw 'R'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    return    
    
    M8:
    movlw 'B'         ;Mueve 'B' a W
    movwf PORTC       ;Mueve lo que hay en W a PORTC
    call ENVIA        ;Imprime en LCD
    movlw 'E'
    movwf PORTC
    call ENVIA
    movlw 'B'
    movwf PORTC
    call ENVIA
    movlw 'I'
    movwf PORTC
    call ENVIA
    movlw 'D'
    movwf PORTC
    call ENVIA
    movlw 'A'
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw ' '
    movwf PORTC
    call ENVIA
    movlw '4'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    movlw '.'
    movwf PORTC
    call ENVIA
    return     
    
    
    
    ;Subrutina para inicializar el lcd
INICIA_LCD:
    bcf PORTD,0      ; RS=0 MODO INSTRUCCION
    movlw 0x01       ; El comando 0x01 limpia la pantalla en el LCD
    movwf PORTC
    call COMANDO     ; Se da de alta el comando
    movlw 0x0C       ; Selecciona la primera línea
    movwf PORTC
    call COMANDO     ; Se da de alta el comando
    movlw 0x3C       ; Se configura el cursor
    movwf PORTC
    call COMANDO     ; Se da de alta el comando
    bsf PORTD, 0     ; Rs=1 MODO DATO
    return

    ;Subrutina para enviar comandos
COMANDO:
    bsf PORTD,1     ; Pone ENABLE en 1
    call DELAY      ; Tiempo de espera
    call DELAY
    bcf PORTD, 1    ; ENABLE=0    
    call DELAY
    return     

    ;Subrutina para enviar un dato
ENVIA:
    bsf PORTD,0     ; RS=1 MODO DATO
    call COMANDO    ; Se da de alta el comando
    return

    ;Configuración Líneal 2 LCD
LINEA2:
    bcf PORTD, 0    ; RS=0 MODO INSTRUCCION
    movlw 0xc0      ; Selecciona línea 2 en el LCD
    movwf PORTC
    call COMANDO    ; Se da de alta el comando
    return

    ; Subrutina de retardo
DELAY:            
    movlw 0xFF
    movwf val2 
ciclo:
    movlw 0x10
    movwf val1
ciclo2:
    decfsz val1,1
    goto ciclo2
    decfsz val2,1
    goto ciclo
    return

;subrutina de retardo 2 para espera en cambio de texto
    
DELAY2:
movlw 0xFF
    movwf val2 
ciclo3:
    movlw 0x100
    movwf val1
ciclo4:
    decfsz val1,1
    goto ciclo4
    decfsz val2,1
    goto ciclo3
    return

    
 END
```


----------



## micronica (Nov 20, 2012)

Hola,
puedes encontrar multitud de ejemplos en Internat, aquí tienes un enlace que te puede servir:
http://es.scribd.com/doc/63768601/Manejar-Pantalla-Lcd-16x2-Con-Pic-16d877-Asm

En cualquier caso, solo se reinicia el LCD una vez al principio del programa, es como un 'reset' y necesita su tiempo, además te parpadearía el LCD.

Tampoco veo en tu código que incluyas las librerías. ¿lo haces?

Saludos


----------



## and070 (Dic 2, 2012)

lo que pasa es que necesito adaptar un programa en asm de 16f84 a 16f877 para controlar un display, pero lo que hize medio funciona papadean los numero y despues ya o se ve nada, lo que hize fue cambiar el aceso a los bancos nada mas, ya que el 16f84 tiene 2 y el 877 4, noc si hay que hacerle otra cosa, o de lo contrario si alguien me puede brindar un programa para gobernar un lcd 16x2 para 16f877 en asm, por que c lo medio entiendo, ahi subo los archivos, el que dice 877 es que modifique, el otro es el original y lo tome de un libro


----------



## VESAAY (Dic 6, 2012)

gracias reyvilla eso es lo que necesito como haces el desplazamiento de derecha a izquierda men si me pudieras pasar el codigo te lo agradeceria


----------



## JoshFino (Dic 7, 2012)

Hola!
Veran, tengo el microcontrolador 18F4550, Y un display LCD JDH 162A, por lo cual me puse a investigar un poco sobre el manejo del mismo, pero al montarlo en el protoboard, la primera vez se mostraron cuadros en la parte superior de la pantalla, a lo cual revise mi código, hice la simulación y vi que no era problema del código, así que lo volví a programar (el PIC) y ahora ya no enciende la pantalla!!

Este es mi código (uso PIC C) :


```
#include <18F4550.h>
#include <string.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#fuses NODEBUG,PLL5,CPUDIV4,NOMCLR
#use delay(clock= 8000000)
#define LCD_DATA_PORT getenv("SFR:PORTB")
#define use_portb_lcd TRUE
#define LCD_ENABLE_PIN PIN_B2
#define LCD_RS_PIN PIN_B3
#define LCD_RW_PIN PIN_B1
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B7
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B5 
#include <LCD.C>



void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   
   char nom[]="Alumno: Fernando";
   char cod[]="Codigo:207425449";
   delay_ms(2);
   lcd_init();
   delay_ms(2);
   while(TRUE)
   {
      delay_us(40);
      printf(lcd_putc,nom);
      delay_ms(1000);
      delay_us(40);
      lcd_gotoxy(1,2);
      delay_us(40);
      printf(lcd_putc,cod);
      delay_ms(1000);
      delay_ms(3000);
   }

}
```
Estoy un poco desesperado! consejos? gracias!


----------



## frlugo50 (Dic 31, 2012)

hola como estan, reciente compre una lcd 16x4, pero cuando hago la simulacion en proteus la linea 3 y 4 me salen 4 caracteres mas hacia la derecha e intentado todo para colocarlo en el principio de la fila pero no resulta, igualmente cuando lo hago en la verdadera lcd, estoy usando proton ide.


----------



## D@rkbytes (Dic 31, 2012)

frlugo50 dijo:


> hola como están, reciente compre una lcd 16x4, pero cuando hago la simulación en proteus la linea 3 y 4 me salen 4 caracteres mas hacia la derecha e intentado todo para colocarlo en el principio de la fila pero no resulta, igualmente cuando lo hago en la verdadera lcd, estoy usando proton ide.


Saludos.

Para trabajar con las líneas 3 y 4 usa esto...

*Print* $FE,$90,"Linea 3" 
*Print* $FE,$D0,"Linea 4"

Suerte.


----------



## miglo (Ene 3, 2013)

JoshFino dijo:


> Hola!
> Veran, tengo el microcontrolador 18F4550, Y un display LCD JDH 162A, por lo cual me puse a investigar un poco sobre el manejo del mismo, pero al montarlo en el protoboard, la primera vez se mostraron cuadros en la parte superior de la pantalla, a lo cual revise mi código, hice la simulación y vi que no era problema del código, así que lo volví a programar (el PIC) y ahora ya no enciende la pantalla!!
> 
> Estoy un poco desesperado! consejos? gracias!



Si te sirve de algo, partiendo de la base que estoy aprendiendo, yo lo hago con un 16f877a y con unos pequeños cambios va bien tu programa.
Te pongo el código y mira ver si el problema lo tienes hay ya que creo que el error lo tienes ahí:

```
#include <16F877A.h>
#include <string.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP, NODEBUG

#use delay(clock= 8000000)

#include <LCD.C>

   [B]char nom[]="Alumno: Fernando";
   char cod[]="Codigo:207425449";[/B]
  
 
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   
   lcd_init();
   delay_ms(2);
   while(TRUE)
   {
      [B]lcd_gotoxy(1,1);[/B]
      delay_us(40);
      printf(lcd_putc,nom);
      delay_ms(1000);
      delay_us(40);
      lcd_gotoxy(1,2);
      delay_us(40);
      printf(lcd_putc,cod);
      delay_ms(1000);
      delay_ms(3000);
   }

}
```


----------



## gladiadortuc (Mar 16, 2013)

Buenos días queridos colegas...

Hice un sistema para lavarropas que está en http://planocomplejo.com.ar/wp/?p=12#more-12. Usé el PIC 16F877A, La fuente es la típica de un Trafo de 220/12V con puente de diodos, capacitor de 4700µF, filtré la fuente con capacitores de .1µF, 22nF, etc. y aguas abajo ya filtrado un 7812 y conectado a éste un 7805, cada uno con un capacitor de .1µF a la salida. Al PIC le puse un capacitor de 22nF entre las patitas VSS y VDD muy cercano al integrado. 

Le hice algunas correcciones en lo operativo, en los comandos para motor, cambié los tiempos de carga y descarga, etc., y sobreescribí algunos de los mensajes que envía al LCD 16x2 cuidando el largo de las líneas, etc. ¡En el PROTEUS funciona perfecto!

En la práctica, el sistema de lavado también funciona bien. Pero el display se comporta errático mostrando caracteres extraños, aunque todos son ASCII, pero no son los que le envío. No siempre muestra lo mismo. A veces, muy A VECES, muestra algo correctamente.

*ACLARACIÓN: El display no funcionó bien nunca. Por lo que no es un problema de ruido del lavarropas. Lo  tuve que instalar porque después de 2 semanas no se podía vivir lavando a mano. *

Intenté de todo pero no hubo caso. Probé (y quemé accidentalmente) 3 displays, y en todos mostraban lo mismo. El display es un WINSTAR 16x2 azul. 
Ya instalé el dispositivo en el lavarropas y, como dije, todo funciona bien, entradas y salidas digitales, lo único que me está volviendo loco es el DISPLAY. Ya no se qué hacer.

¿Alguien tuvo ese problema? No he leido ningún mensaje de esos.


----------



## D@rkbytes (Mar 16, 2013)

gladiadortuc dijo:


> Probé (y quemé accidentalmente) 3 displays, y en todos mostraban lo mismo. El display es un WINSTAR 16x2 azul.


¿Ya probaste con otra pantalla que no sea WINSTAR?
Según el fabricante son estandard y usan el controlador ST7032, que es compatible con el HD44780.
Prueba con otro LCD genérico para que salgas de dudas.
Si llegaras a usar el pin RB3 para la pantalla, verifica que no tengas activo el fuse LVP.


----------



## gladiadortuc (Mar 17, 2013)

D@rkbytes dijo:


> ¿Ya probaste con otra pantalla que no sea WINSTAR?



¡Gracias por responder D@rkBytes! No. No probe con otro. Por aquí no consigo otra marca. Sin embargo a todo el mundo le funciona bien, eso me llamó la atención. 



D@rkbytes dijo:


> Prueba con otro LCD genérico para que salgas de dudas.
> Si llegaras a usar el pin RB3 para la pantalla, verifica que no tengas activo el fuse LVP.



Voy a ver de probar con otra marca, ya veremos. Por otro lado quemé el led en los otros. De puro bruto, porque no puse la resistencia adecuada, sin embargo aún funcionan como display, sólo que hay que hacer malabarismos para ver..  

La cosa es que también muestran ese "ruido". Voy a tratar de filmarlo para mostrar. Es extraño que 3 displays tengan la misma falla, por eso creo que se debe al PIC. No recuerdo si conté que usé el CCS C, y en general funciona bien.

No he leido que nadie tenga ese problema con el Display. Si llegara a ser ruido, la pregunta es cómo quitárselo. Porque el ruido está en la señal desde el PIC. Y usé un cable apantallado UTP de 25cm para conectarlo, con una ficha.No creo que sea ese el problema porque suelen usar una ProtoBoard y así funciona bien... Pero voy a probar soldar los cables. 

De todos modos si alguien tuvo el problema... Espero me cuente al menos a qué se debe.
Gracias. Saludos.


----------



## jhonjz (May 13, 2013)

Hola a todos, aprovechado este tema del manejo de los lcd quisiera que alguien me ayudara a cómo logro poner un mensaje que se desplace por el lcd. por ejemplo: "HOLA A TODOS COMO ESTAN", ya he trabajado estos pero en mensajes fijos, la idea es hacer lo mismo pero que se desplace, tengo un lcd 2x16 y quiero montarlo en CCS o lenguaje C. Gracias por su colaboración.


----------



## MrCarlos (May 13, 2013)

Hola jhonjz

Es muy probable que te sirva el que desarrollo *Emilius* Por Acá:
https://www.forosdeelectronica.com/f26/problema-lcd-pic-16f628a-70976/#post622707

saludos
a sus ordenes


----------



## jhonjz (May 13, 2013)

MrCarlos dijo:


> Hola jhonjz
> 
> Es muy probable que te sirva el que desarrollo *Emilius* Por Acá:
> https://www.forosdeelectronica.com/f26/problema-lcd-pic-16f628a-70976/#post622707
> ...



Muchas gracias MrCarlos, es lo que andaba buscando, al fin.


----------



## marconikov (Feb 28, 2014)

Buen día a todos compañeros.
Mi duda es que, ¿por qué no puedo imprimir caracteres en la primera linea de mi pantalla?
Ya lo he intentado en otras partes de la pantalla lcd y si puedo, pero no sé.
Acá les anexo el código y una imagen de la distribución del lcd que estoy usando.

```
Pause 500 ' Pausa de 500 milisegundos
LCDOut $fe, 1 ' Limpia la pantalla
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
' Cargamos el caracter en la posición cero:
LCDOut $fe,$40,$02,$06,$1A,$1A,$1A,$06,$02,$00
' Muestra el caracter en la pantalla:
LCDOut $fe,1, 0
Inicio:
GoTo Inicio
```


----------



## Daniel Meza (Mar 3, 2014)

Parece ser que le hace falta la rutina de inicializacion del LCD a tu programa, es decir indicarle que tipo de comunicación tendrá (8 ó 4 bits), llenado de caracteres (izq, der), etc


----------



## D@rkbytes (Mar 4, 2014)

PICBasic Pro asume una configuración de pines por defecto para pantalla LCD cuando no se ha definido por el usuario y establece un bus de 4 Bits.
Esto también lo hace el compilador PCWHD de CCS pero con otros pines y de acuerdo al PIC utilizado.

Los pines de la configuración por defecto que usa PBB para la pantalla LCD son los siguientes.
Modo de 4 Bits con dos pines de control (RS, E).
*
RA0 --> D4
RA1 --> D5
RA2 --> D6
RA3 --> D7
RA4 --> RS
RB3 --> E*

Como en algunos PIC's el pin RA4 es drenador abierto, se debe colocar una resistencia pull-up de 4.7k.
En esta configuración el pin RW debe colocarse hacia VSS.

Está configuración no cambia con el tipo de PIC, puede ser un 16F84A, 16F628A, 16F877A,18FXXXX, etc.

La inicialización de la pantalla en PBP es automática con tan solo escribir la instrucción LCDOut.
Tampoco es necesario dar un tiempo antes de escribir, porque esto también lo hace la instrucción.
Si no se define la velocidad de trabajo, PBP asume una velocidad de 4MHz por defecto.

Para la configuración de pines por usuario se usa lo siguiente y puede ser encontrado en la ayuda de PBP.
_' Set LCD Data  port_
*DEFINE* LCD_DREG PORTB
_' Set starting Data bit (0 or 4) if 4-bit  bus_
*DEFINE* LCD_DBIT 4
_' Set LCD Register Select  port_
*DEFINE* LCD_RSREG PORTB
_' Set LCD Register Select  bit_
*DEFINE* LCD_RSBIT 1
_' Set LCD Enable port_
*DEFINE*  LCD_EREG PORTB
_' Set LCD Enable  bit_
*DEFINE* LCD_EBIT 0
_' Set LCD bus size (4 or 8  bits)_
*DEFINE* LCD_BITS 4
_' Set number of lines on  LCD_
*DEFINE* LCD_LINES 2
_' Set command delay time in  us_
*DEFINE* LCD_COMMANDUS 2000
_' Set data delay time in  us_
*DEFINE* LCD_DATAUS 50


 Una escritura en pantalla con una configuración sencilla sería de esta forma...

```
[COLOR=SeaGreen]@ Device PIC16F877A[/COLOR] [COLOR=Blue]; Microcontrolador utilizado
; Palabra de configuración:[/COLOR]
[COLOR=SeaGreen]@ Device XT_OSC, WDT_OFF, PWRT_ON, BOD_OFF[/COLOR]

Inicio:
    [B]Low[/B]     PORTD.1[COLOR=Blue] ; Inicia el pin RD1 en 0[/COLOR]
    [B]LCDOut [/B] $FE,$80,[COLOR=Red]"Hola Mundo"[/COLOR]    [COLOR=Blue]; Escribe en la primer línea desde la posición 1.[/COLOR]
    [B]LCDOut [/B] $FE,$C0,[COLOR=Red]"Hello World" [/COLOR]  [COLOR=Blue]; Escribe en la segunda línea desde la posición 1.[/COLOR]
    
Programa:
    [B]Toggle[/B]  PORTD.1     [COLOR=Blue]; Cambia de estado el pin RD1[/COLOR]
    [B]Pause[/B]   500        [COLOR=Blue] ; Retardo de 500Ms.[/COLOR]
    [B]GoTo[/B]    Programa   [COLOR=Blue] ; Bucle infinito a la etiqueta Programa[/COLOR]
    
    [B]End[/B]                [COLOR=Blue] ; Fin del programa.[/COLOR]
```
El programa tan solo escribe una vez en la pantalla sobre las dos líneas y enciende un LED por RD1 (pin 20)
Es el clásico LED que parpadea para decir "Estoy Vivo".

Nótese que el programa es para un PIC16F877A y que los pines para RA3, RA2, RA1 y RA0 son análogos,
y que no se ha configurado el registro ADCON1 para hacer que funcionen cómo digitales.
Pese a esto, el programa funciona sin dicha configuración del modo digital.
Tampoco se declaró la frecuencia de trabajo que será de 4MHz por defecto.
Si se omite la palabra de configuración en el 16F877A también será por defecto XT_OSC,
pero se tendrán los fuses Watch Dog Timer y Brown Out Reset activos, y desactivado el Power On Reset.

Saludos.


----------



## cliche (Mar 7, 2014)

Hola amigos tengo u problema no se como diablos mandarle datos a un display serial, el datasheet dice que enviando unos datos el display de borra se mueve etc, ejemplo: 0x01 = clean display. peor no se como mandarlo adjunto parte de mi soft


```
//*****************CONFIGURACION*******************************//
#include <16F628a.h>
#use delay (clock = 8000000)
#include <lcd.c>

#FUSES HS,WDT,NOPUT,NOPROTECT,NOBROWNOUT NOLVP  NOCPD
#use RS232(BAUD=1200,UART1,STREAM=Emisor)
#use RS232(BAUD=2400, XMIT=PIN_B3,FORCE_SW,STREAM=DYSPLAY1)
#use RS232(BAUD=9600, XMIT=PIN_B4,FORCE_SW,STREAM=DYSPLAY2)
//************************************************************//
int i;
int marcador1;
int marcador2;
int blanco1=5;
int blanco2=10;
int z=0x01;

#INT_RDA

void RDA_isr(void){
fprintf(DYSPLAY1,"\f");
      i=getc(Emisor);
                  if(i==1){
                  marcador1=marcador1+blanco1;
                  fprintf(DYSPLAY1,"puntosa;%d",marcador1);
                                  }
                  if(i==2){
                  marcador2=marcador2+blanco1;
                  fprintf(DYSPLAY2,"puntosb;%d",marcador2);
                                  }
                  if(i==11){
                  marcador1=marcador1+blanco2;
                  fprintf(DYSPLAY1,"puntosa;%d",marcador1);
                                  }
                  if(i==22){
                  marcador2=marcador2+blanco2;
                  fprintf(DYSPLAY2,"puntosb;%d",marcador2);
                                  }
                  }

void main(){
int a=1;
int b=2;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

                         
                for(;;){
                     if(input(pin_A0)==1){
                     fputc(a,Emisor);
                     delay_ms(500);
                                         }
                                         
                     if(input(pin_A1)==1){
                     fputc(b,Emisor);
                     delay_ms(500);
                                         }  
                       }
            }
```

como verán uso 3 UART uno por hardware que se comunica con los demás pic y los otros dos son por software para controlar los dos display por separados, el problema es que cuando quiero mandar el dato a un display pongo fprintf(STREAM,"mensage",value); pero he intentado de todo para mandarle el bendito 0x01 y no toma en cuenta me pone los números donde le place. ya me tiene arto...


----------



## D@rkbytes (Mar 8, 2014)

cliche dijo:


> el datasheet dice que enviando unos datos el display de borra se mueve etc, ejemplo: 0x01 = clean display.


¿Cual datasheet? 

Hace poco tiempo hice un programa sencillo para controlar el LCD serial 16x2 Milford que viene con proteus.
No tengo esa pantalla serial, tan solo quise hacer la prueba. 

Tal vez te pueda servir para que veas los comandos que utilicé y como lo hice.

Suerte.


----------



## cliche (Mar 10, 2014)

D@rkbytes dijo:


> ¿Cual datasheet?
> 
> Hace poco tiempo hice un programa sencillo para controlar el LCD serial 16x2 Milford que viene con proteus.
> No tengo esa pantalla serial, tan solo quise hacer la prueba.
> ...



Amigos después de buscar y buscar lei algo de lo que muestra el amigo en su adjunto y obtuve que para manejar los datos del datashhet de este display serial debes hacerlo con la directriz fputc(Valor,Stream);
eso es siempre que uses un UART por software si no el envio sera comun por putc y la lectura por getc.  

por ende para mandar el 0x01 ò el 0x08 debes hacerlo asi,

fputc(0x08,STREAM);

saludos espero les sirva..!!!!


----------



## D@rkbytes (Abr 18, 2014)

Les quiero compartir una librería en ensamblador para pantallas LCD 16x2 que adapté para trabajar con los PIC18.
Para usar esta librería se hace uso de las instrucciones para leer tablas en este tipo de PIC's.

Su uso es muy sencillo y se pueden escribir los mensajes de esta forma por ejemplo:
DB "Hola_Mundo______"

De esta manera nos evitamos escribir el mensaje con los clásicos MOVLW 'X' o RETLW 'X'
Esta librería contiene las funciones básicas para escribir en la pantalla y adjunto un ejemplo para su uso.

Utilicé un PIC18F4550 para el ejemplo y funciona perfectamente en pantallas LCD 16x2 con el controlador HD44780 y compatibles.

Nota:
La librería está escrita para trabajar a 4MHz, y para usarla a otra frecuencia se deben cambiar las rutinas de los retardos.

Espero sea de utilidad para quienes les gusta el lenguaje ensamblador y necesiten una librería LCD para PIC18.

Suerte.


----------



## danifiguerola (Mar 19, 2015)

Hola, soy nuevo en el foro.
Estoy intentando inicializar un LCD JM162A sin éxito
Estoy usando el pic24fj64gb002. El LCD lleva el controlador ks0070b (similar al hitachi 44780 pero con la rutina de inicialización un poco distinta). 
Quiero usar el LCD en modo 4 bits usando los pines tolerantes a 5v del puerto B  (RS y E en pines RB5 y RB7 respectivamente, RW a tierra y DB4-DB7 en RB8-RB11).
No consigo de ninguna manera inicializar el LCD, me queda una línea con cuadros negros (creo que no es el contraste, he conectado potenciómetro de 10k, al regularlo pasa de cuadros negros a nada). Las conexiones también creo que están bien.
He hecho mil rutinas pero nada , incrementando los tiempos muy por encima de lo que marca el fabricante y no he obtenido ningún resultado.
Estoy bastante desesperado.
He de decir que estudié ingenieria electrónica pero hace ya muchos años que no hacia nada con microcontroladores y estoy bastante oxidado. En el siguiente post adjunto código.
Muchas grácias por adelantado


```
#include <stdio.h>
#include <stdlib.h>
#include <p24FJ64GB002.h>


#define FCY 10000000UL
#include <libpic30.h>

_CONFIG1 (JTAGEN_OFF);                      //Modulo JTAG deshabilitado (RB5-RB9 i/o digitales)
_CONFIG3 (SOSCSEL_IO);                      //RA4 i RB4 i/0 digitales
_CONFIG2 (POSCMOD_XT & OSCIOFNC_OFF & FNOSC_PRI); //Oscilador primario XT (cristal 20MHz)

// Definir pins control i dades

#define LCD_PIN_RS  _LATB5
//#define LCD_PIN_RW  _RA1      //RW a tierra
#define LCD_PIN_E   _LATB7
#define LCD_PIN_DB4 _LATB8
#define LCD_PIN_DB5 _LATB9
#define LCD_PIN_DB6 _LATB10
#define LCD_PIN_DB7 _LATB11

// Definir direcció dels pins

#define RS_DIRECCIO     _TRISB5
//#define RW_DIRECCIO     _TRISA1
#define E_DIRECCIO      _TRISB7
#define DB4_DIRECCIO    _TRISB8
#define DB5_DIRECCIO    _TRISB9
#define DB6_DIRECCIO    _TRISB10
#define DB7_DIRECCIO    _TRISB11
#define CONFIG_1x5x7    0x04
#define CONFIG_2x5x7    0x08
#define CONFIG_1x5x10   0x04
#define CONFIG_2x5x10   0x0C


void port_4bits (char dada)
{
    LCD_PIN_DB4 = dada & 1;
    LCD_PIN_DB5 = (dada & 2)>>1;
    LCD_PIN_DB6 = (dada & 4)>>2;
    LCD_PIN_DB7 = (dada & 8)>>3;
}

void escriure_byte (char dada)
{
    char hg_4bits;

    LCD_PIN_E = 0;
    LCD_PIN_RS = 1;     //Mode dato
    __delay_us(1);
    LCD_PIN_E = 1;
    hg_4bits = dada >>4;
    port_4bits (hg_4bits);      //Transmitir 4 bits altos
    __delay_us(1);
    LCD_PIN_E = 0;
    __delay_us(1);
    LCD_PIN_E = 1;
    port_4bits (dada);          //Transmitir 4 bits bajos
    __delay_us(1);
    LCD_PIN_E = 0;
    __delay_us(50);

}

void escriure_cmd (char dada)
{
    char hg_4bits;

    LCD_PIN_E = 0;
    LCD_PIN_RS = 0;
    hg_4bits = dada >>4;
    port_4bits (hg_4bits);
    LCD_PIN_E = 1;
    __delay_us(100);
    LCD_PIN_E = 0;
    port_4bits (dada);
    LCD_PIN_E = 1;
    __delay_us(100);
    LCD_PIN_E = 0;
}


void cmd_lcd_4bits (char dada)
{
    LCD_PIN_E = 0;
    LCD_PIN_RS = 0;         //Instrucción
    port_4bits(dada);       //Poner dada en el puerto
    LCD_PIN_E = 1;
    __delay_ms(100);
    LCD_PIN_E = 0;
}

void ini_LCD_4bits ()
{
    TRISB = 0x0000;     //port B salida
    __delay_ms(100);
                        //Inicializa a 4 bits
    LCD_PIN_E = 0;
    LCD_PIN_RS = 0;
    port_4bits(0x02);
    __delay_us(100);
  
    escriure_cmd(0x28);     //Function set 2 lineas 5x7
    __delay_us(80);
    escriure_cmd(0x0E);     //Display on, cursor on, blink off
    __delay_us(80);
    escriure_cmd(0x01);     //Clear display
    __delay_ms(4);
    escriure_cmd (0x06);    //Increment mode y entrire shift off
    __delay_us(80);

}


int main() {

    AD1PCFG = 0xffff;   //Todos los puertos digitales
    ODCB = 0x0000;      //No open drain
    TRISB = 0;          //Port B salida
    _TRISA0 = 0;        //RA0 salida

    ini_LCD_4bits();
    __delay_ms(1000);
    escriure_byte (0x48);
    
    while(1)
    {
       _LATA0 = 1;          //Parpadeo de led cada segundo, para verificar retardos
       __delay_ms(1000);
       _LATA0 = 0;
       __delay_ms(1000);
    };


    
}
```


----------



## Fogonazo (Mar 19, 2015)

Mira este tema:

https://www.forosdeelectronica.com/f24/control-display-lcd-microcontrolador-pic-201/


----------



## danifiguerola (Mar 19, 2015)

Ok. Gracias Fogonazo.

Ya me lo estuve mirando pero no logré solucionar el problema. Soy bastante nuevo en esto de los foros y ahora me doy cuenta que en vez de abrir un nuevo tema a lo mejor hubiera sido más correcto escribir en este tema que me recomiendas.

Gracias de nuevo

También he visto que el código que he enviado está mal...

Perdonad las molestias, hoy estoy un poco torpe... 

Hola de nuevo. He mirado el foro que me has recomendado pero no he conseguido solucionar el problema 

He visto al final del foro que recomendaba abrir un nuevo tema ya que hacia más de 6 meses que no se publicaba en él, por esto he optado seguir aquí (si estoy equivocado ya me diréis).

Adjunto el código corregido (a parte, he bajado la frecuencia del oscilador para relantizar el programa, he visto que lo recomendaba en caso de problemas). Lo copio aquí ya que no se como lo has hecho para que quedara en una ventana (soy muy novato en eso de los foros).


```
#include <stdio.h>
#include <stdlib.h>
#include <p24FJ64GB002.h>


#define FCY 62500UL
#include <libpic30.h>

_CONFIG1 (JTAGEN_OFF);                      //Modulo JTAG deshabilitado (RB5-RB9 i/o digitales)
_CONFIG3 (SOSCSEL_IO);                      //RA4 i RB4 i/0 digitales
//_CONFIG2 (POSCMOD_XT & OSCIOFNC_OFF & FNOSC_PRI); //Oscilador primario XT (cristal 20MHz)
_CONFIG2 (POSCMOD_NONE & OSCIOFNC_ON);


// Definir pins control i dades

#define LCD_PIN_RS  _LATB5
//#define LCD_PIN_RW  _RA1      //RW a tierra
#define LCD_PIN_E   _LATB7
#define LCD_PIN_DB4 _LATB8
#define LCD_PIN_DB5 _LATB9
#define LCD_PIN_DB6 _LATB10
#define LCD_PIN_DB7 _LATB11

// Definir direcció dels pins

#define RS_DIRECCIO     _TRISB5
//#define RW_DIRECCIO     _TRISA1
#define E_DIRECCIO      _TRISB7
#define DB4_DIRECCIO    _TRISB8
#define DB5_DIRECCIO    _TRISB9
#define DB6_DIRECCIO    _TRISB10
#define DB7_DIRECCIO    _TRISB11
#define CONFIG_1x5x7    0x04
#define CONFIG_2x5x7    0x08
#define CONFIG_1x5x10   0x04
#define CONFIG_2x5x10   0x0C


void port_4bits (char dada)
{
    LCD_PIN_DB4 = dada & 1;
    LCD_PIN_DB5 = (dada & 2)>>1;
    LCD_PIN_DB6 = (dada & 4)>>2;
    LCD_PIN_DB7 = (dada & 8)>>3;
}

void escriure_byte (char dada)
{
    char hg_4bits;

    LCD_PIN_E = 0;
    LCD_PIN_RS = 1;     //Mode dato
    __delay_us(1);
    LCD_PIN_E = 1;
    hg_4bits = dada >>4;
    port_4bits (hg_4bits);      //Transmitir 4 bits altos
    __delay_us(1);
    LCD_PIN_E = 0;
    __delay_us(1);
    LCD_PIN_E = 1;
    port_4bits (dada);          //Transmitir 4 bits bajos
    __delay_us(1);
    LCD_PIN_E = 0;
    __delay_us(50);

}

void cmd_lcd_4bits (char dada)
{
    LCD_PIN_E = 0;
    LCD_PIN_RS = 0;         //Instrucción
    port_4bits(dada);       //Poner dada en el puerto
    LCD_PIN_E = 1;
    __delay_ms(100);
    LCD_PIN_E = 0;
}

void escriure_cmd (char dada)
{
    char hg_4bits;

    hg_4bits = dada >>4;
    cmd_lcd_4bits(hg_4bits);
    __delay_ms(1000);
    cmd_lcd_4bits(dada);
    __delay_ms(1000);
}




void ini_LCD_4bits ()
{
    TRISB = 0x0000;     //port B salida
    __delay_ms(100);
                        //Inicializa a 4 bits
    cmd_lcd_4bits(0x02);
    __delay_ms(100);
  
    escriure_cmd(0x28);     //Function set 2 lineas 5x7
    __delay_ms(80);
    escriure_cmd(0x0E);     //Display on, cursor on, blink off
    __delay_ms(80);
    escriure_cmd(0x01);     //Clear display
    __delay_ms(4);
    escriure_cmd (0x06);    //Increment mode y entrire shift off
    __delay_ms(80);

}


int main() {

    _NOSC = 0x7;    //Fast RC
    _RCDIV = 0x6;   //Divided per 64 (125kHz)

    AD1PCFG = 0xffff;   //Todos los puertos digitales
    ODCB = 0x0000;      //No open drain
    TRISB = 0;          //Port B salida
    _TRISA0 = 0;        //RA0 salida

    ini_LCD_4bits();
    __delay_ms(1000);
    escriure_byte (0x48);
    
    while(1)
    {
       _LATA0 = 1;          //Parpadeo de led cada segundo, para verificar retardos
       __delay_ms(1000);
       _LATA0 = 0;
       __delay_ms(1000);
    };


    
}
```

Gracias de nuevo

*[En lugar de crear nuevos comentarios edita los que ya tienes.]*​


----------



## danifiguerola (Mar 31, 2015)

danifiguerola dijo:


> Ok. Gracias Fogonazo.
> 
> Ya me lo estuve mirando pero no logré solucionar el problema. Soy bastante nuevo en esto de los foros y ahora me doy cuenta que en vez de abrir un nuevo tema a lo mejor hubiera sido más correcto escribir en este tema que me recomiendas.
> 
> ...



Hola de nuevo. Creo que el problema está en que la pantalla no funciona correctamente, pero antes de comprar otra quería escuchar vuestra opinión.

Conseguí un código que parecía que funcionaba algo mejor, no conseguí sacar texto pero pasaba de los cuadros negros a una línea parpadeante. De repente pero dejó de funcionar o hacia diferentes cosas al ejecutar la pantalla y el pic (salían cuadros negros, no salía nada o salía la línea parpadeante).

Ahora me encuentro que al dar tensión solamente a la pantalla (sin conectar el pic), a veces no sale nada (ni la línea de cuadros negros) y los pines de datos se me ponen a "1"

Esto me hace pensar que la pantalla no está bien, pero como siempre no pasa lo mismo a lo mejor es que el chip de control de esta a veces no se reinicializa bien en el reset por apagado... no se...

Que les parece a ustedes?

Gracias de nuevo


----------



## msmolinaa (Abr 27, 2015)

Tengo un programa en ensamblador (mplab) para un LCD LM016L y un microcontrolador PIC16F877

Tengo en la linea 1, un mensaje en movimiento y en la linea 2 necesito colocar un mensaje centrado y que no se mueva, pero aparece es las dos lineas moviéndose; y necesito que la linea de arriba se mueva pero la de abajo quede quieta todo el tiempo.

Y claro la linea 1 al final del recorido se tiene que quedar quieta (cosa que si funciona)

Ademas de eso en la linea 1 necesito colocar mas letras pero cuando lo hago solo salen 40 caracteres como máximo.

Este es el código (algunos comandos o etiquetas sobran):

```
list p=16F877A
 __CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF ; Configuracin para el programador
        #include    <P16F877A.INC>

STATUS           EQU    0X03
PORTA            EQU    0X05
PORTB            EQU    0X06
TRISA            EQU    0X85
TRISB            EQU    0X86
LCD_LINEA1     EQU    80
LCD_LINEA2     EQU    0C0
LCD_CLR         EQU    01
LCD_CASA     EQU    02
LCD_INC         EQU    06
LCD_DEC         EQU    04
LCD_ON         EQU    0C
LCD_OFF         EQU    08
CURSOR_ON     EQU    0E
CURSOR_OFF     EQU    0C
CURSOR_PARP     EQU    0F
LCD_IZDA     EQU    18
LCD_DECHA     EQU    1C
CURSOR_IZDA     EQU    10
CURSOR_DECHA     EQU    14
LCD_FUNCIÓN     EQU    38
LCD_CGRAM     EQU    40
        CBLOCK 0x20

	contador1,contador2			; Variables para los retardos
	Scroll						; Variable para el Scroll
	Aux							; Variable auxiliar
	endc

LCD_Putc macro	Caracter
	movlw	Caracter
	call	lcd_dato
	endm

        ORG    0x00

 BCF STATUS, RP0 ;
 BCF STATUS, RP1 ; Banco 0
 CLRF PORTA ; Inicializo PORTA poniendo los latches a 0 BSF
 BSF STATUS, RP0 ; Banco 1
 MOVLW 0x06 ; Configuro todos los pines
 MOVWF ADCON1 ; como entradas digitales
 MOVLW 0xCF

INICIO
                bsf         STATUS,RP0
                   movlw        b'00011000'
        movwf        TRISA
        clrf        TRISB
        bcf             STATUS,RP0
        clrf        PORTA
        clrf        PORTB
        movlw        LCD_FUNCIÓN
        call        LCD_COMANDO
        call        PAUSA_5ms
        movlw        LCD_FUNCIÓN
        call        LCD_COMANDO
        call        PAUSA_5ms
        movlw        LCD_FUNCIÓN
        call        LCD_COMANDO
        call        PAUSA_5ms
        movlw        LCD_CLR
        call        LCD_COMANDO
        movlw        LCD_INC
        call        LCD_COMANDO
        movlw        LCD_ON
        call        LCD_COMANDO
        movlw        80
        call        LCD_COMANDO
ver                                             ;inicio escritura de caracteres


        movlw 0c0                     ; Seleccionar la posición en la fila 2
        call LCD_COMANDO

        movlw    ' '
        call    LCD_CARACTER
        movlw    ' '
        call    LCD_CARACTER
        movlw    '3'
        call    LCD_CARACTER
        movlw    '0'
        call    LCD_CARACTER
         movlw    '9'
        call    LCD_CARACTER
        movlw    '6'
        call    LCD_CARACTER
        movlw    '9'
        call    LCD_CARACTER
        movlw    '6'
        call    LCD_CARACTER
        movlw    '-'
        call    LCD_CARACTER
        movlw    'M'
        call    LCD_CARACTER
        movlw    'p'
        call    LCD_CARACTER
        movlw    '&'
        call    LCD_CARACTER
        movlw    'M'
        call    LCD_CARACTER
        movlw    'c'
        call    LCD_CARACTER
        movlw    ' '
        call    LCD_CARACTER
        movlw    ' '
        call    LCD_CARACTER

	movlw	80		; Seleccionar la posición en la fila 1
        call LCD_COMANDO
        movlw    ' '
        call    LCD_CARACTER
        movlw    'M'
        call    LCD_CARACTER
        movlw    'I'
        call    LCD_CARACTER
        movlw    'C'
        call    LCD_CARACTER
        movlw    'R'
        calL    LCD_CARACTER
        movlw    'O'
        calL    LCD_CARACTER
        movlw    'P'
        calL    LCD_CARACTER
        movlw    'R'
        calL    LCD_CARACTER
        movlw    'O'
        calL    LCD_CARACTER
        movlw    'C'
        calL    LCD_CARACTER
        movlw    'E'
        calL    LCD_CARACTER
        movlw    'S'
        calL    LCD_CARACTER
        movlw    'A'
        calL    LCD_CARACTER
        movlw    'D'
        calL    LCD_CARACTER
        movlw    'O'
        calL    LCD_CARACTER
        movlw    'R'
        calL    LCD_CARACTER
        movlw    'E'
        calL    LCD_CARACTER
        call        MOVLCD
        movlw    'S'
        calL    LCD_CARACTER
        call        MOVLCD
        movlw    ' '
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'Y'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    ' '
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'M'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'I'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'C'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'R'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'O'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'C'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'O'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'N'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'T'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'R'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'O'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'L'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'A'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'D'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'O'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'R'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'E'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'S'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    ' '
        call    LCD_CARACTER
        call        MOVLCD

        movlw 0c0
        call LCD_COMANDO

        movlw    'A'
        call    LCD_CARACTER
        call        MOVLCD
  sleep
subrutinas
          CBLOCK
        CONTA1
        CONTA2
        GUARDA_CARÁCTER
        ENDC
PAUSA_5ms
                movlw        7
        movwf        CONTA2
        clrf        CONTA1
RETRASO1
                decfsz        CONTA1,1
        goto        RETRASO1
        decfsz        CONTA2,1
        goto        RETRASO1
        return
LCD_COMANDO
                clrf        PORTA
        movwf        PORTB
        call        LCD_CHEQUEA
        goto        LCD_HABILITA
LCD_CARACTER
        clrf    PORTA
        call    LCD_CARÁCTER_ESPECIAL
        movwf    PORTB
        call    LCD_CHEQUEA
        bsf     PORTA,0
        goto    LCD_HABILITA
LCD_CARÁCTER_ESPECIAL
        movwf    GUARDA_CARÁCTER
        sublw    'ñ'
        btfss    STATUS,Z
        goto    LCD_EÑE_MAYÚSCULA
        movlw    b'11101110'
        movwf    GUARDA_CARÁCTER
        goto    LCD_FIN_CARACTER_ESP

LCD_EÑE_MAYÚSCULA
        movfw    GUARDA_CARÁCTER
        sublw     'Ñ'
        btfss       STATUS,Z
        goto       LCD_GRADO
        movlw    b'11101110'
        movwf    GUARDA_CARÁCTER
        goto       LCD_FIN_CARACTER_ESP
LCD_GRADO
        movfw    GUARDA_CARÁCTER
        sublw      'º'
        btfss      STATUS,Z
        goto       LCD_FIN_CARACTER_ESP
        movlw    b'11011111'
        movwf    GUARDA_CARÁCTER

LCD_FIN_CARACTER_ESP
        movfw    GUARDA_CARÁCTER
        return
LCD_CHEQUEA
        bsf         STATUS,RP0
        movlw        0FF
        movwf        TRISB
        bcf         STATUS,RP0
        bcf         PORTA,0
        bsf         PORTA,1
BUCLE
        bsf         PORTA,2
        movf        PORTB,0
        bcf         PORTA,2
        addlw        84
        btfsc        STATUS,C
        goto        BUCLE
        bsf         STATUS,RP0
        clrf        TRISB
        bcf         STATUS,RP0
        bcf         PORTA,1
        return
LCD_HABILITA
        bsf         PORTA,2
        nop
        bcf         PORTA,2
        return
MOVLCD
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
 call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
 call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        movlw 18
        call        LCD_COMANDO
        return

 END
```

Espero porfavor me puedan ayudar con el codigo.
Gracias


----------



## zealot2 (Jun 15, 2015)

Hola a todos. Se que se va del tema discutido, pero no creo necesario crear un nuevo tema para una pregunta simple. Mas o menos las pantallas de 16x2 que consumo tienen? Sucede que tengo un proyecto con micro PIC18F4680 y una pantalla de estas y en el datasheet no dice el consumo, y dispongo de una trafo de bocinitas de 200mA, pregunto si me servira?. Por supuesto, no pienso usar la iluminacion de la pantalla GC-1602G3 de Goldentek


----------



## Daniel Meza (Jun 15, 2015)

Hola. Con ese transformador basta y sobra; en efecto, el mayo consumo de la pantalla se lo lleva la luz de fondo. Fuera de eso el consumo de la pantalla junto con su lógica anda entre los 5~10mA, depende también del tamaño de la pantalla.

Saludos


----------



## zealot2 (Jun 16, 2015)

Ok, gracias Daniel, manos a la obra entonces


----------

