You are on page 1of 9

Manejo de display LCD con microcontrolador HC08

(Eduardo Ortiz) Este documento es una gua bsica para trabajar con un display LCD alfanumrico utilizando un micro Freescale de la familia HC08, para aquellos que se estn iniciando en el uso de estos microcontroladores. Se muestra el conexionado fundamental, y se ver un ejemplo de programa como rutina de prueba del display. Se asume que el lector est iniciado en ste tipo de micros (arquitectura, set de instrucciones, etc.) y tiene al menos una idea del funcionamiento de los display LCD. En este ejemplo, usaremos un display LCD alfanumrico de 2 lneas con 16 caracteres cada una. Trabajaremos con envo de datos de 8 bits (paralelo), ya que es ms simple para comprender el manejo del display al principio. El objetivo es, entonces, escribir algunos caracteres en ambas lneas del display, para comprender el funcionamiento y constatar la correcta comunicacin entre micro y LCD. Con sta base, luego se podrn hacer programas de mayor complejidad. Tendremos, entonces, los siguientes pines para manejo del display: Datos (D0 a D7) Pin E (habilita el display) Pin RS (le dice al display si le estamos enviando un dato o una instruccin de control).

El Pin del display R/W no ser utilizado ahora, y debemos conectarlo a masa del circuito. El ejemplo servir para usar un microcontrolador de Freescale de cualquier tipo de la familia HC08, siempre que tenga al menos un puerto entero (con sus ocho bits disponibles). Por ejemplo: MC68HC908JL3, de 28 pines, 4K de flash, 128 bytes de RAM. MC68HC908JK3, de 20 pines, 4K de flash, 128 bytes de RAM. MC68HC908JK1, de 20 pines, 1,5K de flash, 128 bytes de RAM.

Cualquiera de stos micros tiene el puerto PTB completo disponible. Para ste ejemplo usaremos el JK1, ya que es el ms econmico para empezar.

Es importante contar con la hoja de datos del micro que utilicemos, antes de iniciar cualquier tarea, y estudiarla atentamente. El circuito propuesto es el de la siguiente figura:

Podemos utilizar otro cristal, ya que el de la figura es solo una propuesta. En el pin 20 vemos un simple circuito de reset, si bien podemos dejar sin conectar este pin para que acte el Power On Reset del micro. Es muy importante colocar los capacitores C3 y C5 lo ms cerca posible de los pines de alimentacin del micro, lo que nos evitar problemas en su funcionamiento por ruidos o perturbaciones en la alimentacin. Como se ve, todo est alimentado con 5 Volt. Vemos que el PTB se usa completo para el envo de datos al display, y se a elegido PTD2 para el pin E y PTD5 para el pin RS. R/W se deja a masa, ya que solo enviaremos datos a la RAM del display, pero no leeremos nada de la misma. Los pines de Backlite no estn conectados, pues eso depender del tipo de display a ser usado. Para una prueba bsica, se puede conectar el backlite a +5V a travs de una resistencia de 10 ohm (pin +BCKL) y a masa (pin BCKL), si es que el display que usamos tiene backlite (iluminacin posterior). Por ltimo, el pin Vo (contraste) est conectado a un preset (resistencia variable) para dar a ese pin la tensin ms conveniente, segn el tipo de display, que nos proporcione la mejor definicin visual en los caracteres.

Procedimiento Bsico
En este sencillo programa, debemos realizar los siguientes pasos: 1- Inicializar el microcontrolador y sus variables. 2- Inicializar el display LCD 3- Enviar cuatro caracteres a escribirse en la lnea superior del display, y cuatro caracteres en la lnea inferior.

Inicializacin del Microcontrolador


Debemos tener en cuenta qu tipo de entorno de desarrollo estamos usando (P&E o Code Warrior en alguna versin). Aqu no entraremos en detalles acerca de esos entornos. El lector sabr adaptar estas rutinas al entorno de desarrollo que conoce. Tenemos a continuacin un listado de inicio bsico para el JK1: ******************************************************* * PRUEBA DE DISPLAY LCD 1602 ******************************************************* Include 'jk1_registers.inc' RAMStart EQU $0080 ; Direccin de Inicio RAM ROMStart EQU $F600 ; Direccin de Inicio ROM VectorStart EQU $FFDE ; Dir. Inicio Area de vectores ******************************************************* *AREA DE VARIABLES EN RAM (en ste prueba no se usa ninguna * variable de RAM) ******************************************************* ORG RAMStart *Registro temporario del acumulador TEMPA RMB 1 *Registro temporario del indice TEMPX RMB 1 ****************** ASIGNACION DE PUERTOS ********************* ED EQU 2 ;para PTD2 RS EQU 5 ;para PTD5 ************************************************************** ********************* AREA DE PROGRAMA ******************** ************************************************************** ORG ROMStart ************************************************************** * Start - Aqui arranca despues de un RESET * * INICIALIZACION DE VARIABLES. * ************************************************************** Start RSP SEI CLR PTB ;Limpia puerto B CLR PTD ;Limpia puerto D

