Está en la página 1de 20

INTRODUCCIN al control del LCD (HD44780)

El control de un mensaje, la impresin de una frase en un display, puede realizarse de varias maneras, las cuales, se diferencian no solo en la tcnica de impresin del dato a visualizar, si no que tambin en el tiempo que radica la funcin de cada uno de los modos, y el tamao u espacio de memoria que consumimos. Sin importar el lenguaje con el cual nosotros controlaremos el driver del display; Uno de los mtodos mas destacados para muchos que suelen trabajar con tablas y obtener un tiempo de ejecucin un poco ms rpido, es la implementacin de la tcnica de impresin de caracteres ASCII a travs de 8 lneas de datos. Esta opcin, nos permite crear mensajes dibujados en el display obteniendo as, ms espacio o ms recursos para mostrar nuestros mensajes (en este caso, no vamos a trabajar en este modo, pero mas adelante, les ensearemos como hacerlo) El otro mtodo, que es el mtodo que noto mas agradable por que no hay manera de tener muchos errores y para mi es el mas practico, es el empleo de impresin de frases alojadas en espacios de memoria. Este mtodo nos limita a la implementacin de 255 letras, que por ende, nos reduce la cantidad de palabras. Las grandes diferencias entre un mtodo y otro, no solo ronda bajo el tiempo y espacio de memoria que requiere el mtodo de ejecucin, si no que tambin hay que destacar que con uno podemos obtener grandes efectos de visualizacin y el otro no, y que con uno, podemos ver que escribimos en el programa y en el otro noMuchas vueltas no? veamoslo de la siguiente manera mas grafica

Imgenes superiores mtodo ASCII Imagen inferior, mtodo de carcter definido en espacio de memoria

El manejo de un LCD, no es nada del otro mundo si comprendemos la base de la arquitectura de un modulo LCD. Al principio puede resultarnos un poco engorroso el tema, por que por ah no tuvimos la oportunidad de interiorizarnos un poco mas principalmente como funcionan estos y que hacen cada pin de los mdulos mas bsicos, comunes y o comerciales; En mi opinin, creo que comprendiendo cual es la funcin de cada pin (patillaje o contacto), cuales son los pasos que se requiere para el control, son los mnimos datos e informacin, que puede sernos til para aplicarla en cualquier lenguaje de programacin. En forma muy breve, tratare de explicarles un paso a paso de cmo funcionan estos internamente y como podemos establecer un control sobre el flujo de informacin que va desde el microcontrolador al LCD.

1_ Sntesis de Arquitectura del LCD


Los mdulos LCD, llevan integrado a sus circuitos, 3 espacios de

memorias que sern la base fundamental para el funcionamiento del modulo. Por un lado, tenemos dos locaciones donde albergan datos temporalmente con caractersticas RAM. Estos dos espacios, son las llamadas CGRAM y DDRAM, que son en si los espacios donde se almacenan los datos que se van a emplear para mostrar en pantalla. La diferencia entre una y otra, es que la CGRAM (Character Generator RAM), nos permite definir y alojar 8 nuevos caracteres personalizados; Osea, en la CGRAM, es donde se alojan los caracteres creados por el usuario con matrices personalizadas, y la DDRAM (Data Display RAM), es un espacio temporario donde se almacenan los caracteres que se van a mostrar en pantalla. La DDRAM, tiene una capacidad de 80 bytes, 40 por cada lnea, de los cuales slo 32 se pueden visualizar a la vez (16 bytes por lnea). De las 80 posibles, las dos direcciones ms importantes de la DDRAM son: Direccin 00h, que es el comienzo de la primera lnea Direccin 40h, que es el comienzo de la segunda lnea Por otro lado, tenemos un espacio de memoria interna no voltil del tipo ROM, llamada CGROM (Character Generator ROM), que es donde se almacena una tabla con los 192 caracteres que pueden ser visualizados (ver el siguiente cuadro). Cada uno de los caracteres tiene su representacin binaria de 8 bits. Para visualizar un carcter debe recibir por el bus de datos el cdigo correspondiente.

Configuracin de las direcciones de la CGRAM Como ya sabemos, el mdulo LCD adems de tener definidos todo el conjunto de caracteres ASCII, permite al usuario definir 4 u 8 caracteres grficos. La composicin de estos caracteres se va guardando en una memoria llamada CG RAM con capacidad para 64 bytes. Cada carcter grfico definido por el usuario se compone de 16 u 8 bytes que se almacenan en sucesivas posiciones de la CGRAM. Mediante esta instruccin se establece la direccin de la memoria CGRAM a partir de la cual se irn almacenando los bytes que definen un carcter grfico. Ejecutado este comando todos los datos que se escriban

