Está en la página 1de 14

UNIVERASIDAD NACIONAL DEL CALLAO-FIEE- MICROCONTROLADORES-2015

CONTROL DE MODULO LCD CON ATMEGA8


Introduccin
Este captulo est dedicado a los LCDs alfanumricos con controlador Hitachi
HD44780 o compatible, es decir, la mayora. Hay diversas firmas, como Optrex, Sharp,
Crystalfontz America, Tianma, etc., que producen muchsimos LCDs de este tipo. Los
hay desde 1 a 4 lneas, desde 8 a 40 letras por lnea, algunos con iluminacin de
fondo, con diferente tecnologa de fabricacin, etc. Dada la compatibilidad en el control
de todos ellos, la eleccin de un modelo en particular queda a tu cargo.
El LCD utilizado en este curso es de 2 lneas, de 16 letras cada una.

FIG.1 Un display LCD de 2 lneas, de 16 caracteres cada una.

Pines del LCD


PINES DEL DISPLAY LCD.
Tabla Nmero de Pin
Nmero de Pin

Smbolo

Vss o GND

Vcc o Vdd

Vee o Vo

RS

R/W

7...14

DB0...DB7

15 y 16

Los pines 15 y 16 corresponden a la iluminacin de fondo del LCD, pero aqu el orden vara
mucho. Sea como fuere, los 14 primeros pines siempre deberan coincidir.
Nombre de seal

Funcin

DB0-DB7
o
D0-D7

8 lneas de bus de datos. Para transferencia bidireccional de datos entre el MCU y el LCD. DB7
tambin se puede usar como bit busy flag. En operacin de 4 bits solo se usa el nibble alto.

Enable Seal de inicio de operacin de lectura/escritura.

R/W

Seal para seleccionar operacin de lectura o escritura.


0 : Escribir en LCD
1 : Leer de LCD

RS

Register Select
0 : Registro de comandos (escritura).
: Busy flag + puntero de RAM (lectura).
1 : Registro de datos (escritura, lectura). Acceso a DDRAM o CGRAM.

Vee o Vo

Ajuste de contraste del LCD. Vee = GND es mximo contraste.

Vdd o Vcc

Alimentacin = +5 V tpicamente.

Vss

Alimentacin = 0 V (GND).

AyK

Son los pines de Anodo y Katodo de la iluminacin de fondo que tienen algunos LCD.

MSc. Ing. JACOB ASTOCONDOR VILLAR

UNIVERASIDAD NACIONAL DEL CALLAO-FIEE- MICROCONTROLADORES-2015


Un modo de operacin del LCD (con ventajas y desventajas) le permite trabajar sin conectar el
pin RW al microcontrolador. En ese modo pin RW siempre debe plantarse a GND.

LCDs con iluminacin de fondo


Algunos LCDs tienen iluminacin de fondo. Esta caracterstica se basa en diferentes
tecnologas, siendo la ms habitual el empleo de una matriz de diodos LED colocados detrs de
la pantalla.
La iluminacin basada en LEDs suele activarse con los pines 15 y 16, identificados como A (de
nodo) y K (de ctodo) pero no necesariamente en ese orden. Estos pines son independientes del
controlador interno del LCD as que de poco sirve que nuestro LCD diga ser compatible con
HD44780. La polaridad vara tanto que en los diagramas he puesto 15/16 para no especificar.
En todo caso, la independencia de los pines A y K permitir que todas las prcticas de este curso
funcionen con iluminacin o sin ella.

Si los pines de iluminacin en tu LCD no estn marcados como A y K puedes consultar su