MOV #$0C,DDRD ;PortD(2-5) COMO SALIDA MOV #$FF,DDRB ;PortB COMPLETO COMO SALIDA *INICIALIZACION DE TIMER MOV #$30,TSC ;stop y reset timer. Prescaler=1 MOV #$00,TSC ;libera timer, con prescaler=1 ***********************************************************

Inicializacin del Display


Es importante tener las hojas de datos del fabricante del display que vayamos a utilizar. En ellas encontraremos la informacin de pines, estructura de la memoria DDRAM, instrucciones y comandos, etc. La mayora de los LCD trabajan de la misma manera, inclusive aunque sean de distintos fabricantes, pero no debemos descartar que haya diferencias, sobre todo en la plantilla de caracteres que cada display tiene disponible. Hay dos cosas que comunicar al display: 1- Instrucciones de control, lo cual haremos mediante una rutina llamada WCTRL (escribe control). Las instrucciones se escriben generalmente en Hexadecimal, ya que son configuraciones de bits especficos en el byte de control enviado. 2- Datos, que se envan mediante la rutina WDAT (escribe dato). La manera mas sencilla de hacerlo es usando el cdigo ASCII del carcter que estamos queriendo mostrar en display. Sin embargo, nada podemos hacer antes de inicializar el display, lo cual significa que le enviemos una serie de instrucciones que le dirn cmo queremos que trabaje. Estas instrucciones deben enviarse respetando una temporizacin mnima que depende de cada display en particular, es decir que no podemos mandar toda la serie de comandos seguidos, ya que el display no tendr tiempo de procesar la informacin, y se inicializar errneamente resultado: Nunca mostrar NADA de lo que pretendamos. Veamos un ejemplo de inicializacin de display, que nos servir para nuestro objetivo: *Inicializacin del Display JSR DELAY50 LDA #$38 JSR WCTRL JSR DELAY50 LDA #$38 JSR WCTRL JSR DELAY50 LDA #$38 JSR WCTRL

;%00111000 ;Function Set- 8-bit,2-line,5X7 ;%00111000 ;Function Set- 8-bit,2-line,5X7 ;%00111000 ;Function Set- 8-bit,2-line,5X7

JSR DELAY50 LDA #$0C JSR WCTRL ;Display on, Cursor off LDA #$06 JSR WCTRL ;Entry mode- Inc addr, no shift LDA #$01 ;Clear Display JSR WCTRL *Fin de inicializacin del Display Como se ve, el primer comando se enva tres veces (ver hoja de datos para ms detalles) y luego de cada envo se llama una rutina delay de 50mS. Este tiempo supera ampliamente el especificado por cualquier fabricante, y lo haremos de sta manera para seguridad en sta prueba. En desarrollos posteriores ser conveniente optimizar este retardo al valor necesario. Tambin se llama la DELAY50 antes de mandar la primera instruccin, para permitir que se estabilice todo el hardware antes de comenzar este proceso. Segn los comentarios, con la primera instruccin (repetida tres veces) le estamos diciendo al display que trabajaremos con palabra de ocho bits, en display de dos lneas, y con tamao de carcter de 5x7 puntos. La siguiente instruccin enviada ($0C) enciende el display e inhabilita la muestra del cursor, que no usaremos ahora. La instruccin siguiente ($06) ordena al display que incremente la direccin de muestra. Esto es, luego de escribir un carcter, el display automticamente apuntar a la direccin siguiente para que escribamos el que sigue. Por lo tanto, los caracteres de datos que enviemos se irn escribiendo uno detrs del otro, de izquierda a derecha. Por ltimo, enviamos el comando de borrado ($01) que limpia la DDRAM y por lo tanto toda muestra que hubiere en la pantalla. De esta forma, ya estamos listos para enviar datos (letras, nmeros, smbolos) al display, y probar su funcionamiento. Cabe acotar que existen otros mtodos de retardo ms ptimos que el uso de una rutina delay, pero ste sirve a nuestro propsito actual.

