Sei sulla pagina 1di 30

Pantalla LCD 16×2 con PIC (HD44780)

http://www.geekfactory.mx/tutoriales/tutoriales-pic/pantalla-lcd-16x2-con-pic-libreria/

por Jesus Ruben Santa Anna Zamudio | Ago 2, 2014 | Tutoriales PIC | 3 Comments

Descripción:

Cuando los simples indicadores luminosos con led ya no son suficientes, habitualmente el
siguiente paso para todo programador es ir por una pantalla lcd 16×2. Se encuentra que existen
módulos LCD que facilitan la interfaz con este periférico. El estándar en la industria para estos
módulos con “controlador a bordo” es el chipset HD44780 (y otros más compatibles
desarrollados a partir de este), para los cuales se encuentra soporte en prácticamente cualquier
plataforma: Arduino, PIC, AVR, MSP430, etc.

La pantalla de cristal líquido o LCD (Liquid Crystal Display) es un dispositivo microControlado


de visualización gráfico para la presentación de caracteres, símbolos o incluso dibujos (en
algunos modelos), es este caso dispone de 2 filas y de 16 caracteres cada una y cada carácter
dispone de una matriz de 5x7 puntos (pixels), aunque los hay de otro número de filas y
caracteres. Este dispositivo está gobernado internamente por un microcontrolador y regula todos
los parámetros de presentación, este modelo es el más comúnmente usado y esta información se
basará en el manejo de este u otro LCD compatible.

En la Figura 1 se muestra un LCD 2x16 que está compuesto por 2 líneas de 16 caracteres, con
iluminación azul y letras color blanco.

Figura 1. LCD 2x16: está compuesto por 2 líneas de 16 caracteres

Gestión de un LCD
Se realizará la interface del PIC16F877 con un LCD (Liquid Crystal Display) compuesto por dos líneas de
16 caracteres cada una. Los LCD más comunes, disponen de una interface ideada por Hitachi y adoptada
como estándar por otros fabricantes. Esta interface hace que el LCD pueda ser conectado al micro a
través de un bus de 4 u 8 líneas más tres líneas de control y las de alimentación.

En la Tabla 1 están descriptas las funciones de cada línea disponible del LCD. Las descripciones
en negrita, indican las líneas efectivamente utilizadas en la aplicación de 4 bits de datos.

1
Tabla 1. Funciones de cada línea disponible del LCD

Pin Nombre Función


1 GND Ground. GND (Tierra 0V)
2 VDD Power Supply. Alimentación (+5 v)

3 LCD Liquid Crystal Driving Voltage. Ajuste del contraste (Se aplicada una tensión variable entre 0 y 5V)

4 RS# Register Select. Selección DATO/COMANDO (Es una línea de control que se le indica al display si
se está enviando en el bus de datos un comando (RS=0) o un dato (RS=1))
5 R/W# Read, Write. Lectura o escritura en LCD (Es otra línea de control que LE se indica al display si se está
enviando un dato (R/W=0) o leyendo un dato del display (R/W=1))
6 E Enable. Habilitación (Esta línea de control sirve para habilitar el display para que reciba un dato o
instrucciones a través del bus (E=1))
7 DB0 Data Bus Line 0 - Bit menos significativo. Sobre estas líneas viajan los datos entre el micro y el display

8 DB1 Data Bus Line 1

9 DB2 Data Bus Line 2

10 DB3 Data Bus Line 3

11 DB4 Data Bus Line 4

12 DB5 Data Bus Line 5

13 DB6 Data Bus Line 6

14 DB7 Data Bus Line 7. Bit más significativo

15 LED+ Ánodo de LED backlight

16 LED- Cátodo de LED backlight

Nota: # significa negado

Según la operación que se desee realizar en el módulo LCD, los pines de control E, RS#, R/W#
deben tener un estado determinado. Además, debe tener en el bus de datos un código que
indique un caracter para mostrar en la pantalla o una instrucción de control para el display.

Para reducir al máximo las conexiones entre el micro y el LCD, se usará la modalidad de interconexión de
datos a 4 bit, usando sólo las líneas DB4, DB5, DB6, DB7. Las líneas DB0, DB1, DB2 y DB3 no serán
usadas y serán conectadas a tierra.

Tampoco la línea R/W# será utilizada por lo que será puesta a tierra. De este modo, quedará
seleccionado el modo escritura. En la práctica, sólo se podrá enviar datos al LCD pero no
recibirlos.

2
a) La línea Register Select (RS) y Enable (E) del LCD

Para poder visualizar una frase en el LCD, el PIC debe enviar una serie de comandos a
través del bus de datos (líneas DB4 a DB7). Para hacer esto, son utilizadas dos líneas de
control con las que se comunica al LCD la operación de transferencia que realizará el bus.

Las dos líneas de control son Register Select (pin 4) y Enable (pin 6) del LCD, las cuales se
describen a continuación:

 Con la línea Register Select, el PIC indica al display que el dato presente en el bus es
un comando ( RS=0 ) o un dato a ser visualizado ( RS=1 ). A través de los comandos, el PIC
puede indicar al LCD el tipo de operación a realizar, como por ejemplo "limpiar pantalla".
Con los datos, el PIC puede enviar directamente los caracteres ASCII a ser visualizados.
 La línea Enable habilita al LCD para leer el comando o el dato enviado en el bus por el
PIC. El PIC debe ocuparse de haber enviado en el bus de datos el comando o el dato
correcto antes de poner a 1 la señal Enable.

b) Mutiplexado sobre el bus de datos

Puesto que los comandos son datos de 8 bits ¿Cómo es posible enviarlos al LCD si el bus de
datos dispone sólo de 4 líneas?

En la práctica se usa la operación de multiplexado, es decir, cada bit es descompuesto en dos