Ahora, vallamos a un ejemplo prctico suponiendo que queremos representar el nombre o la palabra Ucontrol implementando la CGRAM Veamos un sencillo ejemplo de cmo implementar el mtodo de una matriz:

La implementacin de la matriz, es mucho mas que sencilla, pues como vern, el mtodo es valido tanto para el empleo de rutinas en ASM, como para rutinas en Basic para Picaxe. Tan solo debemos colocar los valores en forma de 1s y 0s; Donde el cero son los espacios libres, y 1 el espacio marcado en negro Un efecto visual atractivo, podra hacerse con la inversa de esta regla para obtener un fondo oscuro y un carcter claro

El resultado por ejemplo para poder definir un carcter CGRAM en un microcontrolador PICAXE, estara dada por ejemplo, como lo indico en esta sencilla tabla:

Si les interesa mucho esta parte de cmo generar caracteres propios, les recomiendo el siguiente articulo presentado en Ucontrol por el Sr Pedro (PalitroqueZ) Generador de Caracteres CG-RAM, el aliado perfecto para programar LCDs.

Configuracin de las direcciones DD Los caracteres o datos que se van visualizando, se van almacenando previamente en una memoria llamada DD RAM para de aqu pasar a la pantalla. Mediante esta instruccin se establece la direccin de memoria DD RAM a partir de la cual se irn almacenando los datos a visualizar. Ejecutado este comando, todos los datos que se escriban o lean

posteriormente los hacen desde esta memoria DD RAM. Las direcciones de la 80h a la 8Fh corresponden con los 16 caracteres del primer rengln y de la C0h a la CFh con los 16 caracteres del segundo rengln, para el modelo 44780.

Lectura de Flag BUSY en la direccin Cuando el mdulo LCD est ejecutando cualquiera de estas instrucciones, tarda un cierto tiempo de ejecucin en el que no se le debe mandar ninguna otra instruccin. Para ello dispone de un flag llamado BUSY (BF) que indica que se est ejecutando una instruccin previa. Esta instruccin de lectura informa del estado de dicho flag adems de proporcionar el valor del contador de direcciones de la CG RAM o de la DD RAM segn la ltima que se haya empleado.

Escritura de datos en CG o DD RAM Mediante este comando se escribe en la memoria DDRAM los datos que se quieren presentar en pantalla y que sern los diferentes cdigos ASCII de los caracteres a visualizar. Igualmente se escribe en la memoria CGRAM los diferentes bytes que permiten confeccionar caracteres grficos a gusto del usuario. El escribir en uno u otro tipo de memoria depende de si se ha empleado previamente la instruccin de direccionamiento DD RAM o la de direccionamiento CG RAM.

Lectura de dato desde CGRAM o DDRAM Mediante este comando se lee de la memoria DD RAM los datos que haya almacenados y que sern los cdigos ASCII de los caracteres visualizados. Igualmente se lee de la memoria CG RAM los diferentes bytes con los que se ha confeccionado un determinado carcter grfico. El leer de uno u otro tipo de memoria depende de si se ha empleado previamente la instruccin de direccionamiento de la DD RAM o la de direccionamiento CG RAM.

2_Hardware para control del LCD en modo 4bits


Ahora bsicamente, trataremos de ver que funcin cumple cada pin en el patillaje de un modulo LCD 16x2 , y las conexiones bsicas para el control de estos con un microcontrolador PICAXE en modo 4 bits (atentos a esto ultimo, ya que en modo 4 bits, no funcionan los caracteres CGRAM, estos ltimos solo funcionan en modo 8 con un picaxe 18).

2A_ Conexin Interface Microcontroladores PIC


RBO-RB7 Estn conectadas a las lneas de datos DO-D7 del mdulo. A travs de los puerto B, se envan cdigos ASCII o de control al mdulo o, se recibe por parte de este, el estado interno del mismo. EL Port B habr que programarlo como salida cuando se vayan a enviar cdigos ASCII o de control y como entrada cuando se desee conocer el estado interno del mdulo. RA0: Se conecta con la seal de control R/S. Sacando un nivel lgico "0" por esta lnea se selecciona el registro de control del mdulo. Sacando un nivel lgico " 1 " se selecciona el registro de datos. Esta lnea debe programarse como salida. RA1: Se conecta con la seal R/W. Sacando un nivel lgico "0" por ella, el mdulo es escrito con la informacin presente en ese momento en el Port B que deber actuar como salida. Sacando un " 1 " se lee el estado interno del mdulo LCD. Dicho estado se recibe a travs del Port B que deber estar programado como entrada. La lnea RA1 debe programarse como salida. RA2: Se conecta con la seal E. Cuando se aplica un nivel "1" el mdulo queda habilitado y es posible por tanto la transferencia de informacin entre el Port B y las lneas de datos DO-D7. Aplicando un "0" el mdulo queda desconectado y sus lneas de datos DO-D7 en alta impedancia. RA2 debe programarse tambin como salida.

