You are on page 1of 7

Construye un LCD para I2C

Cuando trabajamos en proyectos con microcontroladores y debemos mostrar informacin en un LCD, 6 pines dedicados al control de este ltimo pueden ser demasiados. Al comenzar a expandirnos en entradas analgicas o digitales, y a su vez, actuar en el exterior con salidas para rels, indicadores LED y otras aplicaciones, los pines I/O del microcontrolador se agotan rpidamente. Aprende a construir tus propios LCD I2C con slo dos pines. Cuando encontramos soluciones a nuestros inconvenientes cotidianos sentimos alivio y sensacin de bienestar. A muchos de nosotros, quienes nos dedicamos a cacharrear con la electrnica, nos sucede ese fenmeno particular cada vez que descubrimos aplicaciones prcticas y sencillas que nos ayudan a resolver problemas complejos. El bus I2C es una de las herramientas que nos hace ms sencillo el trabajo de interconexin entre un microcontrolador y una interfaz. Ya hemos visto muchas aplicaciones tiles que incorporan el bus I2C en forma nativa: termmetros, potencimetros digitales, preamplificadores de audio, y muchos otras que nos restan ver y analizar. En el caso de los LCD alfanumricos, que utilizamos habitualmente en nuestros desarrollos con microcontroladores, debemos reservar 6 pines (conexin mnima) para su control: RS, EN, D4, D5, D6 y D7, ya que estos displays convencionales, basados en el controlador HD44780, traen un tipo de conexin que involucra muchos cables. La necesidad de los usuarios ha llevado a muchas empresas fabricantes de estos dispositivos a desarrollar entradas de datos seriales, ya sean por Puerto Serie o por bus I2C. Lamentablemente, el precio de estos displays suele ser muy alto comparado con el de un LCD de iguales caractersticas y conexin paralela. Las diferencias monetarias suelen ser del doble o triple de valor. Por lo tanto, lograr desarrollar un circuito econmico que nos permita manejar un display convencional a travs del bus I2C, mediante slo dos pines, puede ser una alternativa muy interesante para ahorrar pines del microcontrolador y, por supuesto, dinero. A esto debes sumarle la posibilidad de manejar muchos displays LCD conectados al mismo bus, donde cada uno tendra una direccin especfica e inequvoca. Es decir, si habitualmente los dispositivos poseen una direccin (address) donde los ltimos 4 bits definen su subdireccin dentro del bus, con slo dos pines podremos manejar hasta 16 LCD conectados a un microcontrolador sencillo de encapsulado pequeo. Seleccionando el microcontrolador Podemos convertir un LCD convencional en un dispositivo I2C a travs de un expansor de puertos controlable por I2C, como puede ser el PCF8574 (del que nos ocuparemos en otro artculo) o un microcontrolador que posea un mdulo SSP (Synchronous Serial Port) integrado en su interior. Un ejemplo de este ltimo tipo de microcontrolador es el 16F819, al que podemos utilizar como unidad I2C esclava (slave) de nuestros proyectos. El costo agregado al LCD ser despreciable respecto a una unidad LCD I2C

comercial. Podremos as construir una unidad a nuestra medida que satisfaga las necesidades de uso y aprovechar el ahorro de pines en el microcontrolador que oficiar de maestro (master). Sin ir demasiado lejos, y con algo de imaginacin, un PIC 12F675 puede:

Ejemplo de un bus I2C tradicional incluyendo nuestro LCD

Controlar un reloj en tiempo real (RTC), basado en un DS1307. Actuar como datalogger, registrando temperaturas tomadas con un STCN75. Almacenar valores mximos y mnimos de temperatura y guardar muestras de los datos obtenidos en una memoria EEPROM, tipo 24C256, capaz de retener enormes cantidades de informacin. Por supuesto, todo este proceso puede ser mostrado en un display LCD de hasta 40 caracteres por 4 renglones. Conectar otros dispositivos que creamos oportunos para nuestro diseo o dejar la conexin preparada para eventuales ampliaciones.

Todo esto se realiza gracias a un sencillo microcontrolador de 4 pines por lado y gracias a la tecnologa del bus I2C. Lo que te proponemos es slo un ejemplo, tu imaginacin es el lmite. Circuito prctico a implementar El circuito es un montaje clsico de conexin, con 4 lneas de datos, un control de contraste mediante P1, un control de tres niveles de iluminacin backlight (0, 50 y 100%) para el LCD, controlado por PWM a travs de T1 (ampliacin a futuro), un conector ICSP para programar el PIC una vez concluido el montaje mecnico de la placa controladora, y algunos capacitores de desacoplo y resistencias de polarizacin. Como podrs observar, y tal como te habamos adelantado, el costo adicional al LCD nunca alcanzar el valor comercial de un display LCD - I2C. Podramos utilizar el clock interno del microcontrolador, pero sera a una frecuencia baja (8 Mhz), tal vez insuficiente para obtener una transferencia de datos a 400 Khz a travs del bus. Un cristal de 20 Mhz nos asegura una frecuencia de trabajo ideal para altas velocidades dentro del bus.