grupos de 4 bit y transmitidos por el bus de datos en secuencia. Son enviados primero los 4
bit menos significativos seguidos de los 4 bit más significativos.

En el ejemplo a desarrollar, todas las operaciones de transmisión de datos y comandos hacia


el LCD son seguidas de una serie de subrutinas, simplificando de esa manera la complejidad
del programa.

Los módulos LCD responden a un conjunto especial de instrucciones, estas deben ser enviadas
por el microcontrolador o sistema de control al display, según la operación que se requiera. Se
muestran en la Tabla 2 el conjunto de instrucciones del módulo LCD.

Tabla 2. Conjunto de instrucciones del módulo LCD

Código de Operación Tiempo de


Instrucción Descripción
RS R/W B7 B6 B5 B4 B3 B2 B1 B0 Ejecución
Borra el contenido de la pantalla y
Clear display 0 0 0 0 0 0 0 0 0 1 retorna el cursor a la posición 1.52 ms
“home” (dirección 0).
Retorna el cursor a la posición
“Home”. Retorna también el área de
Cursor home 0 0 0 0 0 0 0 0 1 * visión a la posición inicial. El 1.52 ms
contenido de la DDRAM
permanece intacto.
Incrementar/Decrementar dirección
(I/D); Habilitar corrimiento de
Entry mode set 0 0 0 0 0 0 0 1 I/D S 37 μs
pantalla (S). Estas operaciones se
realizan al leer o escribir datos
Display on/off 0 0 0 0 0 0 1 D C B Enciende o apaga el display (D), 37 μs

3
control Cursor encendido / apagado (C),
destello del cursor (blink) (B).
Selecciona entre desplazamiento de
pantalla o de cursor (S/C),
Cursor/display
0 0 0 0 0 1 S/C R/L * * selecciona la dirección de 37 μs
shift
desplazamiento (R/L). El contenido
de la DDRAM permanece intacto.
Configurar en ancho de bus (4 u 8
Function set 0 0 0 0 1 DL N F * * bits) (DL), Número de líneas de 37 μs
display (N), y tipo de fuente (F).
Escribe la dirección de CGRAM.
Set CGRAM Dirección generador de Los datos a almacenar en CGRAM
0 0 0 1 37 μs
address RAM pueden ser enviados después de esta
instrucción
Escribe la dirección de DDRAM.
Set DDRAM Los datos a almacenar en DDRAM
0 0 1 Dirección de datos RAM 37 μs
address pueden ser enviados después de esta
instrucción
Leer bandera “Ocupado” (Bussy
Flag) indicando si el controlador
Read busy flag está realizando alguna operación
&address 0 1 BF CGRAM/DDRAM address interna o está listo para aceptar 0 μs
counter datos/comandos. Lee la dirección
CGRAM o DDRAM (dependiendo
de la instrucción previa).
Write CGRAM Escribe datos a las memorias
1 0 Escritura de Dato 37 μs
orDDRAM CGRAM o DDRAM.
Read from Lee datos desde las memorias
1 1 Lectura de Dato 37 μs
CG/DDRAM CGRAM o DDRAM.

NOTA: nótese que el pin RS# debe tomar el valor 0 (cero) cuando lo que se va a enviar es una
instrucción de control y debe tomar el valor 1 (uno) cuando lo que se va a enviar es un dato.

En la Tabla 3 se muestra los nombres y significado de bits en instrucciones.

Tabla 3. Significado de las abreviaturas

SIGNIFICADO DE LAS ABREVIATURAS


(Nombres y significado de bits en instrucciones)
I/D – 0 = disminuir el contador de dirección, 1 = incrementar el contador de dirección;

S – 0 = Sin corrimiento de display, 1 = Con corrimiento de display;

D – 0 = Display Apagado, 1 = Display Encendido;

C – 0 = Cursor Apagado, 1 = Cursor Encendido;

B – 0 = Parpadeo cursor Apagado, 1 = Parpadeo Cursor Encendido;

S/C – 0 = Mover Cursor, 1 = Corrimiento de pantalla;

R/L – 0 = Mover/Correr a la izquierda, 1 = Mover/Correr a la derecha;

4
DL – 0 = Interfaz de 4 bits, 1 = Interfaz de 8 bits;

N – 0 = 1 línea, 1 = 2 líneas;

F – 0 = 5×8 puntos, 1 = 5×10 puntos;

BF – 0 = puede aceptar instrucción, 1 = operación interna en progreso.

Nota: Cuando se va a cargar la dirección de la DDRAM donde se va a escribir el próximo


caracter, nótese que el D7 siempre es 1. Por lo tanto cuando se apunta a una dirección de
memoria en el display hay que considerar este 1 adicional. Se verá con más detalle al describir el
mapa de memoria del módulo LCD.

La interface entre el microcontrolador y el LCD se puede hacer con el bus de datos del PIC
trabajando a 4 u 8 bits. Las señales de control trabajan de la misma forma en cualquiera de los
dos casos, la diferencia se establece en el momento de iniciar el display, ya que existe una
instrucción que permite establecer dicha configuración. O sea se tiene que avisarle al LCD que
se va a operar en 8 o a 4 bits.

Los caracteres que se envían al display se almacenan en la memoria RAM del módulo. Existen
posiciones de memoria RAM, cuyos datos son visibles en la pantalla y otras que no son visibles,
estas últimas se pueden utilizar para guardar caracteres que luego se desplazan a la zona visible.

Es importante anotar que solo se pueden mostrar caracteres ASCII de 7bits, por lo tanto algunos
caracteres especiales no se pueden ver (es aconsejable tener a mano una tabla de caracteres
ASCII para conocer los datos que son prohibidos). También se tiene la opción de mostrar
caracteres especiales creados por el programador y almacenarlos en la memoria RAM que posee
el módulo.

INTERFAZ CON MICROCONTROLADOR A 8 BITS

