Control de Display LCD con microcontrolador PIC


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

LCD.gif


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


Conexionado con bus de 8 bits
lcd8bits.gif


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:

lcdtabla.gif


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

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

gclcdpic.jpg


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

muestra1.jpg


Bajar Proyecto

Saludos, espero que lo encuentres interesante.
 
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?
 
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.
 
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,.......
 
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?
 
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.
 
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
 
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
 
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.
 
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.
 
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?


Merci

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


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



[/img]
 
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.
 
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.
 
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
 
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.
 
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...
 
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!
 
Atrás
Arriba