Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
R/W
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
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.
Instrucciones
Instrucciones de comando
Instrucciones de datos
Return Home
I/D
S/C R/L
Function Set
DL
Read
Busy
& RAM Pointer
BF
Escribir dato
Leer dato
Flag
Write
to
or DDRAM
CGRAM
Read from
or DDRAM
CGRAM
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
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
10
/* 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 );
11
{
/* 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
13
#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
14