datasheet para ver cules son o averiguarlo manualmente del mismo modo que compruebas la
polaridad de un LED: aplica 5 V entre los pines 15 y 16 y si prende,. Como en todo LED, no
debes olvidar ponerle una resistencia en serie, como se ve arriba. Resistencia de cunto?
en trminos generales, los LEDs de la iluminacin requieren cerca de 4.3V y consumen algo de
300 mA. De aqu calculamos que el valor de la resistencia debe andar por los 5 a 20 ohms.
Queda a tu criterio hacer los ajustes para que alumbren tanto como quieras.
Memorias del LCD
CGROM - Character Generator ROM
Es la zona de memoria donde se encuentran grabados los patrones de todos los caracteres que
puede visualizar el LCD de fbrica. Tiene grabados cerca de 200 (vara mucho) tipos de
caracteres de 57 puntos (lo ms comn) o 32 caracteres de 510 puntos. Este ltimo modo es
raramente usado porque no todos los modelos lo soportan.
DDRAM - Display Data RAM
La DDRAM almacena los cdigos de las letras que se visualizan en la pantalla del LCD. Tiene
capacidad de 80 bytes, un byte por carcter si la fuente es de 57 puntos. Observa que no
siempre se podrn visualizar los 80 caracteres.
Por ejemplo, si quisiramos mostrar el mensaje Hello en la pantalla, deberamos enviar a la
DDRAM los cdigos ascii de cada letra de esa palabra. El controlador interno del LCD tomar
esos cdigos para buscar en la CGROM sus correspondientes patrones de visualizacin y luego
los mostrar en la pantalla.
La siguiente figura muestra la correspondencia entre las locaciones de la DDRAM y las
posiciones de las letras que vemos en la pantalla de un LCD de 2 lneas, particularmente de uno
de 216. Fjate en que los 80 bytes de la DDRAM se dividen en dos sectores de 40 bytes, un
sector por lnea, as:
Lnea 1, con sector de DDRAM desde 0x00 hasta 0x27.
Lnea 2, con sector de DDRAM desde 0x40 hasta 0x67.

MSc. Ing. JACOB ASTOCONDOR VILLAR

UNIVERASIDAD NACIONAL DEL CALLAO-FIEE- MICROCONTROLADORES-2015


Por lo tanto, podemos entender que siempre tenemos un LCD virtual de 240; aunque solo
podamos ver 8, 16 20 letras por cada lnea. Los otros datos escritos en la DDRAM
permanecen all aunque no se visualicen.

Posiciones en DDRAM de las letras de la pantalla (nmeros en hexadecimal).


CGRAM - Character Generator RAM
La CGRAM es una RAM de 64 bytes donde el usuario puede programar los patrones de nuevos
caracteres grficos, ya sean de 57 puntos (hasta 8 caracteres) o de 510 puntos (hasta 4
caracteres). Este tema lo detallar en la prctica final.
El Puntero de RAM
Llamado tambin Address Counter, es un registro que sirve para acceder a las memorias RAM
del LCD. Por ejemplo, si el Puntero de RAM vale 0x00, accedemos a la locacin de DDRAM
(o CGRAM) de esa direccin.
Ahora bien, solo hay un puntero de RAM que trabaja con las dos RAMs del LCD, y para saber a
cul de ellas accede actualmente debemos ver la instruccin enviada ms recientemente.
Las instrucciones Clear Display, Return Home y Set DDRAM Address designan el Puntero de
RAM a la DDRAM, mientras que Set CGRAM Address lo designa a la CGRAM.
Afortunadamente, en la gran mayora de los casos, el Puntero de RAM estar apuntando a la
DDRAM. Adems, en este caso viene a representar la posicin del cursor (visible o no) del
LCD en la pantalla
SET DE INSTRUCCIONES DEL DISPLAY LCD
Es el controlador interno HD44780 (u otro) del LCD quien ejecutar las operaciones de mostrar
las letras en la pantalla, mover el cursor, desplazar el contenido de la pantalla, etc. Lo que nos
toca a nosotros es enviarle los cdigos de esas operaciones. A continuacin, un resumen.
Instrucciones del Display LCD
Cdigo

Instrucciones

Instrucciones de comando

Instrucciones de datos

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0


Clear Display

Return Home

Entry Mode Set

I/D

Display ON/OFF Control 0

Cursor or Display Shift

S/C R/L

Function Set

DL

Set CGRAM Address

Puntero de RAM (CGRAM)

Set DDRAM Address

Puntero de RAM (DDRAM)

Read
Busy
& RAM Pointer

BF

Puntero de RAM (DDRAM o CGRAM)

Escribir dato

Leer dato

Flag

Write
to
or DDRAM

CGRAM

Read from
or DDRAM

CGRAM

MSc. Ing. JACOB ASTOCONDOR VILLAR

UNIVERASIDAD NACIONAL DEL CALLAO-FIEE- MICROCONTROLADORES-2015

