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/

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.

16 caracteres, con iluminación azul y letras color blanco. Figura 1. LCD 2x16: está compuesto por

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.

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.

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 Ejecución RS R/W B7 B6 B5 B4 B3
Código de Operación
Tiempo de
Instrucción
Descripción
Ejecución
RS
R/W
B7
B6 B5
B4
B3
B2
B1
B0
Clear display
0
0
0
0
0
0
0
0
0
1
Borra el contenido de la pantalla y
retorna el cursor a la posición
“home” (dirección 0).
1.52
ms
Cursor home
0
0
0
0
0
0
0
0
1
*
Retorna el cursor a la posición
“Home”. Retorna también el área de
visión a la posición inicial. El
contenido de la DDRAM
permanece intacto.
1.52
ms
Entry mode set
0
0
0
0
0
0
0
1
I/D
S
Incrementar/Decrementar dirección
(I/D); Habilitar corrimiento de
pantalla (S). Estas operaciones se
realizan al leer o escribir datos
37 μs
Display on/off
0
0
0
0
0
0
1
D
C
B
Enciende o apaga el display (D),
37 μs
control Cursor encendido / apagado (C), destello del cursor (blink) (B). Cursor/display 0 0 0
control
Cursor encendido / apagado (C),
destello del cursor (blink) (B).
Cursor/display
0
0
0
0
0
1
S/C
R/L
*
*
37
μs
shift
Selecciona entre desplazamiento de
pantalla o de cursor (S/C),
selecciona la dirección de
desplazamiento (R/L). El contenido
de la DDRAM permanece intacto.
Function set
0
0
0
0
1
DL
N
F
*
*
Configurar en ancho de bus (4 u 8
bits) (DL), Número de líneas de
display (N), y tipo de fuente (F).
37
μs

Set CGRAM

       

Dirección generador de RAM

Escribe la dirección de CGRAM. Los datos a almacenar en CGRAM pueden ser enviados después de esta instrucción

 

address

0

0

0

1

37

μs

Set DDRAM

       

Escribe la dirección de DDRAM. Los datos a almacenar en DDRAM pueden ser enviados después de esta instrucción

 

address

0

0

1

Dirección de datos RAM

37

μs

Read busy flag &address counter

0

1

BF

CGRAM/DDRAM address

Leer bandera “Ocupado” (Bussy Flag) indicando si el controlador está realizando alguna operación interna o está listo para aceptar datos/comandos. Lee la dirección CGRAM o DDRAM (dependiendo de la instrucción previa).

0 μs

Write CGRAM

     

Escribe datos a las memorias CGRAM o DDRAM.

 

orDDRAM

1

0

 

Escritura de Dato

37

μs

Read from

     

Lee datos desde las memorias CGRAM o DDRAM.

 

CG/DDRAM

1

1

 

Lectura de Dato

37

μs

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;

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

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.

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 F = 1

fuente de caracter 5x8 dots. 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

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.

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.

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

LCD está conectado a RB0

en el D7 (el 1en D7 hace 00000000 se convierta en 10000000 o sea 80h).

D7 del

RB7 del PORTB) en lugar de 00h el 80h, esto es para asegurar el 1

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

la ram trisb equ 86h trisa equ 85h

equ 85h

;regis de config de puerto a esta en la direcc 85h de

;regis de config de puerto b esta en la direcc 86h de la ram

status

temp5 equ 0ch

equ 03h ;registro de estado esta en la direcc 03h de la ram

inicio

org 00

bsf

clrf trisb ;define el portb como salida clrf trisa ;define el porta como salida

movlw 06h

movwf ADCON1; carga ADCON1 con w = 06h para entradas digitales bcf status,5

status,5 ;se posiciona en banco1

; carga w con literal 06h

;-------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

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-------------

;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

call retardo

return

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

habilita LCD

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

;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

call retardo

return

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

habilita LCD

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

;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.

LCD1

LCD16x2

