|
PROGRAMACIÓN DE UN DISPLAY DE LCD
Salvador
Macías Hernández
Página
hecha el Miércoles 8 de Marzo del 2006
Introducción
Cada día la tecnología está mejorando. Cada día
aparecen nuevos hallazgos científicos y tecnológicos. Hace ya varias décadas,
la información de los sistemas digitales se presentaban a través de pequeños
LEDs, después se hicieron a través del papel. De hecho el comando "Print"
de basic, que muestra cierta información en la pantalla, obtuvo su nombre por
que en ese tiempo no existía monitores de tubos de rayos catódicos. Sino que
eran impresoras que mostraban la información directamente en el papel. Con el
paso del tiempo se ha pasado por los LED's de siete segmentos, la matriz de
LED's, el monitor de CRT, el cristal líquido, el plasma, etc.
Las siglas LCD quieren decir "Pantalla de
Cristal Líquido" ("Liquid Crystal Display"). El LCD es
una sustancia que se comporta al mismo tiempo como un líquido y como un
sólido. Las moléculas de un cristal líquido pueden desplazarse unas respecto
a otras con bastante facilidad, de forma semejante a las de un líquido. Sin
embargo, todas las moléculas de un cristal líquido tienden a estar orientadas
del mismo modo, algo similar a la estructura molecular de un cristal sólido.
Los cristales líquidos sólo mantienen su doble naturaleza sólida y líquida
en un determinado rango de temperaturas y presiones. A temperaturas lo bastante
altas o presiones lo bastante bajas, el orden de la orientación da paso a las
rotaciones moleculares aleatorias, con lo que el cristal líquido se convierte
en un líquido normal. Cuando la temperatura es lo bastante baja o la presión
es lo bastante alta, las moléculas de un cristal líquido ya no pueden
desplazarse entre sí con facilidad, y el cristal líquido pasa a ser un sólido
normal.
Entre las muchas clases de cristal líquido están
las fases nemática y colestérica y las distintas fases esmécticas,
caracterizadas por una determinada colocación de las moléculas. Muchas veces
es posible manipular las propiedades ópticas de un cristal líquido
sometiéndolo a un campo magnético o eléctrico que cambia la orientación de
sus moléculas. Por ejemplo, cuando se les aplica un campo eléctrico pequeño,
algunos cristales líquidos pasan de ser claros a ser opacos, o adquieren la
capacidad de girar la luz polarizada.
El principio de funcionamiento es sencillo. Estos
cristales líquidos están formados por unas moléculas alargadas con forma de
puro, que se llaman moléculas nemáticas y se alinean con una estructura
simétrica. En este estado el material es transparente. Un campo eléctrico
provoca que las moléculas se desalinien de manera que se vuelven opacas a la
luz. De esta manera, aplicando o no aplicando un campo eléctrico (es decir,
polarizando o no polarizando), podemos jugar con oscuridad o transparencia
respectivamente. Si aplicamos el campo localmente en geometrías iguales al
display de 7 segmentos, conseguiremos un display análogo al de los LED´s pero
con cristal líquido.
Los LCD son visualizadores pasivos, esto significa que no emiten luz como el
visualizador o display alfanumérico hecho a base de un arreglo de LEDs. Es por
esa razón que, algunas veces, cuando intentamos ver la hora en un reloj que
utiliza esta tecnología, es necesario una fuente de luz adicional. El LCD tiene
muy bajo consumo de energía si se lo compara con el display o visualizador
alfanumérico y son compatibles con la tecnología CMOS, característica que
permite que se utilice en equipos portátiles (ejemplo: los relojes de pulsera,
calculadoras, etc.). Tiene una vida aproximada de 50,000 horas. Hay diferentes
tipos de presentaciones y son muy fáciles de configurar. Hay desde
visualizadores comunes de 7 segmentos, hasta una matriz de puntos, todos ellos
muy delgados.
El controlador estándar Hitachi HD44780
Los LCD de texto son los más baratos y simples de utilizar. Solamente
permiten visualizar mensajes cortos de texto. Existen algunos modelos
estandarizados en la industria, en función de su tamaño medido en número de
líneas y columnas de texto. Existen modelos de una, dos y cuatro filas
únicamente. El número de columnas típico es de ocho, diesiséis, veinte y
cuarenta caracteres. El controlador Hitachi HD44780 se ha convertido en un
estándar de industria cuyas especificaciones funcionales son imitadas por la
mayoría de los fabricantes. Este controlador cuenta con las siguientes
terminales eléctricas:
- D0-D7: ocho señales eléctricas que componen un bus de datos.
- R/W: una señal que indica si se desea leer o escribir en la pantalla
(generalmente solamente se escribe).
- RS: una señal que indica si los datos presentes en D0-D7
corresponden bien a una instrucción, bien a sus parámetros.
- E: una señal para activar o desactivar la pantalla.
- Vee: señal electrica para determinar el contraste de la pantalla.
Generalmente en el rango de cero a cinco voltios. Cuando el voltaje es de
cero voltios se obtienen los puntos más oscuros.
- Vss y Vdd: señales de alimentación. Generalmente a cinco
voltios.
- LED+ y LED-: Señales para encender la luz trasera de la pantalla en algunos
modelos.
A continuación veremos una tabla con
la asignación estándar de pines para displays menores de 80 caracteres:
Pin
|
Symbolo
|
Nivel
|
I/O
|
Función
|
1
|
Vss
|
-
|
-
|
Tierra (GND)
|
2
|
Vcc
|
-
|
-
|
+Vcc (+5V)
|
3
|
Vee
|
-
|
-
|
Contraste
|
4
|
RS
|
0/1
|
I
|
Selección de
Registro
0 = Instrucción
1 = Datos
|
5
|
R/W
|
0/1
|
I
|
0 = Escribimos Dato
1 = Leemos Dato
|
6
|
E
|
1, 1->0
|
I
|
Enable signal
|
7
|
DB0
|
0/1
|
I/O
|
Datos (LSB)
|
8
|
DB1
|
0/1
|
I/O
|
Datos
|
9
|
DB2
|
0/1
|
I/O
|
Datos
|
10
|
DB3
|
0/1
|
I/O
|
Datos
|
11
|
DB4
|
0/1
|
I/O
|
Datos
|
12
|
DB5
|
0/1
|
I/O
|
Datos
|
13
|
DB6
|
0/1
|
I/O
|
Datos
|
14
|
DB7
|
0/1
|
I/O
|
Datos (MSB)
|
Y para controlarlo
hay que usar la siguiente tabla de instrucciones:
Estos módulos de
Cristal Líquido, aparte de tener la función de display, también son una
memoria RAM, donde se guardan los caracteres enviados, y leer dichos valores.
Aunque no es común que se haga eso. Ahora bien, cada localidad de memoria, es
un lugar para desplegar un caracter. Y cada lugar para poner un caracter tiene
su dirección de memoria, así como lo muestra la figura siguiente:
Por ejemplo, para
posicionar el cursor en la localidad 40h (principio del segundo renglón), hay
que ingresar la instrucción Set DD Ram Address con la dirección 40h
(Add= 40 = 100 000). Con lo cual tendremos el siguiente byte:
Instrucción |
RS |
RW |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
Set DD Ram Address |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
La Inicialización
del Display
En cuanto nosotros
alimentamos el display, vamos a ver que aparece una línea con barritas negras (Ver
fotografía). Esto es lo que hace por omisión el display, ya que
para hacer uso del display, hay que inicializarlo. Hay que decirle que vamos a
utilizar una interfase de 8 bits o de 4 bits (dependiendo el caso), vamos a
decirle que incremente el cursor en cuanto se escriba algo, vamos a decirle si
queremos que el cursor parpadeé o no, etc.
Subrutinas para el
display de LCD utilizando el microcontrolador AT89C51
;===================================================================
; SUBRUTINAS DEL DISPLAY DE LCD
;===================================================================
;------------------------MUESTRA_MENSAJE_LCD------------------------
; Esta subrutina imprime una barrita en el display de LCD
; UTILIZA: DataPointer
; MODIFICA: Puerto0, Registro 1, Registro 0
;-------------------------------------------------------------------
MUESTRA_MENSAJE_LCD:
clr LCD_En
setb LCD_DI ;Decimos que es dato ;)
mov R0,#010h
mov R1,#0FFh
MUESTRA_MENSAJE_LCD_002:
inc R1
mov Acc,R1
movc A,@A+DPTR
mov P0,Acc
setb LCD_En
call ESPERA_50uS
clr LCD_En
djnz R0,MUESTRA_MENSAJE_LCD_002
RET
;------------------------BAJA_RENGLON_LCD------------------------
; Esta subrutina manda el cursor al inicio del renglón de abajo
; UTILIZA: P0
; MODIFICA: P0
;-------------------------------------------------------------------
BAJA_RENGLON_LCD:
clr LCD_DI
clr LCD_En
mov P0,#0C0h
setb LCD_En
call ESPERA_50uS
clr LCD_En
RET
;------------------------POSICIONA_CURSOR_LCD------------------------
; Esta subrutina manda el cursor auna cordenada dada por el registro7
; UTILIZA: P0
; MODIFICA: P0
;-------------------------------------------------------------------
POSICIONA_CURSOR_LCD:
clr LCD_DI
clr LCD_En
mov P0,R7
setb P0.7
setb LCD_En
call ESPERA_50uS
clr LCD_En
RET
;------------------------IMPRIME_BARRITA_LCD------------------------
; Esta subrutina imprime una barrita en el display de LCD
; UTILIZA: P0
; MODIFICA: P0
;-------------------------------------------------------------------
IMPRIME_BARRITA_LCD:
clr LCD_En
setb LCD_DI ;Decimos que es dato ;)
mov P0,#0FFh
setb LCD_En
call ESPERA_50uS
clr LCD_En
RET
;-----------------------------HOME_LCD------------------------------
; Esta subrutina manda el cursor a inicio
; UTILIZA: P0
; MODIFICA: P0
;-------------------------------------------------------------------
HOME_LCD:
clr LCD_DI
clr LCD_En
call ESPERA_50uS
mov P0,#080h
setb LCD_En
call ESPERA_50uS
clr LCD_En
RET
;----------------------------LIMPIA_LCD-----------------------------
; Esta subrutina limpia el display de LCD y manda el cursor a inicio
; UTILIZA: P0
; MODIFICA: P0
;-------------------------------------------------------------------
LIMPIA_LCD:
clr LCD_En
clr LCD_DI
mov P0,#01h
setb LCD_En
call ESPERA_5mS
clr LCD_En
setb LCD_DI
call ESPERA_5mS
RET
;--------------------------INICIALIZA_LCD---------------------------
; Esta subrutina inicializa el display de LCD
; UTILIZA: P0
; MODIFICA: P0
;-------------------------------------------------------------------
INICIALIZA_LCD:
clr LCD_DI
mov P0,#038h ;Define interfáz de 8 bits, doble línea
call ESPERA_50uS ;y font de 5x8 dots
clr LCD_En
mov P0,#0Fh ;Enciende el LCD y apaga el cursor
setb LCD_En
call ESPERA_50uS
clr LCD_En
mov P0,#06h ;Especifica el movimiento del cursor
setb LCD_En ;incrementándose.
call ESPERA_50uS
clr LCD_En
mov P0,#01h ;Limpia el Display y manda el cursor a
setb LCD_En ;la posición de inicio
call ESPERA_50uS
clr LCD_En
call ESPERA_5mS
call ESPERA_5mS
call ESPERA_5mS
call ESPERA_5mS
setb LCD_DI
RET
;--------------------------MUESTRA NÚMERO 2dig-----------------------
; Esta subrutina convierte el número binario almacenado en el
; Registro 7 a decimal de dos dígitos (de 0 a 99) y lo muestra
; en el display en donde está el cursor.
; UTILIZA: Registro 7
; MODIFICA: Puerto 0,Acumulador; Registro B
;-------------------------------------------------------------------
MUESTRA_NUMERO_2dig:
mov A, R7 ;Convertimos el dato binario a decimal de dos digitos
mov B, #10
div AB
orl A, #30h
orl B, #30h
clr LCD_En
setb LCD_DI ;Mandamos el primer dígito
mov P0,A
setb LCD_En
call ESPERA_50uS
clr LCD_En
clr LCD_En
setb LCD_DI ;Mandamos el segundo dígito
mov P0,B
setb LCD_En
call ESPERA_50uS
clr LCD_En
ret
Bibliografía
|
|