Conviene saber que las instrucciones Clear Display y Return Home tienen un tiempo de
ejecucin de cerca de 1.52 ms. Las dems toman algo de 40 s.
El LCD cuenta con dos registros internos principales, que dividen, grosso modo, las
instrucciones en de datos y de comando.
Poniendo el pin RS = 1 accedemos al registro de datos y mediante l a cualquier locacin de la
DDRAM o CGRAM, para operaciones de lectura y escritura de datos.
Con RS = 0 accedemos al registro de comandos para escribir instrucciones de control del LCD
(Clear Display, Function Set, etc.).
En el caso de una lectura, obtenemos un dato particular que contiene el valor del puntero de
RAM junto con el bit Busy flag.
Clear display: 0 0 0 0 0 0 0 1
Limpia toda la pantalla del LCD. Tambin retorna el cursor a su posicin inicial (cima
izquierda), esto es, designa el puntero de RAM a la direccin 0x00 de la DDRAM.
Return home: 0 0 0 0 0 0 1 x
Regresa el cursor a su posicin inicial pero sin alterar el texto del display, es decir, solo designa
el puntero de RAM a la direccin 0x00 de la DDRAM.
Entry mode set: 0 0 0 0 0 1 I/D S
Establece el modo de incremento o decremento y modo de desplazamiento del LCD.
I/D = 1: El puntero de RAM se incrementa en 1 despus de leer o escribir un dato. As
accedemos automticamente a la siguiente locacin de DDRAM o CGRAM. Si es
DDRAM, este puntero representa la posicin del cursor en la pantalla y el incremento
significa su avance a la derecha.
I/D = 0: El puntero de RAM se decrementa en 1 despus de leer o escribir un dato.
S = 1: Si se escribe un nuevo dato de carcter en el LCD, entonces el display entero se
desplaza a la derecha cuando I/D = 0 o a la izquierda cuando I/D = 1.
S = 0: El display no se desplaza luego de escribir en la DDRAM. Esto es lo usual.
Display on/off control: 0 0 0 0 1 D C B
Prende o apaga el Display, el Cursor y la funcin Blink del cursor.
D = 1: El display se prende.
D = 0: Apaga el display. (No significa que los datos de las RAMs se vayan a borrar.)
C = 1: Despliega el cursor.
C = 0: No despliega el cursor
B = 1: La letra indicada por el cursor parpadea.
B = 0: La letra no parpadea.
Cursor or display shift: 0 0 0 1 S/C R/L x x
Desplaza el cursor o el display a la derecha o la izquierda sin escribir o leer datos.
Tabla S/C
S/C R/L

Operacin

Mueve el cursor a la izquierda (puntero de RAM se decrementa en 1)

Mueve el cursor a la derecha (puntero de RAM se incrementa en 1)

El Cursor y el display entero se desplazan a la izquierda

El Cursor y el display entero se desplazan a la derecha

Function set: 0 0 1 DL N F x x
Configura la longitud del bus de datos, el nmero de lneas y el tipo de fuente.
DL = 1 : La interface con el LCD es mediante un bus de datos de 8 bits.
DL = 0 : La interface con el LCD es mediante un bus de datos de 4 bits.
MSc. Ing. JACOB ASTOCONDOR VILLAR

UNIVERASIDAD NACIONAL DEL CALLAO-FIEE- MICROCONTROLADORES-2015

N = 1: Configura un display de 2 lneas.


N = 0: Configura un display de 1 lnea.
F = 0: Fuente de carcter de 57 puntos.
F = 1: Fuente de carcter de 510 puntos.

Set DDRAM address: 1AAAAAAA


Designa el puntero de RAM a la nueva direccin AAAAAAA de la DDRAM. Digamos que
sirve para controlar la posicin del cursor del LCD.
Ejemplo, para escribir un texto en la segunda lnea del display (que tiene direccin inicial 0x40),
primero habra que enviar el comando Set DDRAM Address con el nmero 0x40 en el
parmetro AAAAAAA.
Set CGRAM address: 01AAAAAA
Designa el puntero de RAM a la nueva direccin AAAAAAA de la CGRAM.
Read Busy Flag & RAM Pointer: BF AAAAAAA
Leer bit Busy Flag (BF) y el valor del puntero de RAM. BF = 1 indica que una operacin
interna est en progreso. El LCD no aceptar una nueva instruccin hasta que BF sea 0.

El valor de AAAAAAA ledo representa el valor del puntero de RAM.