http://www.bolanosdj.com.ar/SOBRELCD/TEORIALCDV1.pdf

Esta forma de manejo es la más sencilla de programar, pero tiene la desventaja de utilizar 8 pines
del microcontrolador solo para el envío de datos y otros 2 pines para las señales de control.

En principio en la mayor parte de las aplicaciones se va requerir escribir en el LCD y rara vez
leer en el mismo, por lo tanto en este curso se dedicará exclusivamente a escribir en el LCD.
Esto implica que el pin de selección de lectura/escritura (R/W) se conectará siempre a tierra
GND.

Si se utiliza el puerto B como bus de datos (manejará los pines D0 a D7 del LCD) y el puerto A
se encarga de manejar las señales de control (manejará los pines E y RS del LCD).

Se debe programar 2 subrutinas, una que se llama INSTRUC que será invocada cuando se quiera
enviar una instrucción al módulo LCD, por ejemplo limpiar pantalla, indicar una posición de
memoria, indicar si se utiliza interfaz de 8 o 4 bits etc. Y otra subrutina que se llama ESCRIB
que será invocada cuando se quiera escribir un dato para ser visualizado en el módulo LCD.

5
Se configurará entonces todo el puerto B como salida al igual que los pines RA0 y RA1 del
puerto A, estando asignado cada pin del puerto como se indica a continuación:

Pin PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
Pin LCD D7 D6 D5 D4 D3 D2 D1 D0

Pin PORTA RA5 RA4 RA3 RA2 RA1 RA0


Pin LCD E RS

RS = 1  DATO (o sea se va a escribir)


RS = 0  CONTROL (o sea se va a enviar un instrucción al módulo LCD).

RECORDAR: Como solo se va a escribir en pantalla, el pin R/W vale siempre 0 (cero), así que
se lo conecta directamente a tierra.

Evidentemente se debe configurar el PORTB del PIC como salida, y en el PORTA los pines
RA0 y RA1 deben ser configurados como salidas. El resto de los pines del PORTA se puede
configurar como se desee. Recuerde que se está basando esta explicación para interface de 8 bits.

Lo primero que hay que hacer es mandar una serie de instrucciones al módulo LCD que
constituyen la configuración del mismo. Luego recién se podrá escribir el mensaje a presentar en
pantalla.