2B_ Conexin Interface Microcontroladores PICAXE


Out4-5-6-7 Estn conectadas a las lneas de datos D4-D5-D6-D7 del mdulo. A travs por tanto, de la puerta B, se envan cdigos ASCII o de control al mdulo o, se recibe por parte de este, el estado interno del mismo. En el sistema de Picaxe, si bien podemos reconfigurar nuestros puertos para transformarlos en entradas u salidas, en este caso solo emplearemos estos puertos como salidas para enviar cdigos ASCII o de control interno del modulo. Out2: Se conecta con la seal de control R/S. Sacando un nivel lgico "0" por esta lnea se selecciona el registro de control del mdulo. Sacando un nivel lgico " 1 " se selecciona el registro de datos. RW En el caso de los microcontroladores Picaxe, RW no va conectado a ningn puerto del microcontrolador y se conecta directamente a GND para darle as un nivel lgico "0", el cual configura al modulo LCD para trabajar en modo de impresin de dato presente en el momento. Out3: Se conecta con la seal E. Cuando se aplica un nivel "1" el mdulo queda habilitado y es posible por tanto la transferencia de informacin entre los puertos del Picaxe (Out4-5-6-7) y las lneas de datos D4-D5-D6 y D7. Aplicando un "0" el mdulo queda

desconectado y sus lneas de datos D4-5-6-7 en alta impedancia no permitiendo entrar ningn dato.

3_ Rutinas para el control estndar de un modulo LCD 16x2 con PICAXE


El mdulo LCD ejecuta automticamente una secuencia de inicio interna en el instante de aplicarle la tensin de alimentacin si se cumplen los requisitos de alimentacin expuestos en el siguiente cronograma. Dichos requisitos consisten en que el tiempo que tarde en estabilizarse la tensin desde 0.2 V hasta los 4.5V mnimos necesarios sea entre 0.1 mS y 10 mS. Igualmente el tiempo de desconexin debe ser como mnimo de 1 mS antes de volver a conectar.

La secuencia de inicio ejecutada es la siguiente:

Si la conexin de la alimentacin no rene las condiciones que exige el mdulo LCD, habra que realizar la secuencia de inicializacin por software. En cualquier caso, es importante enviar al LCD la primera instruccin de trabajo despus de que hayan transcurrido 15 ms, para completar dicha secuencia de inicializacin.

Ahora, veamos las distintas rutinas en un microcontrolador PICAXE, para el control de un LCD

Definiendo variables de control para el LCD


Antes de comenzar todo programa de control e impresin de pantalla, las siguientes variables deben definirse
Cdigo: SYMBOL SYMBOL SYMBOL SYMBOL SYMBOL SYMBOL SYMBOL SYMBOL SYMBOL SYMBOL SYMBOL RS E DB4 DB5 DB6 DB7 = 2 = 3 = 4 = 5 = 6 = 7 ; 0 = Comando ; 0 = Idle 1 = Dato 1 = Activa

; LCD Lnea Dato 4 ; LCD Lnea Dato 5 ; LCD Lnea Dato 6 ; LCD Lnea Dato 7 ; Seleccin registro de Comando ; Seleccin registro de Dato

RSCMDmask = %00000000 RSDATmask = %00000100 get byte = b11 = b12

rsbit = b13

La variable "byte" slo se utiliza en la rutina para especificar los datos que se envan utilizando los comandos SendDataByte y SendCommandByte. Los espacios b11 y b12, si bien se implementan al inicio del programa para definir unas variables, luego de estar ya corriendo el programa, estas pueden ser implementadas para otras funciones, pero tenga en cuenta, que cuando este el llamado al comando

InitialiseLcd, estas volvern a tomar el valor predefinido al principio perdiendo el nuevo valor asignado La variable rsbit debe preservarse intacta durante la operacin del programa. Tanto b13 y en consecuencia w6, no deben ser utilizadas u modificadas para otros usos que no sean expresamente para el control estndar del LCD.