Es posible prescindir del bit BF. Para ello debemos esperar el tiempo adecuado antes de enviar
la siguiente instruccin.
Write data to CGRAM / DDRAM: DDDDDDDD
Escribe el dato de 8 bits DDDDDDDD en la DDRAM o CGRAM, dependiendo de cul de las
dos est siendo direccionada actualmente. Despus de la escritura el puntero de RAM se
incrementa o decrementa, segn se haya configurado el display. Ver instruccin Entry Mode
Set.
Read data from CGRAM / DDRAM: DDDDDDDD
Lee un dato de 8 bits de la DDRAM o CGRAM, dependiendo de cul de ellas est siendo
direccionada actualmente. Despus de la lectura el puntero de RAM se incrementa o decrementa
en uno, segn la configuracin del display. Ver instruccin Entry Mode Set.
Inicializacin del LCD
Los LCDs tienen un circuito interno de reset que los inicializan automticamente tras la
alimentacin. Lo cierto es que la auto-inicializacin no siempre es fiable.
Por eso existe la inicializacin por software, que permite una completa configuracin de los
parmetros del LCD.
Se constituye de una serie de pasos aparentemente bastante exticos, sobre todo los primeros,
pero que se justifican si tratamos de entender que este procedimiento debe ser capaz de
configurar el LCD para que funcione con bus de datos de 4 u 8 bits, sin importar cmo estuvo
operando antes, es decir, podemos cambiar "al vuelo" entre un modo y otro.
Adems de ello cada nueva instruccin debe ser enviada al LCD asegurndonos de que no se
encuentre ocupado.
El LCD indica su disponibilidad mediante el llamado bit BF (Busy Flag). BF = 1 indica LCD
ocupado y BF = 0 es LCD listo.
BF es el MSbit del byte que se lee del LCD cuando el pin RS = 0.
Obviamente la lectura implica que debemos poder controlar el pin RW. De no usar este pin en
nuestra conexin, debemos hacer pausas entre una instruccin y otra. Pero incluso si usamos el
bit BF, al inicio debemos poner pausas porque se supone que el LCD an no sabe si va trabajar
con bus de datos de 4 u 8 bits y no sabe cmo responder a las instrucciones de lectura (no sabe
si entregar bytes enteros o en nibbles).
Que enredo!, verdad? Por eso los siguientes flowcharts se ven tan complicados pese a tratarse
de los LCD ms simples del mundo.
La inicializacin de los LCD grficos por ejemplo es ms pequea.
MSc. Ing. JACOB ASTOCONDOR VILLAR

UNIVERASIDAD NACIONAL DEL CALLAO-FIEE- MICROCONTROLADORES-2015

Inicializacin del LCD con bus de datos de 4 bits.

MSc. Ing. JACOB ASTOCONDOR VILLAR

UNIVERASIDAD NACIONAL DEL CALLAO-FIEE- MICROCONTROLADORES-2015

Inicializacin del LCD con bus de datos de 8 bits


Interface entre un Microcontrolador y un display LCD
Esta presentacin es poco usual. Los libros o los manuales de los compiladores suelen resaltar
solo la interface de la librera que proveen. Esta exposicin va pensando en los noveles

usuarios del Arduino, que encuentran algo confusa la inicializacin de su librera de


LCD por contemplar todos los modos de operacin viables.
Aunque los LCDs parezcan simples de usar, para bien o para mal sus caractersticas abren
puertas a diversos modos de interface. Considerando que el bus de datos puede ser de 8 o 4 bits
y que se puede usar o prescindir de la lnea de control RW, podemos obtener los siguientes 4

MSc. Ing. JACOB ASTOCONDOR VILLAR

UNIVERASIDAD NACIONAL DEL CALLAO-FIEE- MICROCONTROLADORES-2015


tipos de conexin. (Nota, la conexin de los pines de alimentacin, de contraste y de la
iluminacin de fondo se estudia en la seccin pines del LCD)
Interface de display LCD
8 lneas de Datos
4 lneas de Datos
3 lneas de Control (con RW) Interface de 11 lneas Interface de 7 lneas
2 lneas de Control (sin RW) Interface de 10 lneas Interface de 6 lneas
La interface de 11 lneas
se trabaja con los 8 bits del bus de datos y las 3 lneas de Control.
El uso del pin RW controla las operaciones de escritura (RW = 0) y lectura (RW = 1) del LCD.
Las lecturas nos permiten por un lado conocer si el LCD est ocupado o no para saber si
podemos enviar la siguiente instruccin de escritura, as como leer la posicin actual del cursor.
La otra finalidad de las lecturas es obtener los datos de las memorias DDRAM y CGRAM del
LCD. Los datasheets dicen que el acceso bidireccional a las rams del LCD permite utilizarlas
como memoria extendida del sistema.
Ahora parece hasta ridculo pero tiene cierto sentido considerando que estos LCDs nacieron en
la prehistoria de los microcontroladores , donde los microcontroladores tenan muy poca RAM
o en su lugar se usaban microprocesadores (que simplemente no tienen RAM).