Circuito propuesto con un PIC 16F819

El hardware es sencillo y no debera presentar demasiadas complicaciones. Adems, con cualquier software sencillo puedes desarrollar y construir el circuito impreso (PCB) correspondiente. Generalmente, los modelos comerciales de display LCD con conexin serie traen una placa montada en forma paralela, con separadores plsticos de donde salen y llegan las conexiones de alimentacin, tierra y datos, es decir, 5 Volts, GND, SDA y SCL. El Firmware del PIC Como es habitual en nuestro caso, no vamos a darte los archivos listos para utilizar y customizar a tu gusto. Vamos a compartir contigo los conocimientos que hemos empleado nosotros para lograr el objetivo, pero al trabajo debers realizarlo t mismo. En primera medida, porque no queremos que mueras en el desconocimiento de cmo llegar a realizar este diseo. Y en segundo trmino, porque queremos que lo mejores, lo modifiques, lo replantees desde otro punto de vista y puedas llegar a hacerlo a tu medida y gusto. Luego si lo deseas, puedes compartirlo con nosotros para que mostremos con orgullo tu trabajo de investigacin a partir de la ayuda que aqu te brindamos. No importa cul sea el lenguaje de programacin de microcontroladores que utilices habitualmente; puedes armar la estructura del programa partiendo de los conceptos que te explicaremos de la forma ms didctica que nos sea posible. Ten presente que un programa eficiente requiere de un ajuste de tiempos de transmisin y recepcin que siempre debers respetar. Por ejemplo: cuando le enviemos al LCD (ya transformado en

I2C) una instruccin definida, como puede ser Limpiar Pantalla (CLS o CLEAR), debemos esperar (segn nuestro ejemplo) 30 milisegundos hasta enviar la instruccin siguiente, para darle tiempo al LCD a que recepcione la orden y la ejecute. Debes tener en cuenta, adems, que el ejemplo que te proponemos aqu sirve para los LCD que traen el controlador HD44780 o cualquiera display compatible con ste. Lo primero a tener en cuenta es que utilizaremos dos microcontroladores: uno como maestro y otro como esclavo (Master Slave). El esclavo es el mostrado en el circuito presentado; se trata del 16F819. Al microcontrolador maestro lo seleccionars t cada vez que realices alguna aplicacin. Slo debers ocuparte de acoplarle apropiadamente un dispositivo I2C adicional que ser, en realidad, el microcontrolador que utilizaremos: el 16F819. Armando la estructura del programa Recomendacin inicial: Imprime o ten a mano el datasheet del PIC para poder comprender mejor este texto o para estar ms seguro al armar la estructura de tu programa. Luego de definir el dispositivo a utilizar, su frecuencia de clock y la conexin del LCD segn el circuito propuesto, debes ordenar y configurar los registros que manejan el mdulo SSP (los encontrars en el datasheet del PIC, en la pgina 71, captulo 10.0). El SSPCON es el registro con el que vas a determinar el funcionamiento del PIC en modo I2C Slave, con un direccionamiento de 7 bits. Dentro de este registro tambin se programa el modo de evitar colisiones de datos dentro del bus, la habilitacin de trabajo del bus (Enable) y otros parmetros importantes. El byte o palabra final del registro debe quedar (para un funcionamiento correcto) en 00110110. En la figura 2-3 del datasheet, que se encuentra en la pgina 11, podrs encontrar (en el Bank1, direccin 93h) el registro SSPADD. Este registro se utiliza para escribir en l, al momento de inicializar el sistema, la direccin que tendr nuestro LCD dentro del Bus. En nuestro caso, hemos adoptado la posicin 8, es decir 00001000, pero t utiliza la que desees o te convenga, con tal de que vaya desde 0 a 15 (00000000 a 00001111) para evitar eventuales conflictos con otros dispositivos colgados al bus. Siempre es interesante dotar al sistema de un mensaje de bienvenida al inicializarlo para asegurar su funcionamiento y correcto arranque. Si lo deseas, puedes agregarle al circuito propuesto un pulsador de RESET ante eventuales arranques fallidos. En el ejemplo que puedes ver en el video, existe un mensaje de bienvenida de 2 segundos que nos sirve de aviso de un arranque seguro y efectivo. Tambin debers crear una variable BYTE que utilizars de buffer (donde almacenars cada palabra de 8 bits que ingrese por el bus) a la que volcars en el registro SSPBUF (Bank 0, 13h) para su posterior impresin en el LCD. Una vez que todo esto est listo, ya tienes el sistema en condiciones de comenzar a recibir datos a travs del bus. Luego de recibir un dato vlido (que corresponda a

nuestra direccin), se levantar la bandera de interrupcin SSPIF del registro PIR1 (PIR1.3), y el dato se volcar dentro del registro SSPBUF de manera automtica. Luego t lo transportars dentro de la variable que hayas creado y lo imprimirs en pantalla. Recuerda que por cada dato recibido y vlido debes bajar la bandera SSPIF. Cada byte enviado al LCD (luego de ser cargado en la variable que hace las veces de buffer) ser un caracter ASCII, lo que significa que lo que se ver en pantalla es una seguidilla de caracteres apropiadamente enviados. Ten cuidado con esto ya que no todos los displays de las distintas marcas utilizan el mismo mapa de memoria en los smbolos que se encuentran ms all de la direccin 127 del cdigo ASCII. Tambin debers experimentar con ello al programar el controlador maestro del sistema, leyendo bien la hoja de datos del LCD que uses. Otra alternativa vlida es desarrollar un pequeo soft en el controlador maestro, que te devuelva todos los caracteres que posee tu LCD y que te indique en qu posicin se encuentran. (Mira el video de demostracin). Encontrars un ejemplo muy til de cmo lograr el funcionamiento que te estamos explicando en la siguiente pgina, con su correspondiente cdigo (BASIC). El cdigo realizado por nosotros difiere bastante del mostrado all, pero puede serte muy til para ver todos los registros que intervienen en la habilitacin y el uso del mdulo SSP. Funciones extras Adems de la funcin elemental de poder escribir en la pantalla del LCD los caracteres recibidos, puedes utilizar caracteres no tiles dentro de las direcciones del cdigo ASCII. Nosotros hemos utilizados los nmeros del 1 al 7 para desarrollar las acciones que figuran en la imagen y que tambin se aprecian en el vdeo.