Rutinas WCTRL y WDAT


Antes de seguir hacia nuestro objetivo, veremos cmo trabajan estas rutinas fundamentales de la comunicacin con el LCD. ************************************************* *Rutina que escribe un caracter de control en el display. La *instruccin viene en el acumulador. *************************************************

WCTRL

STA PTB BSET ED,PTD ;E-> 1 NOP BCLR ED,PTD ;E-> 0 RTS ************************************************** WCTRL toma lo que viene en el ACC y lo saca por el Puerto PTB. Luego habilita el display haciendo ED=1, espera sin hacer nada (instruccin NOP del micro: no operacin) y vuelve a inhabilitar el display con ED=0. El paso siguiente (RTS) es el retorno de esta rutina. La demora que da el NOP, depender del cristal utilizado. Eventualmente debemos colocar en ese lugar varios NOP para ensanchar el pulso de habilitacin, si la frecuencia del clock es alta (conviene remitirse a la hoja de datos del display para ver su tiempo de habilitacin mnimo), pero si usamos un cristal de 4,00 Mhz no tendremos ningn problema. Veamos ahora la WDAT: ************************************************* *Rutina que escribe un caracter de dato en el display. El *dato viene en el acumulador. ************************************************* WDAT STA PTB BSET RS,PTD ;RS->1 BSET ED,PTD ;ED->1 NOP BCLR ED,PTD ;ED->0 BCLR RS,PTD ;RS->0 RTS ************************************************** WDAT es muy similar a WCTRL. La diferencia radica en que avisamos al display que el carcter enviado ser un dato y no una instruccin, haciendo RS=1 antes de habilitar, y RS=0 luego de inhabilitar.

Envo de datos al display


La memoria de este display (que es lo que en definitiva muestra en su pantalla) est organizada de la siguiente forma:
00$ 01$ 02$ 03$ 04$ 05$ 06$ 07$ 08$ 09$ 0A$ 0B$ 0C$ 0D$ 0E$ 0F$ 40$ 41$ 42$ 43$ 44$ 45$ 46$ 47$ 48$ 49$ 4A$ 4B$ 4C$ 4D$ 4E$ 4F$

Tenemos entonces que la primera lnea se inicia en la direccin $00, y la segunda en la direccin $40. Si queremos escribir un dato en la primera lnea, tercer carcter, debemos antes decirle al display que coloque su direccin de 6

escritura all Cmo lo hacemos? Bien, enviando como instruccin esa direccin, con el bit 7 en alto, es decir: LDA #$03 ORA #$80 JSR WCTRL ;Toma la direccin deseada ;ACC=10000011 (aade bit7=1) ;Enva la instruccin (direccin DDRAM a escribir)

Luego, enviamos el dato mediante la rutina WDAT, y se escribir en el lugar propuesto. Supongamos que deseamos escribir la letra M: LDA #`M JSR WDAT ;Esto indica M en ASCII ;Enva el dato

Tendremos as la letra M mostrndose en el tercer carcter de la L1. Como en la inicializacin del display le ordenamos auto incrementar la direccin de la DDRAM, si queremos escribir varios caracteres seguidos solo tenemos que enviar una sola vez la direccin de inicio de esa cadena de caracteres. As, si queremos escribir TODO BIEN usando ambas lneas, podemos listar la rutina como sigue: ******************************************************* *CARTEL1 es una rutina que escribe un cartel de prueba. ******************************************************* CARTEL1 LDA #$00 ;Direc. primer carcter L1 ORA #$80 JSR WCTRL LDA #'T' JSR WDAT ;Enva letra T LDA #'O' JSR WDAT ;Enva letra O LDA #'D' JSR WDAT ;Enva letra D LDA #'O' JSR WDAT ;Enva letra O LDA #$40 ;Direc. Primer carcter L2 ORA #$80 JSR WCTRL LDA #'B' JSR WDAT ;Enva letra B LDA #'I' JSR WDAT ;Enva letra I LDA #'E' JSR WDAT ;Enva letra E LDA #'N' JSR WDAT ;Enva letra N RTS *Fin de CARTEL1 *******************************************************