Interface de 11 lneas entre un microcontrolador y un LCD


En la interface de 10 lineas
El pin RW del LCD va siempre plantado a GND (RW = 0).
Ello significa que el LCD solo aceptar operaciones de escritura del microcontrolador.
Renunciar a la lectura de las memorias RAM es un hecho que pasa casi desapercibido.
El punto clave de no controlar el pin RW es no enviar al LCD una nueva instruccin sin que
haya terminado de procesar la anterior. Ya que no podemos leer del LCD para saber su estado,
debemos calcular su disponibilidad a partir de los tiempos que demoran en ejecutarse las
instrucciones. Por ejemplo, una vez inviada la instruccin Clear Display debemos esperar al
menos 1.6 ms (que es su tiempo de ejecucin) antes de enviar la siguiente instruccin.

MSc. Ing. JACOB ASTOCONDOR VILLAR

UNIVERASIDAD NACIONAL DEL CALLAO-FIEE- MICROCONTROLADORES-2015

Interface de 10 lneas entre un microcontrolador y un LCD


En la interface de 7 lneas
El bus de datos del LCD se conecta con el microcontrolador por sus 4 pines ms altos: D4, D5,
D6 y D7.
Como todas las instrucciones (de datos y de comando) son de un byte, los bytes deben ser
transferidos en dos mitades.
Primero se enva o recibe el nibble alto y luego el nibble bajo, siendo cada nibble validado por
un pulso del pin Enable. Esas rutinas extras harn crecer un poco el firmware (programa del
microcontrolador).
En la contraparte, con el microcontrolador aun disponiendo de las tres lneas de control,
podemos realizar cualquier operacin de lectura y escritura, lo mismo que en la interface
completa de 11 lneas pero ahorrndonos 4 pines. Este beneficio suele prevalecer sobre el
handicap derivado del firmware.
Los LCDs estn fabricados con tecnologa CMOS, por lo que algunos modelos sugieren
conectar los pines de entrada no usados a alguna seal estable para evitar que por ellos se filtre
algn ruido que pueda perturbar la operacin del LCD.

Interface de 7 lneas entre un microcontrolador y un LCD


Por ltimo tenemos la interface de 6 lneas.
Aqu se nos juntan todas las desventajas software de tener que trabajar a base de nibbles y de
renunciar a las lecturas del LCD para obtener datos de sus memorias RAM o para saber si el
LCD est ocupado o no antes de poder enviarle una nueva instruccin. A pesar de todo eso,
pueden darse ocasiones, como disponer de un microcontrolador de muy pocos pines, donde
tengamos que recurrir a esta conexin.

Interface de 6 lneas entre un microcontrolador y un LCD


MSc. Ing. JACOB ASTOCONDOR VILLAR

UNIVERASIDAD NACIONAL DEL CALLAO-FIEE- MICROCONTROLADORES-2015

LIBRERA PARA DISPLAY LCD


Tenemos a continuacin una librera para controlar un LCD con una interface de 4 bits y usando
el bit BF (Busy Flag). Si tuviste la paciencia de leer las pginas anteriores, vers que es un claro
reflejo de todo lo expuesto. Y si no, de todos modos en seguida citar ligeramente cmo
utilizarla.
La librera trabaja para los compiladores IAR C y AVR GCC y consta de dos archivos
lcd.h y lcd.c.
Ambos debern ser indexados al proyecto en el entorno de AVR IAR C o Atmel Studio 6 para
WinAVR (ante alguna duda puedes ir a la seccin Adicin de Archivos o Libreras al Proyecto).
En el cdigo fuente, sin embargo, solo se debe indicar el archivo de cabecera i2c.h mediante la
directiva #include.
#include "lcd.h"
La librera utiliza por defecto el puerto B del AVR tanto para el bus de datos del LCD como
para las lneas de control E, RS y R/W.
Esta interface se puede modificar en los #defines del archivo i2c.h. Nota que por cada puerto se
deben cambiar los tres registros, PORT, DDR y PIN. Esa podra ser una configuracin de
cierta recurrencia, en cambio, no deberamos tocar lcd.c, salvo que por alguna razn deseemos
editar su cdigo.

Funciones Bsicas Disponibles

lcd_init(). Obviamente es la primera funcin a llamar. Tras ejecutarse el LCD debe