BOXER 13 33 OSC1/CLKIN RB0/INT 14 34 OSC2/CLKOUT RB1 1 35 X1 MCLR/Vpp/THV RB2 36
BOXER
13
33
OSC1/CLKIN
RB0/INT
14
34
OSC2/CLKOUT
RB1
1
35
X1
MCLR/Vpp/THV
RB2
36
RB3/PGM
2
37
RA0/AN0
RB4
3
38
RA1/AN1
RB5
4
39
R1
20Mhz
RA2/AN2/VREF-
RB6/PGC
5
40
10k
RA3/AN3/VREF+
RB7/PGD
6
C2
C1
RA4/T0CKI
7
15
22p
22p
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
1
VSS
2
VDD
3
VEE
4 5 6
RS
RW
E
D0
D1
D2
10
D3
11 7 8 9
D4
12
D5
13
D6
14
D7

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 visible

 

Área no 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

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

Figura 2. Manejo del LCD con interfaz de 4 bits ;muestra en LCD -MENSAJES en

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

trisb

equ

;ram 86h ;regis de config de puerto b esta en la direcc 86h de la

status equ

;ram 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---------

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

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

significativos dell portb

es para no alterar el contenido de los 4 bit menos

movwf

aux; guarda contenido de w en aux

movlw

0fh; carga 00001111 en w

andwf

portb,1 ; AND entre w=00001111 y portb y guarda resultado en ; portb

;lo que se termino de

;menos significativos dell portb

hacer

es para no alterar el contenido de los 4 bit

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)

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

iorwf

; copiado aux con los NIBLES intercambiados ;(guarda el resultdado en w) portb,1; OR entre w y portb - guarda resultado en portb

;lo que se termino de

;menos significativos dell portb

hacer

es para no alterar el contenido de los 4 bit

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

;Escribe una E en display para indicar larga espera

movlw

call instruc

movlw

call

0CFh;

"E";

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

call instruc

movlw

call

0CFh;

" ";

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

clrf

tempo1

return ;-------------------Fin subrutina espera------------

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

copyright

 

movlw

01h

;

call

instruc; borrar pantalla

movlw escibir el dato

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

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

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";

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

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

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

33 34 35 36 37 38 39 40 15 16 17 VDD 18 23 24
33
34
35
36
37
38
39
40
15
16
17
VDD
18
23
24
25
26
1
VSS
2
VDD
3
VEE
4 5 6
RS
RW
E
D0
D1
D2
10
D3
11 7 8 9
D4
12
D5
13
D6
14
D7

19

20

21

22

27

28

29

30

BOXER

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

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

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).

(E) y RB1 como señal de selección de registro (RS). Figura 4. Las conexiones para el

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.

Figura 5. Las conexiones para el modo de 8 bits en un PIC16F877 Aplicación Realizar

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

Figura 6. Las conexiones para el modo de 8 bits en un PIC16F877 Código processor

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 clrf TRISB clrf TRISD bcf STATUS,RP0

;Selecciona el banco 1 ;Configura PORTB como salida ;Configura PORTD como salida ;Regresa al banco 0

START_LCD:

call INICIA_LCD call M1 call LINEA2 call M2 goto START_LCD

;Configura el LCD ;Muestra Mensaje ;Configura línea 2 ;Muestra Mensaje

;Mensaje a enviar

M1:

 

movlw 'H' movwf PORTB call ENVIA 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

;Mueve 'H' a W ;Mueve lo que hay en W a PORTB ;Imprime en LCD

M2:

 

movlw 'I' movwf PORTB call ENVIA 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

;Mueve 'I' a W ;Mueve lo que hay en W a PORTB ;Imprime en LCD

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 movlw 0x01 movwf PORTB call COMANDO movlw 0x0C movwf PORTB call COMANDO movlw 0x3C movwf PORTB call COMANDO bsf PORTD, 0 return

; RS=0 MODO INSTRUCCION ; El comando 0x01 limpia la pantalla en el LCD

; Se da de alta el comando ; Selecciona la primera línea

; Se da de alta el comando ; Se configura el cursor

; Se da de alta el comando ; RS=1 MODO DATO

;Subrutina para enviar comandos COMANDO:

bsf PORTD,1 call DELAY call DELAY bcf PORTD, 1 call DELAY return

; Pone ENABLE en 1 ; Tiempo de espera

; ENABLE=0

;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 movlw 0xc0 movwf PORTB call COMANDO return

; RS=0 MODO INSTRUCCION ; Selecciona línea 2 en el LCD

; Se da de alta el comando

; Subrutina de retardo DELAY:

movlw 0xFF movwf val2 ciclo:

movlw 0xFF

movwf val1

ciclo2:

decfsz val1,1

goto ciclo2

decfsz val2,1

goto ciclo

return

END