El resultado debera verse similar a la figura siguiente (se han dejado las direcciones para una mejor comprensin del proceso):
00$ T 40$ B 01$ O 41$ I 02$ D 42$ E 03$ 04$ 05$ 06$ 07$ 08$ 09$ 0A$ 0B$ 0C$ 0D$ 0E$ 0F$ O 43$ 44$ 45$ 46$ 47$ 48$ 49$ 4A$ 4B$ 4C$ 4D$ 4E$ 4F$ N

Listado Completo del programa


Para mayor claridad, listaremos el programa completo, incluyendo tambin el rea de vectores.
******************************************************* * PRUEBA DE DISPLAY LCD 1602 ******************************************************* Include 'jk1_registers.inc' RAMStart EQU $0080 ; Direccin de Inicio RAM ROMStart EQU $F600 ; Direccin de Inicio ROM VectorStart EQU $FFDE ; Dir. Inicio Area de vectores ******************************************************* *AREA DE VARIABLES EN RAM (en sta prueba no se usa ninguna *variable de RAM) ORG RAMStart *Registro temporario del acumulador TEMPA RMB 1 *Registro temporario del indice TEMPX RMB 1 ****************** ASIGNACION DE PUERTOS ********************* ED EQU 2 ;para PTD2 RS EQU 5 ;para PTD5 ************************************************************** ********************* AREA DE PROGRAMA ******************** ************************************************************** ORG ROMStart ************************************************************** * Start - Aqui arranca despues de un RESET * * INICIALIZACION DE VARIABLES. * ************************************************************** Start RSP SEI CLR PTB ;Limpia puerto B CLR PTD ;Limpia puerto D MOV #$0C,DDRD ;PortD(2-5) COMO SALIDA MOV #$FF,DDRB ;PortB COMPLETO COMO SALIDA *INICIALIZACION DE TIMER MOV #$30,TSC ;stop y reset timer. Prescaler=1 MOV #$00,TSC ;libera timer, con prescaler=1 *Inicializacin del Display JSR DELAY50 LDA #$38 ;%00111000 JSR WCTRL ;Function Set- 8-bit,2-line,5X7 JSR DELAY50 LDA #$38 ;%00111000

JSR WCTRL ;Function Set- 8-bit,2-line,5X7 JSR DELAY50 LDA #$38 ;%00111000 JSR WCTRL ;Function Set- 8-bit,2-line,5X7 JSR DELAY50 LDA #$0C JSR WCTRL ;Display on, Cursor off LDA #$06 JSR WCTRL ;Entry mode- Inc addr, no shift LDA #$01 ;Clear Display JSR WCTRL *Fin de inicializacin del Display ******************************************************** JSR CARTEL1 LOOP1 STA COPCTL ;reset del COP BRA LOOP1 ********************************************* ;Escribir aqu las rutinas WCTRL, WDAT, CARTEL1, DELAY50 ******************************************** *AREA DE VECTORES ORG VectorStart FDB start ; ADC Conversion Complete Vector FDB start ; Keyboard Vector FDB 0,0,0,0,0,0,0,0 ; (No Vectors Assigned $FFE2-$FFF1) FDB start ; TIM1 Overflow Vector FDB start ; TIM1 Channel 1 Vector FDB start ; TIM1 Channel 0 Vector FDB start ; (No Vector Assigned $FFF8-$FFF9) FDB start ; ~IRQ1 FDB start ; SWI Vector FDB start ; Reset Vector *********************************************

Conclusin
Esta es una muy bsica explicacin de cmo hacer funcionar un display mediante un microcontrolador Freescale. Existen formas de escribir los datos aprovechando muchas ventajas de sta familia, como el uso del par H:X para indexar cadenas de caracteres, y otras mejoras adicionales. Tambin es posible comunicarse con el display usando solo cuatro bits de dato, con lo cual ahorramos puertos del micro para otras aplicaciones. Lo importante es comprender el concepto y siempre trabajar desde lo ms sencillo a lo ms complicado, e ir probado las rutinas y listados de programa paso a paso. Es la nica manera de avanzar sobre seguro. Autor: Eduardo Ortiz (usuario de e-magister, del grupo de Electricidad y Electrnica). Acepto y espero preguntas, comentarios, correcciones y sugerencias! Espero haber sido til, y poder seguir enviando documentos acerca de los nobles microcontroladores Freescale.

You might also like