quedar inicializado, con la pantalla limpia y con el cursor en el primer casillero.
lcd_gotorc(r,c). El LCD tiene un cursor que, si bien puede mostrarse en pantalla, suele
configurarse para que permanezca oculto. Bien, visible o no, el cursor avanza
automticamente tras cada letra que se escribe. Con lcd_gotorc(r,c) podemos mover el
cursor manualmente a la fila r y columna c. El parmetro r puede valer entre 1 y 2, y el
valor de c va de 1 en adelante.
lcd_puts(s). Visualiza la cadena s en el LCD empezando en la posicin actual del
cursor. La cadena s es almacenada en RAM. No se suelen mostrar grandes datos en un
LCD, as que no implemente una funcin anloga que opere sobre la memoria FLASH.
lcd_clear(). Limpia la pantalla del LCD y coloca el cursor al inicio, en la fila 1, columna 1.
lcd_data(c). Escribe una sola letra en el LCD, en la posicin actual del cursor.
lcd_data() tambin permite crear caracteres grficos, como se muestra en una prctica
ms adelante.
lcd_cmd(com). Ocasionalmente tambin usaremos esta funcin para enviar comandos al
LCD, por ejemplo:

lcd_cmd(LCD_LINE2); //Mover cursor al inicio de lnea 2


lcd_cmd(LCD_CLEAR); // Limpiar pantalla
lcd_cmd(LCD_CURBLK); // Mostrar Cursor + Blink
lcd_cmd(LCD_CURSOR); // Mostrar solo Cursor
lcd_cmd(LCD_CGRAM+7); //Mover Puntero de RAM a direccin 7 de la CGRAM

Las constantes LCD_CLEAR y algunas ms se hallan definidas en el archivo lcd.h. Por


supuesto que tambin se pueden formar cualesquiera cdigos de instrucciones de los estudiados
antes.

MSc. Ing. JACOB ASTOCONDOR VILLAR

10

UNIVERASIDAD NACIONAL DEL CALLAO-FIEE- MICROCONTROLADORES-2015


/******************************************************************
* FileName:
lcd.h
* Purpose:
Librera de funciones para controlar un display LCD con chip
*
Hitachi HD44780 o compatible. La interface es de 4 bits.
* Processor: ATmel AVR
* Compiler:
AVR IAR C y AVR GCC (WinAVR)
* Author:
*******************************************************************/
#include "avr_compiler.h"
//******************************************************************
//
CONFIGURACIN DE LOS PINES DE INTERFACE
//******************************************************************
/* Define el puerto a donde se conectar el bus de datos del LCD
* Se utilizar el nible alto del puerto escogido (ejem. PB4-DB4,...,PB7-DB7)
*/
#define lcd_DATAout
PORTB
// Registro PORT del puerto
#define lcd_DATAin
PINB
// Registro PIN del puerto
#define lcd_DATAddr
DDRB
// Registro DDR del puerto
/* Define
* E, RW
#define
#define
#define

el puerto a donde se conectarn las lneas de control del LCD

y RS. Puede ser el mismo


lcd_CTRLout
PORTB
lcd_CTRLin
PINB
lcd_CTRLddr
DDRB

puerto del bus de datos.*/


// Registro PORT del puerto
// Registro PIN del puerto
// Registro DDR del puerto

/* Define los nmeros de los pines del puerto anterior que correspondern a
* las lneas E, RW y RS del LCD. */
#define lcd_E
3
// Pin Enable
#define lcd_RW
2
// Pin Read/Write
#define lcd_RS
1
// Pin Register Select
//*****************************************************************
//
CDIGOS DE COMANDO USUALES
//*****************************************************************
#define LCD_CLEAR
0x01
// Limpiar Display
#define LCD_RETHOM
0x02
// Cursor a inicio de lnea 1
#define LCD_LINE1
0x80
// Lnea 1 posicin 0
#define LCD_LINE2
0xC0
// Lnea 2 posicin 0
#define LCD_DDRAM
0x80
// Direccin 0x00 de DDRAM
#define LCD_CGRAM
0x40
// Direccin 0x00 de CGRAM
#define LCD_CURSOR
0x0E
// Mostrar solo Cursor
#define LCD_BLINK
0x0D
// Mostrar solo Blink
#define LCD_CURBLK
0x0F
// Mostrar Cursor + Blink
#define LCD_NOCURBLK 0x0C
// No mostrar ni Cursor ni Blink
//****************************************************************
//
PROTOTIPOS DE FUNCIONES
//***************************************************************
void lcd_init(void);
// Inicializa el LCD
void lcd_puts(char * s);
// Enva una cadena ram al LCD
void lcd_gotorc(char r, char c);
// Cursor a fila r, columna c
void lcd_clear(void);
// Limpia el LCD y regresa el cursor al inicio
void lcd_data(char dat);
// Enva una instruccin de dato al LCD
void lcd_cmd(char com);
// Enva una instruccin de comando al LCD
char lcd_read(char RS);
// Lee un dato del LCD
void lcd_write(char inst, char RS); // Escribe una instruccin en el LCD
void lcd_nibble(char nibble);
void ldelay_ms(unsigned char );