Las siguientes son una serie de instrucciones muy importantes (son independiente a que se
use interface de 4 u 8 bits:

ACTIVAR FUNCION (Instrucción)

Se informa el tipo de interfaz que se va a usar, 4 o 8 bits. La cantidad de líneas (1 o 2). La fuente
de caracter (5x8 dots o 5x10 dots).

RS R/W# D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 DL N F - -

DL = 0 interfaz de 4 bits.
DL = 1 interfaz de 8 bits.

N=0 se va a usar 1 sola línea del display.


N=1 se van a usar 2 líneas del display.

F=0 fuente de caracter 5x8 dots.


F=1 fuente de caracter 5x10 dots.

Entonces si se envía al PORTB 30h

D7 D6 D5 D4 D3 D2 D1 D0
0 0 1 1 0 0 0 1

6
DL = 1 interfaz de 8 bits.
N=0 se va a usar 1 sola línea del display.
F=0 fuente de caracter 5x8 dots.

Ahora se debe llamar a la subrutina INSTRU (esta subrutina debe ser creada por el programador,
se le puede dar el nombre que se quiera), la cual va a enviar 30h al PORTB, hacer RS=0 o sea le
dice al LCD que lo que va a recibir es una instrucción (RA0= 0 del PORTA) y E=1 o sea habilita
al LCD (RB1= 0 del PORTA), luego vuelve a hacer E=0 deshabilita.

ACTIVAR DISPLAY (Instrucción)

Configura el estado ON/OFF de todo el display, el estado del cursor y el parpadeo del caracter en
la posición del cursor.

RS R/W# D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 1 D C B

RS se maneja con PORTA


RW# se conecta a tierra

Donde:

D=1 enciende pantalla (activar)


D=0 apaga pantalla (desactivar)

C=1 activar cursor


C=0 desactivar cursor

B=1 parpadea caracter señalado por el cursor


B=0 no parpadea caracter.

Por ejemplo, si envió 0Ch al PORTB

D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 1 1 0 0

Se está diciendo:

D=1 encienda la pantalla


C=0 desactivar cursor
B=0 no parpadeo del caracter

Ahora se debe llamar nuevamente a la subrutina INSTRU (esta subrutina debe ser creada por el
programador, se le puede dar el nombre que se quiera), la cual va a enviar 0Ch al PORTB, hacer
RS=0 o sea le dice al LCD que lo que va a recibir es una instrucción (RA0=0 del PORTA) y E=1
o sea habilita al LCD (RB1= 0 del PORTA), luego vuelve a hacer E=0 deshabilita.

7
BORRAR PANTALLA (Instrucción)

Limpia pantalla y retorna el cursor al inicio (dirección 00h del display).

RS R/W# D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 0 0 0 1

Se invoca la subrutina INSTRUC.

SELECCIONAR MODO (Instrucción)

Selecciona el modo de desplazamiento del display y se desplaza o no el cursor.

RS R/W# D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 0 1 ID S

S=0 display no se desplaza, dato fijo en pantalla.


S=1 display se desplaza.

ID = 1 incremento.
ID = 0 decremento.

En el ejemplo se envía al PORTB 06h.

D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 1 1 0

S=0 dato fijo en pantalla

NOTAR que los unos enviados a D2 y D1 carecen de sentido porque no hay desplazamiento.

Se invoca la subrutina INSTRUC.

Hasta aquí se han enviado las instrucciones previas para inicializar el módulo LCD y dejarlo listo
para la escritura de datos en pantalla.

El envió de los datos se realiza por medio de los pines D0 a D7 del LCD, que se encuentran
conectados a los pines RB0 a RB7 del PORTB B del PIC. Por lo tanto los datos a escribir deben
ser enviados a través del PORTB B.

Un dato se envía por medio de su código ASCII, pero previamente se debe indicar al módulo la
posición de memoria en que deseo escribir el dato que se enviará a continuación. Esto se hace
por medio de la instrucción DDRAM.

DDRAM (Instrucción)

Le informa al módulo LCD la dirección de memoria en la cual se va almacenar el código del


dato que se le enviará a continuación.

8
RS R/W# D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 Posición de memoria a escribir dato

Luego se invoca a subrutina INSTRUC, ya que es una instrucción para el LCD.

NOTA: el 1 en D7 debe ir siempre.

Se aclara algo para no confundirse. Supóngase que se desea escribir 'A' en la posición de
memoria 00h del LCD.

Como se tiene que asegurar el 1 en el D7 se debe enviar al PORTB (recordar que D0 ... D7 del
LCD está conectado a RB0 ... RB7 del PORTB) en lugar de 00h el 80h, esto es para asegurar el 1
en el D7 (el 1en D7 hace 00000000 se convierta en 10000000 o sea 80h).

Así quedará en este caso:

D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 0 0 0 0 0

Ahora que se le informa donde se va a escribir el dato, se debe enviarlo y aclararle que se está
enviando un dato, para lo cual se necesita una subrutina que justamente hará esto y que se la
llamará ESCRIB.

La secuencia de instrucciones sería así:

MOVLW 80h ;carga en W la dirección de memoria del LCD donde se va


almacenar el dato
CALL INSTRUC ;subrutina que gestiona la instrucción con el LCD, en este caso
que tome lo que se está enviando como una dirección de
memoria
MOVLW 'A' ;este es el dato a presentar en pantalla
CALL ESCRIB ;subrutina que gestiona el ingreso del dato al LCD a la posición
de memoria antes enviada.

NOTA: A continuación se transcribe la solución completa al ejemplo de escribir en el display el


mensaje 'HOLA MUNDO'. Se recomienda observar con detalle las subrutinas INSTRUC y
ESCRIB que operan con interfaz de 4 bit. Se utiliza PIC16F84.

;muestra en LCD - HOLA MUNDO en interfase de 8 bits

processor 16f877
include <p16f877.inc>

portb equ 06h ;el puerto b esta en la posicion 06h de la ram


porta equ 05h ;el puerto a esta en la posicion 05h de la ram
trisaa equ 85h ;regis de config de puerto a esta en la direcc 85h de
la ram
trisb equ 86h ;regis de config de puerto b esta en la direcc 86h de la ram
trisa equ 85h

9
status equ 03h ;registro de estado esta en la direcc 03h de la ram
temp5 equ 0ch

org 00

inicio
bsf status,5 ;se posiciona en banco1
clrf trisb ;define el portb como salida
clrf trisa ;define el porta como salida
movlw 06h ; carga w con literal 06h
movwf ADCON1; carga ADCON1 con w = 06h para entradas digitales
bcf status,5

;-------inicializacion del LCD--------

movlw 30h; carga w con literal 30h


;la intrucc asociada dice: interface de datos de 8 bits y se va a usar 1
;linea - corresponde a la intruccion ACTIVAR FUNCION

call instruc; enviaremos este valor al portb y por lo tanto al LCD

;------------otra instruccion-----------
movlw 06h; carga w con literal 06h
;la intrucc asociada dice: dato fijo en pantalla- corresponde a la intruccion
;SELECCIONAR MODO

call instruc; enviaremos este valor al portb y por lo tanto al LCD

;------------otra instruccion-----------

movlw 0Ch; carga w con literal 0Ch


;la intrucc asociada dice: encienda la pantalla y desactive el cursor-
;corresponde a la intruccion ENCENDER O APAGAR PANTALLA

call instruc; enviaremos este valor al portb y por lo tanto al LCD

;------------otra instruccion-----------
movlw 01h; carga w con literal 01h
;la intrucc asociada dice: BORRAR PANTALLA

call instruc; enviaremos este valor al portb y por lo tanto al LCD

;----fin inicializacion del LCD-----

;---escritura de datos---------------

movlw 80h; se indica posicion de memoria del LCD en que quiere


; escibir el dato

call instruc

movlw " "; este es dato - al estar entre comillas se le indica al


; compilador que el dato requerido es el valor ASCII del
; caracter

call escrib

;repito con el resto de los datos

movlw 81h;
call instruc

10
movlw "H";
call escrib

movlw 82h;
call instruc
movlw "O";
call escrib

movlw 83h;
call instruc
movlw "L";
call escrib

movlw 84h;
call instruc
movlw "A";
call escrib

movlw 85h;
call instruc
movlw " ";
call escrib

movlw 86h;
call instruc
movlw "M";
call escrib

movlw 87h;
call instruc
movlw "U";
call escrib

movlw 88h;
call instruc
movlw "N";
call escrib

movlw 89h;
call instruc
movlw "D";
call escrib

movlw 8Ah;
call instruc
movlw "O";
call escrib

movlw 8Bh;
call instruc
movlw ".";
call escrib

movlw 8Ch;
call instruc
movlw ".";
call escrib

;---fin escritura de datos-----------

;--------SUBRUTINAS-------------

11
;Subrutina que manda una instruccion al LCD

instruc
bcf porta,0 ; hace 0 el bit 0 del porta o sea hace RS=0 - Le dice
; al LCD que es una intruccion lo que va a recibir

bsf porta,1; hace 1 el bit 1 del porta - O sea E=1 habilita LCD

movwf portb; carga contenido de w en portb


call retardo
bcf porta,1; hace 0 el bit 1 del porta - O sea E=0 habilita LCD
call retardo
return

;----------------------------------------

;Subrutina que manda un dato al LCD


escrib
bsf porta,0 ; hace 1 el bit 0 del porta o sea hace RS=1 - Le dice
; al LCD que es es un dato lo que va a recibir

bsf porta,1 ; hace 1 el bit 1 del porta - O sea E=1


; habilita LCD

movwf portb; carga contenido de w en portb


call retardo
bcf porta,1; hace 0 el bit 1 del porta - O sea E=0 habilita LCD
call retardo
return

;----------------------------------------

;Subrutina retardo

retardo
movlw 0ffh; carga literal 0ffh en w
movwf temp5; mueve contenido de w a temp5
decr
decfsz temp5,1 ; decrementa temp5 y guarda resultado en temp5-
salta
; la intruccion siguiente si temp es igual a cero
goto decr
return

;--------FIN SUBRUTINAS--------

end

El circuito con interface de 8 bits en Proteus se muestra en la Figura 2.

12
LCD1
LCD16x2

VDD
VSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
E
1
2
3

4
5
6

7
8
9
10
11
12
13
14
BOXER
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
X1 1 35
MCLR/Vpp/THV RB2
36
RB3/PGM
2 37
RA0/AN0 RB4
3 38
RA1/AN1 RB5
20Mhz R1 4
RA2/AN2/VREF- RB6/PGC
39
10k 5 40
RA3/AN3/VREF+ RB7/PGD
C2 C1 6
RA4/T0CKI
22p 22p 7 15
RA5/AN4/SS RC0/T1OSO/T1CKI
16
RC1/T1OSI/CCP2
8 17
RE0/AN5/RD RC2/CCP1 VDD
9 18
RE1/AN6/WR RC3/SCK/SCL
10 23
VDD RE2/AN7/CS RC4/SDI/SDA
24
RC5/SDO
25
RC6/TX/CK
26
RC7/RX/DT
19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F877

Figura 2. Circuito en Proteus con interface de 8 bits

MAPA DE LA MEMORIA DEL MODULO LCD

En la Tabla 4. Se muestra el Mapa de la Memoria del Módulo LCD (2 líneas x 16 caracteres).

Tabla 4. Mapa de la Memoria del Módulo LCD (2 líneas x 16 caracteres)

00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh 10h --- 1Fh

40h 41h 42h 43h 44h 45h 46h 47h 48h 49h 4Ah 4B 4C 4D 4Eh 4Fh 50h --- 5Fh

Área no
Área visible visible - 16
posiciones

Como se había mencionado anteriormente, al enviar una dirección hay que asegurar el 1 en D7

Ejemplo:

D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 0 0 0 0 0

13
De este modo se podría pensar en un mapa de memoria equivalente del módulo LCD como
muestra en la Tabla 5, en el caso de solo utilizar la zona visible.

Tabla 5. Mapa de la Memoria del Módulo LCD de la zona visible

80h 81h 82h 83h 84h 85h 86h 87h 88h 89h 8Ah 8Bh 8Ch 8Dh 8Eh 8Fh

C0h C1h C2h C3h C4h C5h C6h C7h C8h C9h CAh CB CC CD CEh CFh

MANEJO DEL LCD CON INTERFAZ DE 4 BITS

Es el caso más utilizado para aprovechar los puertos del PIC. Dejando disponibles pines de los
mismos para otras funciones.

Por ejemplo si se usa el PORTB:

RB4 RB5 RB6 RB7 respectivamente conectados a D4 D5 D6 D7

RB0 RB1 a RS y E respectivamente

RW va a tierra

Las subrutinas INSTRUC y ESCRIB serán diferentes que para el caso de interfaz de 8 bits. Estas
enviaran primero los 4bit MSB y luego los 4 bits LSB.

En la figura 2 se muestra el conexionado para manejar un display LCD con interfaz de 4 bit y se
transcribe un programa que presenta los siguientes mensajes en el LCD con interfaz de 4 bits:

(C) DJB_2009  Primera fila


E  Segunda fila

Repite los siguientes mensajes:

Limpia la pantalla
(C) DJB_2009  Primera fila

Limpia la pantalla
RECREO……  Primera fila

Limpia la pantalla
ALARMA……  Primera fila

14
Figura 2. Manejo del LCD con interfaz de 4 bits

;muestra en LCD -MENSAJES en interfase de 4 bits- nombre del archivo


;lcd3--version 2
;se usara 4 bits MSB del puertob para envio de datos a 4bits - RB4 RB5 RB6
;RB7 respectivamente conectados a D4 D5 D6 D7 y RB0 RB1 a RS y E
;respectivamente- RW va a tierra.
;---------------------------------------------------------------------
;RECORDAR CAMBIAR DIRECCIONES DE REGISTROS DE PROPOSITO GENERAL A PARTIR DE
;20h SI UTILIZA EL PIC 16F818
;---------------------------------------------------------------------

processor 16f877
include <p16f877.inc>

;---Listado de registros especiales utilizado en este programa--

portb equ 06h ;el puerto b esta en la posicion 06h de la ram


porta equ 05h ;el puerto b esta en la posicion 05h de la ram
trisa equ 85h ;regis de config de puerto b esta en la direcc 85h de la
;ram
trisb equ 86h ;regis de config de puerto b esta en la direcc 86h de la
;ram
status equ 03h ;registro de estado esta en la direcc 03h de la ram

;---Fin de listado de registros especiales utilizado en este programa--

;Comienza listado de registros de proposito general empleados en este


;programa

;--------------registros de subrutina retardo-------------


temp5 equ 20h

;--------------Fin registros de subrutina retardo---------

;--------------registros de subrutina INSTRUC/ESCRIB---------

15
aux equ 21h

;--------------Fin registros de subrutina INSTRUC/ESCRIB--------

;------------- registros de subrutina espera y larga--------

tempo1 equ 26h


tempo2 equ 28h
tempo3 equ 2Ah

;------------- Fin registros de subrutina espera y largaespera------

;--------Fin del listado de registros de proposito general empleados en este


;programa--------

;------INICIO programa principal-----

org 00
inicio

bsf status,5 ;se posiciona en banco1


clrf trisb ;define el portb como salida
movlw b'00001100'
movwf trisa

bcf status,5; se posiciona en banco 0

call lcd; se llama subrutina de inicializacion del LCD

call copyright; escribe copyright


call largaespera

mostrar
btfsc porta,2 ; si en el pin 2 del porta hay un 0 entonces muestra
; mensaje1-alternado con mensaje3
goto frase2
call mensaje1
call espera
frase2
btfsc porta,3 ; si en el pin 3 del porta hay un 0 entonces muestra
; mensaje2-alternado con mensaje3
goto frase3
call mensaje2
call espera
frase3
call copyright ; si recibe un 0 en pines 2 y 3 de porta muestra
; mensaje3
call espera
goto mostrar

;---fin programa principal-----------

;--------SUBRUTINAS-------------

;-------Subrutina LCD ------------------------------------


;esta subrutina inicia la pantalla LCD
;esta subrutina no utiliza registros de proposito general

lcd
movlw 02h; carga w con literal 02h RB1=1 o sea E=1 habilito LCD

16
call instruc; enviaremos este valor al portb y por lo tanto al LCD

;------------otra instruccion-----------
movlw 28h; carga w con literal 28h
;la intrucc asociada dice: interfase de datos de 4 bits y se va a usar 2
;lineas - corresponde a la intruccion ACTIVAR FUNCION

call instruc; enviaremos este valor al portb y por lo tanto al LCD

;------------otra instruccion-----------
movlw 06h; carga w con literal 06h
;la intrucc asociada dice: dato fijo en pantalla- corresponde a la intruccion
;SELECCIONAR MODO

call instruc; enviaremos este valor al portb y por lo tanto al LCD

;------------otra instruccion-----------

movlw 0Ch; carga w con literal 0Ch


;la intrucc asociada dice: encienda la pantalla y desactive el
;cursor- corresponde a la intruccion ENCENDER O APAGAR PANTALLA

call instruc; enviaremos este valor al portb y por lo tanto al LCD

;------------otra instruccion-----------
movlw 01h; carga w con literal 01h
;la intrucc asociada dice: BORRAR PANTALLA

call instruc; enviaremos este valor al portb y por lo tanto al LCD


return

;esta subrutina inicio la pantalla LCD


;-------Fin Subrutina LCD --------

;--------------------Subrutina INSTRC/ESCRIB-------------------------

;Subrutina que manda una instruccion o dato al LCD


;Esta subrutina utiliza el registro de proposito general aux

instruc
bcf portb,0; RB0=0 o sea RS=0 es una instruccion para LCD
goto dato2
escrib
bsf portb,0; RB0=1 o sea RS=1 es una dato para LCD

dato2

;lo que se va hacer es para no alterar el contenido de los 4 bit menos


significativos dell portb

movwfaux; guarda contenido de w en aux


movlw0fh; carga 00001111 en w
andwfportb,1 ; AND entre w=00001111 y portb y guarda resultado en
; portb
;lo que se termino de hacer es para no alterar el contenido de los 4 bit
;menos significativos dell portb

movf aux,0; carga aux en w

andlw b'11110000'; AND entre literal 11110000 y w en el cual esta


; copiado aux (guarda el resultdado en w)

17
iorwf portb,1; OR entre w y portb - guarda resultado en portb

bsf portb,1; RB1=1 o sea E=1 habilito LCD

call retardo

bcf portb,1; RB1=E=0 deshabilita LCD


call retardo

;---terminó envio 4 bit MSB-------


;---comienza el envio de 4 bit LSB---

movlw 0fh; carga 00001111 en w


andwf portb,1 ; AND entre w=00001111 y portb - guarda resultado en
; portb
swapf aux,0; intercambia NIBLES de aux y lo guarda en w
andlw b'11110000'; AND entre literal 11110000 y w en el cual esta
; copiado aux con los NIBLES intercambiados
;(guarda el resultdado en w)
iorwf portb,1; OR entre w y portb - guarda resultado en portb

;lo que se termino de hacer es para no alterar el contenido de los 4 bit


;menos significativos dell portb

bsf portb,1; RB1=1 o sea E=1 habilito LCD


call retardo
call retardo
bcf portb,1; RB1=E=0 deshabilita LCD
call retardo
;---termino el envio de lo 4bit LSB---
return

;---------Fin subrutina que manda instruccion o dato al LCD------


;------------------Fin Subrutina INSTRC/ESCRIB------------------------

;----------------Subrutina retardo----------------------------------
;Esta subrutina utiliza el registro de proposito general temp5

retardo

movlw 0ffh; carga literal 0ffh en w


movwf temp5; mueve contenido de w a temp5
decr
decfsz temp5,1 ; decrementa temp5 y guarda resultado en temp5- salta
; la intruccion siguiente si temp5 es igual a cero
goto decr
movlw 0ffh; carga literal 0ffh en w
movwf temp5; mueve contenido de w a temp5
decr2
decfsz temp5,1 ; decrementa temp5 y guarda resultado en temp5- salta
; la intruccion siguiente si temp5 es igual a cero
goto decr2
return

;---------------- Fin Subrutina retardo----------------------------------

;----------Subrutina largaespera - -----------------------

largaespera

18
;Escribe una E en display para indicar larga espera
movlw 0CFh;
call instruc
movlw "E";
call escrib
;Termino de escribir la E

retardo4
incf tempo1,1
retardo5
incf tempo2,1
retardo6
incf tempo3,1
btfss tempo3,7
goto retardo6
clrf tempo3
btfss tempo2,7
goto retardo5
clrf tempo2
btfss tempo1,7
goto retardo4
clrf tempo1

;Llama reiteradas veces a subrutina espera -para incrementar espera


;Tanto como subrutina espera y largaespera utilizan los mismos registros de
;proposito general

call espera
call espera
; Termino de llamar reiteradas veces a subrutina espera

;Limpia la E en display que escribio al principio


movlw 0CFh;
call instruc
movlw " ";
call escrib
;Termino de limpiar la E

return
;-----Fin subrutina largaespera-----------------------

;----------Subrutina espera -( Retardo general)--------


;Esta subrutina utiliza los registros de proposito general- temp1-temp2-temp3
;Son los mismos que utiliza la subrutina largaespera

espera nop

retardo1
incf tempo1,1
retardo2
incf tempo2,1
retardo3
incf tempo3,1
btfss tempo3,6
goto retardo3
clrf tempo3
btfss tempo2,5
goto retardo2
clrf tempo2
btfss tempo1,4
goto retardo1

19
clrf tempo1
return
;-------------------Fin subrutina espera------------

;---Subrutina copyright-----------

copyright
movlw 01h
; call instruc; borrar pantalla

movlw 80h; se indica posicion de memoria del LCD en que quiere


escibir el dato

call instruc

movlw "("; este es el primer caracter del mensaje - al estar entre


; comillas se le indica al compilador que el dato requerido
; es el valor ASCII del caracter

call escrib

;repito con el resto de los caracteres

movlw 81h;
call instruc
movlw "c";
call escrib

movlw 82h;
call instruc
movlw ")";
call escrib

movlw 83h;
call instruc
movlw " ";
call escrib

movlw 84h;
call instruc
movlw "D";
call escrib

movlw 85h;
call instruc
movlw "J";
call escrib

movlw 86h;
call instruc
movlw "B";
call escrib

movlw 87h;
call instruc
movlw "-";
call escrib

movlw 88h;
call instruc

20
movlw "2";
call escrib

movlw 89h;
call instruc
movlw "0";
call escrib

movlw 8Ah;
call instruc
movlw "0";
call escrib

movlw 8Bh;
call instruc
movlw "9";
call escrib

call espera
call espera
call espera
call espera

return

;---Fin subrutina copyright-----------------------------------------------

;---Subrutina mensaje1-----------

mensaje1
movlw 01h
; call instruc; borrar pantalla

movlw 80h; se indica posicion de memoria del LCD en que quiere


; escibir el dato

call instruc

movlw "R"; este es el primer caracter del mensaje - al estar entre


; comillas se le indica al compilador que el dato requerido
; es el valor ASCII del caracter

call escrib

;repito con el resto de los caracteres

movlw 81h;
call instruc
movlw "E";
call escrib

movlw 82h;
call instruc
movlw "C";
call escrib

movlw 83h;
call instruc
movlw "R";

21
call escrib

movlw 84h;
call instruc
movlw "E";
call escrib

movlw 85h;
call instruc
movlw "O";
call escrib

movlw 86h;
call instruc
movlw ".";
call escrib

movlw 87h;
call instruc
movlw ".";
call escrib

movlw 88h;
call instruc
movlw ".";
call escrib

movlw 89h;
call instruc
movlw ".";
call escrib

movlw 8Ah;
call instruc
movlw ".";
call escrib

movlw 8Bh;
call instruc
movlw ".";
call escrib

call espera
call espera
call espera
call espera

return

;---Fin subrutina mensaje1-----------------------------------------------

;---Subrutina mensaje2-----------

mensaje2
movlw 01h
; call instruc; borrar pantalla

movlw 80h; se indica posicion de memoria del LCD en que quiere


; escibir el dato

22
call instruc

movlw "A"; este es el primer caracter del mensaje - al estar entre


; comillas se le indica al compilador que el dato requerido
; es el valor ASCII del caracter

call escrib

;repito con el resto de los caracteres

movlw 81h;
call instruc
movlw "L";
call escrib

movlw 82h;
call instruc
movlw "A";
call escrib

movlw 83h;
call instruc
movlw "R";
call escrib

movlw 84h;
call instruc
movlw "M";
call escrib

movlw 85h;
call instruc
movlw "A";
call escrib

movlw 86h;
call instruc
movlw ".";
call escrib

movlw 87h;
call instruc
movlw ".";
call escrib

movlw 88h;
call instruc
movlw ".";
call escrib

movlw 89h;
call instruc
movlw ".";
call escrib

movlw 8Ah;
call instruc
movlw ".";
call escrib

23
movlw 8Bh;
call instruc
movlw ".";
call escrib

call espera
call espera
call espera
call espera

return

;---Fin subrutina mensaje2-----------------------------------------------

;--------FIN SUBRUTINAS-------------

end

El circuito con interface de 4 bits en Proteus se muestra en la Figura 3.

LCD1
LCD16x2

VDD
VSS

VEE

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
E
1
2
3

4
5
6

7
8
9
10
11
12
13
14
BOXER
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
X1 1 35
MCLR/Vpp/THV RB2
36
RB3/PGM
R1 2
RA0/AN0 RB4
37
10k 3 38
RA1/AN1 RB5
4 39
20Mhz RA2/AN2/VREF- RB6/PGC
5 40
RA3/AN3/VREF+ RB7/PGD
C2 C1 6
RA4/T0CKI
22p 22p 7 15
RA5/AN4/SS RC0/T1OSO/T1CKI
16
RC1/T1OSI/CCP2
8 17
VDD RE0/AN5/RD RC2/CCP1 VDD
9 18
RE1/AN6/WR RC3/SCK/SCL
10 23
RE2/AN7/CS RC4/SDI/SDA
24
RC5/SDO
25
RC6/TX/CK
26
RC7/RX/DT
19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F877

Figura 3. Circuito en Proteus con interface de 4 bits

Conexiones básicas de una pantalla lcd 16×2


El HD44780 permite conectarse a través de un bus de 4 u 8 bits. El modo de 4 bits permite usar
solo 4 pines para el bus de datos, dándonos un total de 6 o 7 pines requeridos para la interfaz con
el LCD, mientras que el modo de 8 bits requiere 10 u 11 pines. El pin RW es el único que
puede omitirse si se usa la pantalla en modo de solo escritura y deberá conectarse a tierra si

24
no se usa. En este caso el microcontrolador no puede leer desde el chip controlador de pantalla,
pero en la mayoría de las situaciones esto no es necesario.

1. Diagrama para modo de 4 bits

Las conexiones para el modo de 4 bits en un PIC16F877 se muestran en la Figura 4. Se


utilizan los primeros 4 bits del puerto A (RA0-RA3) como bus de datos. RB0 como señal de
habilitación (E) y RB1 como señal de selección de registro (RS).

Figura 4. Las conexiones para el modo de 4 bits en un PIC16F877

2. Diagrama para modo de 8 bits

Las conexiones para el modo de 8 bits son algo más complicadas, ya que se requiere las 8
líneas de datos activas. En este caso se utiliza los 8 bits del puerto B, aunque se puede usar
cualquier combinación de pines. RA0 ahora funciona como señal de selección de registro
(RS) y RA1 como señal de habilitación (E). En la Figura 5 se muestra las conexiones para el
modo de 8 bits en un PIC16F877.

25
Figura 5. Las conexiones para el modo de 8 bits en un PIC16F877

Aplicación

Realizar una aplicación que muestre el siguiente mensaje en el lcd 2x16, en forma repetida, con
un tiempo de muestreo de 1 seg:

Hello World! Primera columna


Im OpenBoxer Segunda columna

Diagrama de Conexiones

Figura 6. muestra Las conexiones para el modo de 8 bits en un PIC16F877

26
Figura 6. Las conexiones para el modo de 8 bits en un PIC16F877

Código

processor 16F877
include <P16F877.INC>

;Variables para DELAY


cblock 0x30
val1
val2
endc

org 0 ;Vector de RESET

;Configuración de puertos
clrf PORTB ;Limpia PORTB
clrf PORTD ;Limpia PORTD
bsf STATUS, RP0
bcf STATUS, RP1 ;Selecciona el banco 1
clrf TRISB ;Configura PORTB como salida
clrf TRISD ;Configura PORTD como salida
bcf STATUS,RP0 ;Regresa al banco 0

START_LCD:
call INICIA_LCD ;Configura el LCD
call M1 ;Muestra Mensaje
call LINEA2 ;Configura línea 2
call M2 ;Muestra Mensaje
goto START_LCD

27
;Mensaje a enviar
M1:
movlw 'H' ;Mueve 'H' a W
movwf PORTB ;Mueve lo que hay en W a PORTB
call ENVIA ;Imprime en LCD
movlw 'e'
movwf PORTB
call ENVIA
movlw 'l'
movwf PORTB
call ENVIA
movlw 'l'
movwf PORTB
call ENVIA
movlw 'o'
movwf PORTB
call ENVIA
movlw ' '
movwf PORTB
call ENVIA
movlw 'W'
movwf PORTB
call ENVIA
movlw 'o'
movwf PORTB
call ENVIA
movlw 'r'
movwf PORTB
call ENVIA
movlw 'l'
movwf PORTB
call ENVIA
movlw 'd'
movwf PORTB
call ENVIA
movlw '!'
movwf PORTB
call ENVIA
return
M2:
movlw 'I' ;Mueve 'I' a W
movwf PORTB ;Mueve lo que hay en W a PORTB
call ENVIA ;Imprime en LCD
movlw 'm'
movwf PORTB
call ENVIA
movlw ' '
movwf PORTB
call ENVIA
movlw 'O'
movwf PORTB
call ENVIA
movlw 'p'
movwf PORTB
call ENVIA
movlw 'e'
movwf PORTB
call ENVIA
movlw 'n'
movwf PORTB
call ENVIA

28
movlw 'B'
movwf PORTB
call ENVIA
movlw 'o'
movwf PORTB
call ENVIA
movlw 'x'
movwf PORTB
call ENVIA
movlw 'e'
movwf PORTB
call ENVIA
movlw 'r'
movwf PORTB
call ENVIA
return

;Subrutina para inicializar el lcd


INICIA_LCD:
bcf PORTD,0 ; RS=0 MODO INSTRUCCION
movlw 0x01 ; El comando 0x01 limpia la pantalla en el LCD
movwf PORTB
call COMANDO ; Se da de alta el comando
movlw 0x0C ; Selecciona la primera línea
movwf PORTB
call COMANDO ; Se da de alta el comando
movlw 0x3C ; Se configura el cursor
movwf PORTB
call COMANDO ; Se da de alta el comando
bsf PORTD, 0 ; RS=1 MODO DATO
return

;Subrutina para enviar comandos


COMANDO:
bsf PORTD,1 ; Pone ENABLE en 1
call DELAY ; Tiempo de espera
call DELAY
bcf PORTD, 1 ; ENABLE=0
call DELAY
return

;Subrutina para enviar un dato


ENVIA:
bsf PORTD,0 ; RS=1 MODO DATO
call COMANDO ; Se da de alta el comando
return

;Configuración Líneal 2 LCD


LINEA2:
bcf PORTD, 0 ; RS=0 MODO INSTRUCCION
movlw 0xc0 ; Selecciona línea 2 en el LCD
movwf PORTB
call COMANDO ; Se da de alta el comando
return

; Subrutina de retardo
DELAY:
movlw 0xFF
movwf val2
ciclo:
movlw 0xFF

29
movwf val1
ciclo2:
decfsz val1,1
goto ciclo2
decfsz val2,1
goto ciclo
return
END

30

Potrebbero piacerti anche