NOTA: En algunos compiladores, la palabra BYTE, nos puede generar un error que de seguro, en algn momento lo solucionara la empresa Revolutions Actions (Yo por mi parte, ya contribu para con ellos presentndoles el error),asi que por el momento quienes tengan este error al momento de compilar, podemos solucionarlo con tan solo cambiar una letra dejndolo como BITE (ejemplo: SendDataByte por SendDataBite)

Control del LCD


Hay tres rutinas que se utilizan para inicializar el LCD y el control ...

GOSUB InitialiseLcd

; Inicializar LCD

byte = ...

; Enviar byte al registro de datos del LCD

GOSUB SendDataByte

byte = ... ; Enviar byte al registro de comandos del LCD GOSUB SendCmdByte

La rutina InitialiseLcd debe ser siempre llamada una vez al comienzo del programa. Los comandos SendDataByte y SendCmdByte, se utilizan para enviar bytes de datos a los registros de comandos y datos del LCD. Esto

permite que los datos, el cursor y otros atributos que se visualizan en la pantalla del LCD pueda ser alterado a gusto propio de nuestro programa. Antes de llamar a cualquiera de las dos rutinas para imprimir el mensaje, el byte de datos que se quiera enviar, debe ser introducido en una variable.

Iniciacin de LCD

Cdigo: InitialiseLcd: FOR get = 0 TO 5 READ get,byte GOSUB SendInitCmdByte NEXT ' Nibble commands Para inicializar en modo 4-bit EEPROM 0,( $33 ) EEPROM 1,( $32 ) ; %0011---- %0011---; %0011---- %0010---8-bit / 8-bit 8-bit / 4-bit

' Byte comando para configuracin del LCD EEPROM 2,( $28 ) EEPROM 3,( $0C ) EEPROM 4,( $06 ) ; %00101000 %001LNF00 ; %00001100 %00001DCB ; %00000110 %000001IS Formato Display Display On Mueve Cursor

; L : 0 = 4-bit Mode ; N : 0 = 1 Linea ; F : 0 = 5x7 Pixels ; D : 0 = Display Off ; C : 0 = Cursor Off ; I : 0 = Dec Cursor ; S : 0 = Mueve Cursor EEPROM 5,( $01 ) RETURN ; Limpia pantalla

1 = Modo 8-bit 1 = 2 Lineas 1 = N/A 1 = Display On 1 = Cursor On 1 = Inc Cursor 1 = Display Shift

; B : 0 = Cursor Steady 1 = Cursor Flash

Rutinas de la interface del LCD


Cdigo: SendInitCmdByte: PAUSE 15 SendCmdByte: rsbit = RSCMDmask SendDataByte: pins = byte & %11110000 | rsbit ; Put MSB out first PULSOUT E,1 PULSOUT E,1 rsbit = RSDATmask next RETURN ; Give a 10uS pulse on E ; Give a 10uS pulse on E ; Send to Data register pins = byte * %00010000 | rsbit ; Put LSB out second ; Send to Command register ; Delay 15mS at 4MHz

Como puede verse, las tres rutinas (SendInitCmdByte SendCmdByte - SendDataByte) estn estrechamente integradas, que es la clave para la compacidad del cdigo del programa. La variable "rsbit 'se utiliza para guardar y no perder de vista los registros escritos con los comandos del LCD o registro de datos, y debe ser preservado sin otro tipo de uso, entre las llamadas de las rutina "SendDataByte. La rutina SendCmdByte, simplemente establece que en la variable rsbit, se alojen los datos de los comandos o registros y vallan al LCD. La rutina de 'SendDataByte" se basa en el momento en que se llama a la variable rsbit y se enva este dato al LCD. La rutina de SendInitCmdByte" se utiliza exclusivamente para enviar los bytes empleados en los comandos para el registro del control LCD durante la inicializacin de la pantalla LCD Las rutinas de inicializacin de un LCD estn muy claramente definidas, y los que estn familiarizados con ellos en otros lenguajes,

