Está en la página 1de 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.

También podría gustarte