MSc. Ing. JACOB ASTOCONDOR VILLAR

11

UNIVERASIDAD NACIONAL DEL CALLAO-FIEE- MICROCONTROLADORES-2015


/******************************************************************
* FileName:
lcd.c
* Purpose:
Librera de funciones para controlar un display LCD con chip
*
Hitachi HD44780 o compatible. La interface es de 4 bits.
* Processor: ATmel AVR
* Compiler:
AVR IAR C y AVR GCC (WinAVR)
* Author:
*******************************************************************/
#include "lcd.h"
//*******************************************************************
// Ejecuta la inicializacin software completa del LCD. La configuracin es
// de: interface de 4 bits, despliegue de 2 lneas y caracteres de 5x7 puntos.
//********************************************************************
void lcd_init(void)

{
/* Configurar las direcciones de los pines de interface del LCD */
lcd_DATAddr |= 0xF0;
lcd_CTRLddr |= (1<<lcd_E)|(1<<lcd_RW)|(1<<lcd_RS);
/* Secuencia de inicializacin del LCD en modo de 4 bits*/
lcd_CTRLout &= ~((1<<lcd_E)|(1<<lcd_RW)|(1<<lcd_RS));
ldelay_ms(45);
// > 40 ms
lcd_nibble(0x30);
// Function Set: 8-bit
ldelay_ms(5);
// > 4.1 ms
lcd_nibble(0x30);
// Function Set: 8-bit
ldelay_ms(1);
// > 100 s
lcd_nibble(0x30);
// Function Set: 8-bit
ldelay_ms(1);
// > 40 s
lcd_nibble(0x20);
// Function Set: 4-bit
ldelay_ms(1);
// > 40 s
lcd_nibble(0x20);
// Function Set: 4-bit, 2lines, 47font
lcd_nibble(0x80);
//
lcd_write(0x0C, 0);//Display ON/OFF Control: Display on, Cursor off, Blink
off
lcd_write(0x01, 0);
lcd_write(0x06, 0);

// Clear Display
// Entry Mode Set

}
//******************************************************************
// Escribe una instruccin en el LCD:
// Si RS = 0 la instruccin es de comando (Function Set, Entry Mode set, etc).
// Si RS = 1 la instruccin es de dato y va a la DDRAM o CGRAM.
//********************************************************************
void lcd_write(char inst, char RS)
{
while(lcd_read(0)&0x80);
// Esperar mientras LCD est ocupado
if(RS)
lcd_CTRLout |= (1<<lcd_RS); // Para escribir en DDRAM o CGRAM
else
lcd_CTRLout &= ~(1<<lcd_RS); // Para escribir en Registro de Comandos
delay_us(5);
// Permite actualizar el Puntero de RAM
lcd_nibble(inst);
// Enviar nibble alto
lcd_nibble(inst<<4);
// Enviar nibble bajo
}
//***********************************************************
// Enva el nibble alto de 'nibble' al LCD.
//************************************************************
void lcd_nibble(char nibble)
{
lcd_CTRLout &= ~(1<<lcd_RW);
// Establecer Modo de escritura
lcd_DATAddr |= 0xF0;
// Hacer nibble alto de bus de datos salida
lcd_DATAout = (nibble&0xF0)|(lcd_DATAout&0x0F); // Colocar dato
delay_us(2);
// tAS, set-up time > 140 ns
lcd_CTRLout |= (1<<lcd_E);
// Pulso de Enable
delay_us(2);
// Enable pulse width > 450 ns
lcd_CTRLout &= ~(1<<lcd_E);
//
lcd_DATAddr &= 0x0F;
// Hacer nibble alto entrada
}
//*******************************************************
// Lee un byte de dato del LCD.
// Si RS = 1 se lee la locacin de DDRAM o CGRAM direccionada actualmente.
MSc. Ing. JACOB ASTOCONDOR VILLAR

12

UNIVERASIDAD NACIONAL DEL CALLAO-FIEE- MICROCONTROLADORES-2015