podrn observar que esta iniciacin del LCD que se implementada en el cdigo no se ajusta enteramente a la secuencia y las temporizaciones especificadas anteriormente en el principio del artculo. Bien, digamos que tenemos en mano, una excepcin y en la practica, esto no presenta problemas en algunos display LCD, como por ejemplo el HD44780 y los procesadores LCD 100% compatibles (Sharp Phillips LG entre otros). Si puedo mencionar, que hay algunos mdulos comerciales que son muy celosos con el orden de ejecucin en las secuencias y los tiempos de ejecucin. Siempre, antes de comprar o implementar un modulo, traten de ver la hoja de datos de este, y comparen esta con la hoja de datos del HD44780; Por lo general, solo los GLCD son los que presentan mas conflictos, y abordaremos ese tema en nuestro prximo articulo, ya que tiene solucin y no escapa de nuestras manos. Volviendo al tema, en gran parte del cdigo o rutina de iniciacin del LCD, podrn ver una serie de retrasos implementados a medida que progresa la iniciacin. Este cdigo utiliza un retraso fijo de 15ms entre cada byte enviado. A esto, se le suma un par de demoras mas en la iniciacin, que equivalen a menos de 100mS en total, pero es el resultado que se obtiene por la gran reduccin del cdigo del programa, comparndolo con la rutina implementada en ASM (al final del articulo, les citare un ejemplo de estas rutinas). El retraso de 15ms, osea PAUSE 15, se emplea en 4 MHz; Para empleos en modo 8MHz, se extiende la demora a 30ms, osea PAUSE 30; Y cuando se opera en 16MHz el retraso se extiende a 60ms, osea PAUSE 60. Las dos instrucciones PULSOUT E, 1, se adaptan a cualquier

velocidad de operacin sin ocasionar ningn tipo de problemas. Las rutinas, deben de tener tiempos de ejecucin propias y no externas alojadas en variables, por dos motivos... Uno, por que ocupamos espacios innecesarios, y la otra, para asegurar que los datos no son enviados al LCD hasta que el LCD este listo para enviar los siguientes datos. Por lo general, estas velocidades implementadas en las ejecuciones de las rutinas en el microcontrolador PICAXE, como mencione anteriormente no deberan presentar ningn problema, incluso en 16MHZ; Pero puede pasar que al experimentar sus propias rutinas de iniciacin mas acortadas, estos comandos puede que presenten algn error; Pero nada de otro mundo, ya que aadiendo unos retrasos de 2ms despus de la ejecucin de cada uno de estos, logramos corregir el conflicto. Hay otro mtodo de iniciacin de LCD mucho mas corto que no voy a mostrarla, por que eso los llevara a confusiones y o errores en sus practicas; solo lo menciono, por que de seguro ustedes rpidamente las vern al cabo de un par de pruebas y compresin del funcionamiento de un LCD.... El comando que implementamos para regresar a la rutina ($ 02 y $ 03), puede ser reemplazado por una instruccin que establezca explcitamente la posicin del carcter siguiente a escribir y luego pegue el salto; exceptuando obviamente los momentos donde implementamos scrooll u otros tipos de desplazamientos de pantallas

Los comandos ms comunes que se enviaras al LCD son los siguientes:


Borrado de pantalla:

Cdigo: byte = $01 : GOSUB SendCmdByte PAUSE 2 ; limpiar Display ; retardo

Programacin de caracteres definidos por el usuario (8bits):


Cdigo: byte = $40 : GOSUB SendCmdByte ; Carcter definido por usuario 0 ; Carcter definido por usuario 1 ; Carcter definido por usuario 2 ; Carcter definido por usuario 3 ; Carcter definido por usuario 4 ; Carcter definido por usuario 5 ; Carcter definido por usuario 6 ; Carcter definido por usuario 7 byte = $48 : GOSUB SendCmdByte byte = $50 : GOSUB SendCmdByte byte = $58 : GOSUB SendCmdByte byte = $60 : GOSUB SendCmdByte byte = $68 : GOSUB SendCmdByte byte = $70 : GOSUB SendCmdByte byte = $78 : GOSUB SendCmdByte

Especificacin de dnde escribir:


Cdigo: byte = $80 : GOSUB SendCmdByte byte = $C0 : GOSUB SendCmdByte byte = $A0 : GOSUB SendCmdByte byte = $E0 : GOSUB SendCmdByte ; comienzo en la linea 1 ; comienzo en la linea 2 ; comienzo en la linea 3 ; comienzo en la linea 4

Asi como podemos especificar donde escribir, podemos situar el cursor donde escribira el siguiente carcter, es decir, podemos seleccionar la posicin en el LCD deseada. Cada posicin del LCD tiene asociada una direccin concreta en la memoria de texto, de forma que para mostrar un carcter en esa posicin concreta hay que escribir sobre su direccin de memoria asociada. Por lo general en los display LCD que solo hacen uso de una lnea, esta comienza en la direccin 00h de la memoria de texto. En cambio, en los LCDs que hacen uso de dos lneas, la primera lnea tambin comienza en la direccin 00h, mientras que la segunda lnea comienza en la direccin 40h. Veamos el siguiente esquema: