Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
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.
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
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
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.
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?
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.
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.
4
DL – 0 = Interfaz de 4 bits, 1 = Interfaz de 8 bits;
N – 0 = 1 línea, 1 = 2 líneas;
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.
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
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:
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.
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.
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
Donde:
D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 1 1 0 0
Se está diciendo:
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)
RS R/W# D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 0 0 0 1
RS R/W# D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 0 1 ID S
ID = 1 incremento.
ID = 0 decremento.
D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 1 1 0
NOTAR que los unos enviados a D2 y D1 carecen de sentido porque no hay desplazamiento.
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)
8
RS R/W# D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 Posición de memoria a escribir dato
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).
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.
processor 16f877
include <p16f877.inc>
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
;------------otra instruccion-----------
movlw 06h; carga w con literal 06h
;la intrucc asociada dice: dato fijo en pantalla- corresponde a la intruccion
;SELECCIONAR MODO
;------------otra instruccion-----------
;------------otra instruccion-----------
movlw 01h; carga w con literal 01h
;la intrucc asociada dice: BORRAR PANTALLA
;---escritura de datos---------------
call instruc
call escrib
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
;--------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
;----------------------------------------
;----------------------------------------
;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
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
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.
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
Es el caso más utilizado para aprovechar los puertos del PIC. Dejando disponibles pines de los
mismos para otras funciones.
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:
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
processor 16f877
include <p16f877.inc>
15
aux equ 21h
org 00
inicio
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
;--------SUBRUTINAS-------------
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
;------------otra instruccion-----------
movlw 06h; carga w con literal 06h
;la intrucc asociada dice: dato fijo en pantalla- corresponde a la intruccion
;SELECCIONAR MODO
;------------otra instruccion-----------
;------------otra instruccion-----------
movlw 01h; carga w con literal 01h
;la intrucc asociada dice: BORRAR PANTALLA
;--------------------Subrutina INSTRC/ESCRIB-------------------------
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
17
iorwf portb,1; OR entre w y portb - guarda resultado en portb
call retardo
;----------------Subrutina retardo----------------------------------
;Esta subrutina utiliza el registro de proposito general temp5
retardo
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
call espera
call espera
; Termino de llamar reiteradas veces a subrutina espera
return
;-----Fin 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
call instruc
call escrib
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
;---Subrutina mensaje1-----------
mensaje1
movlw 01h
; call instruc; borrar pantalla
call instruc
call escrib
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
;---Subrutina mensaje2-----------
mensaje2
movlw 01h
; call instruc; borrar pantalla
22
call instruc
call escrib
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 SUBRUTINAS-------------
end
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
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.
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:
Diagrama de Conexiones
26
Figura 6. Las conexiones para el modo de 8 bits en un PIC16F877
Código
processor 16F877
include <P16F877.INC>
;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 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