// Si RS = 0 se lee el 'bit de Busy Flag' + el 'Puntero de RAM'.
//****************************************************************
char lcd_read(char RS)
{
char high, low;
if(RS)
lcd_CTRLout |= (1<<lcd_RS); // Para leer de DDRAM o CGRAM
else
lcd_CTRLout &= ~(1<<lcd_RS); // Para leer Busy Flag + Puntero de RAM
lcd_CTRLout |= (1<<lcd_RW);
// Establecer Modo Lectura
lcd_DATAddr &= 0x0F;
// Hacer nibble alto entrada
delay_us(2);
// tAS, set-up time > 140 ns
lcd_CTRLout |= (1<<lcd_E);
// Habilitar LCD
delay_us(2);
// Data Delay Time > 1320 ns
high = lcd_DATAin;
// Leer nibble alto
lcd_CTRLout &= ~(1<<lcd_E);
//Para que el LCD prepare el nibble bajo
delay_us(2);
// Enable cycle time > 1200 ns
lcd_CTRLout |= (1<<lcd_E);
// Habilitar LCD
delay_us(2);
// Data Delay Time > 1320 ns
low = lcd_DATAin;
// Leer nibble bajo
lcd_CTRLout &= ~(1<<lcd_E);
//
return (high&0xF0)|(low>>4);
// Juntar nibbles ledos
}
//*******************************************************************
// Envan cadenas RAM terminadas en nulo al LCD.
//******************************************************************
void lcd_puts(char * s)
{
unsigned char c, i=0;
while(c = s[i++])
lcd_write(c, 1);
// Instruccin 'Write Data to DDRAM/CGRAM'
}
//******************************************************************
// Ubica el cursor del LCD en la columna c de la lnea r.
//***********************************************************
void lcd_gotorc(char r, char c)
{
if(r==1)
r = LCD_LINE1;
else
r = LCD_LINE2;
lcd_write(r+c-1, 0);
// Instruccin 'Set DDRAM Address'
}
//*************************************************************
// Limpia la pantalla del LCD y regresa el cursor a la primera posicin
// de la lnea 1.
//***************************************************************
void lcd_clear(void)
{
lcd_write(LCD_CLEAR, 0);
// Instruccin 'Clear Display'
}
//************************************************************
// Envan instrucciones de comando y de datos al LCD.
//************************************************************
void lcd_cmd(char com)
{
lcd_write(com, 0);
// Cualquier instruccin de comando
}
void lcd_data(char dat)
{
lcd_write(dat, 1);
// Instruccin 'Write Data to DDRAM/CGRAM'
}
//***********************************************************
// Genera un delay de n milisegundos
//*********************************************************
void ldelay_ms(unsigned char n)
{
while(n--)
delay_us(1000);
}

MSc. Ing. JACOB ASTOCONDOR VILLAR

13

UNIVERASIDAD NACIONAL DEL CALLAO-FIEE- MICROCONTROLADORES-2015


LABORATORIO
CONTROL DEL MODULO LCD
FUNDAMENTO
Mostrar un mensaje de UNAC-FIEE Y MICRO ATMEGA8 en el LCD es un programa
de visualizacin de mensaje en el LCD.
Segn la configuracin por defecto de la librera para el LCD, debemos usar la conexin
mostrada en el esquema de abajo. La configuracin de puertos y de pines a usar se puede
cambiar en archivo lcd.h.
El pin VEE (o Vo) del LCD establece el contraste de la pantalla. Muchas veces se prefiere
quitar el potencimetro y conectar VEE a tierra para fijar el mximo contraste. En los siguientes
circuitos haremos algo parecido.
Instrucciones
/************************************************************************
* FileName: main.c
* Purpose: LCD - Visualizacin de texto
* Processor: AVR ATmegaXX4
* Compiler: AVR IAR C & AVR GCC (WinAVR)
* Author:
************************************************************************/

#include "avr_compiler.h"
#include "lcd.h"
void delay_ms(unsigned int t)
{
while(t--)
delay_us(1000);
}
int main(void)
{
lcd_init();
// Inicializar LCD
while(1)
{
lcd_gotorc(1,7);
// Cursor a fila 1 posicin 7
lcd_puts("Hello");
// Escribir Hello
lcd_gotorc(2,7);
// Cursor a fila 2 posicin 7
lcd_puts("World"); // ...
delay_ms(600);
// Pausa de 600 ms
lcd_clear();
// Limpiar pantalla
delay_ms(400);
// ...
}
}

CIRCUITO A IMPLEMENTAR

MSc. Ing. JACOB ASTOCONDOR VILLAR

14

También podría gustarte