Funciones aplicables al LCD mediante una instruccin de un solo BYTE

Si el PIC detecta un 1 en la entrada de datos, limpiar la pantalla mediante la impresin de la instruccin CLS. Si recibe un 2, se ubicar en el primer espacio del primer rengln (o fila). Con un 3 lo har en el primer espacio del segundo rengln; con un 4, en el tercer rengln; y con un 5, en el primer caracter de la cuarta fila. Un byte cargado con el nmero 6 har aparecer el cursor de forma intermitente, y un 7 se encargar de borrar el mencionado cursor. Notaste que hablamos de cuatro renglones o filas? Esto significa que el programa que te vamos a dejar para que practiques y para que lo instales en un PIC 16F819 te servir para construir tu propio LCD / I2C con cualquier tipo de display (compatible con el controlador HD44780). Tendrs la posibilidad de utilizar cualquier display, independientemente de la cantidad de

renglones que el mismo posea (1, 2, 3 o 4). PIC Maestro Cuando desarrolles el programa a utilizar en el microcontrolador maestro, ten en cuenta cmo y cundo enviarle los datos a tu nuevo display LCD / I2C. Si utilizas Basic, recuerda que lo hacemos con la siguiente estructura:

BSTART Abrimos el bus BUSOUT Direccin, [Dato] Enviamos la direccin y luego el dato BUSTOP Cerramos el bus

Con esta sencilla estructura podremos manejar el LCD. Un ejemplo de uso de la instruccin BUSOUT sera la siguiente:

BUSOUT %00001000, [Hola Mundo]

Podemos ver que es muy sencillo escribir un texto, es decir, un dato o una cadena de datos. Luego, para limpiar la pantalla, enviaremos el siguiente comando:

BUSOUT %00001000, [1]

El 1 enviado significa que el programa del 16F819 debe limpiar la pantalla del LCD. Observa tambin la estructura diferente al enviar un dato numrico o un string, el cual debe encerrarse entre comillas. Ten en cuenta que, luego de enviar un dato numrico, tendrs que agregar un retardo de 30 milisegundos hasta enviar la siguiente instruccin, ya que en el programa que te dejamos hemos determinado esa condicin. Y el ltimo punto importante a tener en cuenta es que cada vez que escribas un rengln, debers hacerlo ocupando 40 espacios (a pesar que tu LCD sea de 8, 16 o 20 caracteres). Es decir, si deseas escribir Hola NeoTeo, debers hacerlo de la siguiente forma:

BUSOUT %00001000, [ Hola NeoTeo

Ejemplo de cmo se vera una secuencia de instrucciones hacia el LCD-I2C

Debes dejar 40 espacios entre las comillas. Por qu lo hacemos as? Pues muy sencillo. Con el programa que te brindamos, puedes utilizar cualquier tipo de display, hasta incluso los de 4 filas y 40 caracteres. Si hubisemos limitado las filas a slo 2, y los caracteres a 16, habra muchos desarrollos en los que no te sera til el sistema que te brindamos. En cambio, de esta forma, puedes utilizar el LCD que sea, en la aplicacin que sea, sin restricciones. Descarga el ejemplo de los videos desde aqu. (Slo el archivo HEX para el PIC 16F819)