3 Puertos de Inp - Out V3
3 Puertos de Inp - Out V3
3 Puertos de Inp - Out V3
Entrada/Salida
2. Registro TRISA (85H). Cada bit de este registro configura la direccin en que fluye la
informacin de la patita correspondiente del puerto A, as, para k=0,1,...,5:
Bit k de TRISA = 1 configura la patita RAk del puerto A como Entrada
Bit k de TRISA = 0 configura la patita RAk del puerto A como Salida
Todas las patitas del puerto A poseen diodos de proteccin conectados a Vdd (contra altos
voltajes de entrada) y a Vss (contra voltajes negativos) adems, manejan niveles de entrada tipo
TTL y como salidas se comportan como drivers tipo CMOS. Excepto la patita RA4, la cual
como entrada posee un Disparador Schmitt trigger y como salida es de Drenaje abierto, adems
RA4 slo posee un diodo de proteccin conectado a Vss.
3. El Registro ADCON1 (9FH). Las patitas RA0, RA1, RA2, RA3 y RA5 estn
multiplexadas con las entradas analgicas AN0,...,AN4, respectivamente; de manera que
antes de utilizarlas debemos configurar si sern usadas como entradas analgicas o como
entradas/salidas digitales. Para seleccionar la segunda opcin (entradas/salidas digitales) se
debe colocar en el nible menos significativa de este registro un 01102 (es decir, un 06h).
2
U-0
---
R/W-0
---
U-0
---
R/W-0
PCFG3
R/W-0
PCFG2
R/W-0
PCFG1
R/W-0
PCFG0
Bit 0
bit 3-0: PCFG3:PCFG0: bits de configuracin de los canales de entrada del convertidor A/D.
Se utilizan para configurar las patillas como E/S digital o como entrada analgica.
En las siguientes dos figuras se muestra el detalle de implementacin interna de las patitas del
puerto A, mostrando la diferencia entre las patitas RA4 y las dems patitas del puerto A:
Patita RA4
1. Estado de lectura y escritura de las lneas RA0, RA1, RA2, RA3 y RA5
El esquema para estas patitas muestra el estado de escritura extrado del data sheet del Microchip. Por
ejemplo, se toma la lnea RA0 para analizar el funcionamiento del estado de salida cuando la misma
funciona como entrada o como salida:
a. Funcionamiento como Entrada
Para configurar la lnea RA0 como entrada, se debe poner a 1 el bit 0 del registro TRISA:
bsf
TRISA, 0
Esta instruccin determina una conmutacin a 1 del estado lgico del Flip Flop del latch D
indicado en el circuito con el nombre TRIS latch. Para otra lnea de I/O existe uno de estos Flip
Flop y el estado lgico en que se mantiene depende estrictamente del estado lgico del bit relativo
al registro TRIS (en otras palabras, el mejor diseo de todos los bits del registro TRIS es
fsicamente realizable con un latch TRIS).
La salida Q del latch TRIS es conectada a la entrada de una compuerta lgica de tipo OR, esto
significa que independientemente del valor presente en la otra entrada, la salida de la compuerta
OR siempre estar en uno si una de sus entradas estn en uno. En esta condicin, el transistor P no
conduce manteniendo la lnea RA0 desconectada del positivo de la alimentacin.
Del mismo modo la salida negativa Q del latch TRIS es conectada a la entrada de una compuerta
AND, en donde, la salida de sta estar siempre en 0 mientras una de sus entradas valga 0. En esta
condicin el transistor N no conduce manteniendo la lnea RA0 desconectada de la masa. El
estado lgico de la lnea RA0 depender exclusivamente del circuito externo al cual estar
conectado. Aplicando 0 o 5 volts al pin RA0, ser posible leer el estado presente del circuito
externo en la entrada del bloque representado por TTL input buffer y el latch de entrada.
b. Funcionamiento como Salida
Para configurar la lnea RA0 como salida, se debe colocar 0 en el bit 0 del registro TRISA con la
instruccin:
bcf
TRISA, 0
Esta instruccin determina la conmutacin a cero de la salida Q del latch TRIS (a 1 si la salida Q
es negativa). En este estado el valor de la salida de las compuertas OR y AND dependen
exclusivamente del estado de salida del Q negado del latch de datos. Como para el latch TRIS, el
latch de datos depende del estado de un bit de un registro, particularmente del registro PORTA. Su
salida negativa ser enviada a la entrada de las dos compuertas lgicas OR y AND que est
directamente sobre la base del transistor P y N. Si ponemos en 0 el bit 0 del registro PORTA con
la instruccin:
bcf
PORTA, 0
Se obtendr la conduccin del transistor N y por tanto ir a 0 la lnea RA0. Si se coloca en 1 el bit
0 con la instruccin:
4
bsf
PORTA, 0
Se obtendr la conduccin del transistor P y por tanto ir a +5 volts la lnea RA0. Con esta
condicin ser siempre posible revisar el valor enviado sobre la lnea a travs del circuito de
entrada.
2. Estado de Salida de la lnea RA4
Se analizar el funcionamiento del estado de salida de la lnea RA4 que es diferente de las otras lneas
de I/O, en cuanto a la distribucin del pin en el PIC16C84 con el TOCKI, lo cual se analizar luego.
Se describe el esquema de bloques del estado de salida extrado del data sheet. La lgica de
conmutacin es substancialmente idntica al grupo de lneas RA0 a RA3 con ausencia de la compuerta
OR y del transistor P, o de todos los circuitos que permiten una conexin a positivo de la lnea RA4.
Esto significa en trminos prcticos que cuando una lnea RA4 est programada para salida, podr
asumir un nivel que depender del circuito externo, pues en realidad no est conectada al positivo y
s desconectada. Este tipo de circuito de salida se llama de colector abierto y es til para aplicaciones
en que es necesario compartir una misma ligacin con ms pines de salida, porque se tiene la necesidad
de colocar en alta impedancia una lnea de salida y pudiendo as reprogramarla como lnea de entrada.
Si se quiere asegurar que la lnea RA4 sea 1 se debe conectar externamente un resistor de PULL-UP, ya
sea un resistor conectado al positivo de alimentacin.
3.2. El Puerto B (PORTB)
3.2.1. Registros asociados al Puerto B
El puerto B es un puerto digital de 8 bits, todas sus patitas son bidireccionales y trabaja en forma
similar al puerto A. Tiene tres registros asociados: el registro de datos PORTB, el registro de
direccin de los datos TRISB y el registro OPTION_REG.
1. Registro PORTB (06H, 106H). Los ocho bits que contiene reflejan directamente el estado de
las ocho patitas del puerto B: RB0,...,RB7.
2. Registro TRISB (86H, 186H).- En forma similar a TRISA, al poner un 0 en un bit de TRISB
se configura la patita RB correspondiente como salida y al poner un 1 en un bit de TRISB se
configura la patita RB correspondiente como entrada.
3. Registro OPTION_REG (81H, 181H). El bit 7 de este registro, denominado RBPU es usado
para conectar/desconectar una resistencia pull-up conectada a cada patita RB. Poniendo un 0
en este bit todas las resistencias se conectan. Para desconectar las resistencias pull-up se
debe poner este bit en 1, tambin se desconectan automticamente cuando la patita
correspondiente es configurada como salida. Un Reset desconecta todas las resistencias.
REGISTRO OPTION u OPTION_REG (Direccin 81h, 181h)
A continuacin se indica el registro OPTION_REG, que puede ser ledo o escrito y que contiene varios
bits de control para configurar la asignacin del preescaler al TMR0 o al WDT, la interrupcin externa,
el TMR0 y las resistencias de pull-up del PORTB.
5
R/W-1
#RBPU
Bit 7
Bit 7:
R/W-1
INTED
R/W-1
T0CS
R/W-1
T0SE
R/W-1
PSA
R/W-1
PS2
R/W-1
PS1
R/W-1
PS0
Bit 0
Patitas RB4,...,RB7. Estas cuatro patitas del puerto B tienen la capacidad de generar una solicitud
de interrupcin a la CPU cuando estn configuradas como entradas. El estado de estas patitas es
comparado con el ltimo estado que tenan durante la ltima lectura a PORTB, guardado en un
latch. Los bits que indican que hay una diferencia entre estos valores por cada patita estn
conectados a una puerta OR cuya salida activa el bit RBIF del registro INTCON solicitando
con esto una interrupcin. Esta interrupcin es especialmente til para despertar al dispositivo de
su estado de SLEEP cuando alguna de las cuatro lineas es activada, por ejemplo, en respuesta a la
presin de una tecla.
Esta caracterstica de solicitud de interrupcin cuando se detecta un cambio junto con las
resistencias pull-up configurables para estas cuatro patitas, las hacen ideales para el manejo de
teclados en dispositivos porttiles que requieren dormirse durante largos ratos para economizar
bateras y despertarse cuando una tecla es presionada.
En las siguientes figuras se muestra el alambrado interno de las patitas del puerto B:
Patitas RB0,...RB3
Patitas RB4,...,RB7
Cada entrada del puerto C posee un buffer con disparador trigger. Adems, cuando se selecciona la
funcin I2C, las patitas PORTC<4,3> pueden ser configuradas con niveles I2C o con niveles SMBus
mediante el bit CKE del registro SSPSTAT<6>, como se muestra en las figuras siguientes.
En las siguientes figuras se muestra el alambrado interno de las patitas del puerto B.
3.3.2. Perifricos que estn multiplexados con las lneas del puerto C
En la siguiente tabla se resumen las lneas del puerto C y las de los perifricos que estn
multiplexados con ellas.
Nombre
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
Funcin multiplexada
Salida oscilatoria del Timer1/reloj de entrada del Timer 1
Entrada oscilatoria del Timer1/entrada de captura2 o salida de
comparacin2 o salida PWM2
Entrada de captura1 o salida de comparacin1 o salida PWM1
Reloj para los modos de comunicacin serie sncrona SPI e I2C
Dato de entrada (en modo SPI)/ Dato de entrada-salida (modo I2C)
Dato de salida (en modo SPI)
Lnea de transmisin asncrona de la USART/reloj sncrono
Lnea de recepcin asncrona de la USART/dato sncrono
En este programa el rebote generado por los switches no es problema, porque funciona correctamente
haya o no haya rebote.
1. Diagrama de Flujo:
INICIO
RA0=1
NO
SI
RA50
NO
RA1=1
SI
RA51
2. Cdigo en Assembler:
;* Este programa Enciende un LED conectado a RA5 cuando se presiona un botn
;* conectado a RA1 y lo apaga cuando se presiona un botn conectado a RA0
;*****************************************************************************
include "p16f877.inc"
org 0x0000
10
end
11
2. Cdigo en Assembler:
;* Subrutina de pausa que dura 20 milisegundos (usando memoria de datos)
;* (Supone un reloj de 100 Khz)
;**************************************************************************
;Define constantes
N
EQU 0xA5
cont
EQU 0x20
; inicia subrutina
pau20ms MOVLW N
rep
esc
MOVWF cont
DECFSZ cont,1
GOTO rep
RETURN
;(1)
;(1)
;(1 si no escapa, 2 si escapa)
;(2)
;(2)
reloj de 100 Khz supuesta (Tcy = 40 seg), es cuando el ciclo se ejecute 256 veces, es decir con
un valor N=256, lo cual en el programa se logra con el valor inicial N=0:
Tsub = (3N+5) Tcy
Tsub = (3 x 256 + 5) x 40 x 10-6seg
Tsub = 30.92 mseg
As, si la frecuencia del reloj es mayor, por ejemplo, en el modo de oscilador interno se
tienen 4 Mhz, que da un Tcy=1seg, esta subrutina no podr proporcionar nunca los 20 mseg,
por lo que habr que realizar una pausa ms larga anidando dos ciclos.
II. Subrutina de pausa con dos ciclos anidados
La pausa pau20ms es demasiado corta, de manera que para frecuencias altas de reloj no puede
alcanzar ni siquiera los 20 mseg. A continuacin se muestra una pausa que puede dar tiempos mucho
ms largos usando ciclos anidados. A continuacin se va realizar una subrutina d20ms de 20 mseg
con un reloj de 4 Mhz:
1. Diagrama de Flujo:
d20ms
WN
cont1W
WM
cont2W
cont2cont2-1
NO
Z=1
SI
cont1cont1-1
NO
Z=1
SI
FIN
14
2. Cdigo en Assembler:
;* Subrutina de pausa para frecuencias medias
;* (Adecuada para un reloj de 4 Mhz)
;**************************************************************************
;Define constantes para 20 milisegundos
N
EQU 0x1A
M
EQU 0x0
cont1 EQU 0x20
cont2 EQU 0x21
;inicia subrutina
d20ms MOVLW N
MOVWF cont1
rep1 MOVLW M
MOVWF cont2
rep2 DECFSZ cont2,1
GOTO rep2
DECFSZ cont1,1
GOTO rep1
esc
RETURN
1. Diagrama de Flujo:
d1seg
Wp
cont3W
d20ms
cont3cont3-1
NO
Z=1
SI
FIN
2. Cdigo en Assembler:
;* Subrutina de pausa de 1 segundo
;**********************************************************************
EQU 0x05
p
cont3 EQU 0x22
d1seg MOVLW p
MOVWF cont3
ciclo CALL d20ms
DECFSZ cont3,1
GOTO ciclo
RETURN
3.7. Ejemplo 2
En este ejemplo se usa slo el botn conectado a la patita RA0 para controlar el encendido y
apagado del LED en la patita RA1, y se incluye el limpiado del rebote con un reloj de 4Mhz.
Hardware necesario. En la siguiente figura se muestra la conexin del botn y el LED necesarios
para probar el programa.
1. Diagrama de Flujo:
Diagrama de flujo del Programa Principal:
17
;checa si RA0=1
;si RA=0 checa de nuevo
;si RA0=1 espera 20 miliseg. A que pase el rebote
;checa nuevamente si RA0=1
;si RA1=0 falsa alarma, vuelve a checar
;si RA0=1 seal vlida; carga mscara en W
;conmuta estado del LED
;repite
3.8. Ejemplo 3
Luces secuenciales. En este ejemplo se realiza el encendido secuencial de 8 LEDs conectados a
RB0,...,RB7, es decir, se enciende RB0 durante un segundo, luego RB1 y as sucesivamente hasta
18
llegar a RB7 para recomenzar despus con RB0. (en un segundo dado slo un LED est prendido).
Hardware necesario. Slo se requieren los ocho LEDs conectados a las patitas RBP0,...,RBP7,
como se muestra en la siguiente figura.
1. Diagrama de Flujo:
Diagrama de flujo del Programa Principal:
19
INICIO
N0x00
M0x00
p0x05
C0
PORTB0
RB01
d1seg
C=0
SI
NO
RB01
C0
Los diagramas de flujo de la Subrutinas d1seg y d20ms se realiza en el subtema Limpiado del
rebote.
2. Cdigo en Assembler:
;* Este programa Enciende en secuencia (uno a la vez) 8 LEDs conectados
;* a las patitas del puerto B
;**********************************************************************
;
Include "p16f877.inc"
;Define constantes Para 197 milisegundos
N
EQU 0x0
M
EQU 0x0
cont1 EQU 0x20
cont2 EQU 0x21
; Define constantes para pausa de 1 segundo
p
EQU 0x05
cont3 EQU 0x22
20
org 0x0000
3.9. Ejemplo 4
Conexin de un teclado matricial
Una de las funciones ms comunes de un microcontrolador es la aceptacin de datos numricos o
alfanumricos suministrados por un operador mediante un teclado.
La mayora de los teclados estn organizados en forma matricial como un conjunto de switches en
las intersecciones de varios renglones y columnas conductoras como se muestra en la siguiente
figura que ejemplifica un teclado de tipo telefnico.
21
En la figura tambin se ilustra una conexin tpica con tres lneas de entrada del puerto B que
controlan las columnas y cuatro lneas de salida del mismo puerto que recogen la informacin de
los renglones.
Observacin. Es recomendable colocar un diodo de proteccin en cada lnea de salida del
puerto para evitar que al activar ms de una columna a la vez se produzca un corto circuito.
Procedimiento de deteccin de teclas y codificacin. Para la deteccin y asignacin de
cdigo segn la tecla presionada se procede como sigue:
1. Deteccin. Se ponen en bajo todos los filas (cuidando que haya diodos de proteccin) y se
leen las columnas.
2. Si hay alguna columna activa se limpia el rebote, si es tecla vlida se pasa al paso 3, si
no es tecla vlida se asigna un cdigo de ninguna tecla presionada.
3. Codificacin. El puerto activa una fila a la vez colocando un cero lgico en la lnea
correspondiente a la fila a activar.
4. Por cada fila activa se lee la informacin de columnas y dependiendo de la fila y la
columna activada (en bajo) se asigna el cdigo a la tecla de la interseccin.
1. Diagrama de Flujo:
Diagrama de flujo del Programa Principal:
22
INICIO
N0x1A
M0x00
initB
W0xFF
masqW
detect
masqW-masq
NO
Z=1
SI
codif
PORTCW
23
PORTB0
NO
NO
RB7=1
RB7=1
SI
RB6=1
SI
NO
RB6=1
SI
RB5=1
SI
NO
RB5=1
SI
RB4=1
NO
NO
SI
NO
RB4=1
SI
NO
SI
W0x00
d20ms
W0x00
W0xFF
FIN
FIN
FIN
24
25
CLRF STATUS
CLRF PORTC
BSF STATUS,RP0
MOVLW 0x00
MOVWF TRISC
BCF STATUS,RP0
;Programa principal
CALL initB
repite MOVLW 0xFF
MOVWF masq
CALL detec
SUBWF masq,1
BTFSS STATUS,Z
GOTO repite
CALL codif
MOVWF PORTC
GOTO repite
;Selecciona Banco 0
;Inicializa latches de datos de PORTC
;Selecciona Banco 1
;configura puerto C como salidas
;
;regresa al Banco 0
;Selecciona Banco 0
;Inicializa latches de datos de PORTB
;Selecciona Banco 1
;configura RB7,...,RB4 como entradas
;y RB3,RB2,RB1 como salidas
;Conecta todas las resistencias Pull-Up
;regresa al Banco 0
;Esta subrutina realiza la Deteccin de tecla presionada: regresa W=0 si no hay tecla
;presionada y W=0xFF si hay alguna tecla presionada
;*********************************************************************
detec CLRF PORTB
BTFSS PORTB,7
GOTO rebo
BTFSS PORTB,6
GOTO rebo
BTFSS PORTB,5
GOTO rebo
BTFSS PORTB,4
GOTO rebo
RETLW 0x0
rebo
;pausa de 20 milisegundos
;lee rengln 1,2,3
;tecla presionada, retorna con
;lee rengln 4,5,6
;tecla presionada, retorna con
;lee rengln 7,8,9
;tecla presionada, retorna con
;lee rengln *,0,#
;tecla presionada, retorna con
;falsa alarma retorna con w=0
CALL d20ms
BTFSS PORTB,7
RETLW 0xFF
BTFSS PORTB,6
RETLW 0xFF
BTFSS PORTB,5
RETLW 0xFF
BTFSS PORTB,4
RETLW 0xFF
RETLW 0x0
w=0xFF
w=0xFF
w=0xFF
w=0xFF
26
;*********************************************************************
; Se hace un barrido por columnas
codif ; Primera columna
MOVLW 0xF7
;Activa la primera columna
MOVWF PORTB
;y activa la columna 1,4,7,*
BTFSS PORTB,7
;Es la tecla 1?
RETLW '1'
;retorna cdigo del 1
BTFSS PORTB,6
;Es la tecla 4?
RETLW '4'
;retorna cdigo del 4
BTFSS PORTB,5
;Es la tecla 7?
RETLW '7'
;retorna cdigo del 7
BTFSS PORTB,4
;Es la tecla *?
RETLW '*'
;Retorna cdigo del *
; Segunda columna
MOVLW 0xFB
MOVWF PORTB
BTFSS PORTB,7
RETLW '2'
BTFSS PORTB,6
RETLW '5'
BTFSS PORTB,5
RETLW '8'
BTFSS PORTB,4
RETLW '0'
; Tercera columna
MOVLW 0xFD
MOVWF PORTB
BTFSS PORTB,7
RETLW '3'
BTFSS PORTB,6
RETLW '6'
BTFSS PORTB,5
RETLW '9'
BTFSS PORTB,4
RETLW '#'
RETLW 0x00
end
3.10. Ejemplo 5
Manejo de un Display de 7 segmentos
Un display de siete segmentos es un arreglo de 7 LEDs conectados como se muestra en la siguiente
figura:
Para este ejemplo se supone un display de nodo comn conectado al puerto C como se muestra a
continuacin:
Dato
0
1
2
3
4
5
6
7
8
9
0
1
0
0
1
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
c
0
0
1
0
0
0
0
0
0
0
d
0
1
0
0
1
0
0
1
0
0
e
0
1
0
1
1
1
0
1
0
1
f
0
1
1
1
0
0
0
1
0
0
g
1
1
0
0
0
0
0
1
0
0
Cdigo
01
4F
12
06
4C
24
20
0F
00
04
28
A
b
C
d
E
F
0
1
0
1
0
0
0
1
1
0
1
1
0
0
1
0
1
1
1
0
0
0
0
1
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
0
0
0
08
60
31
42
30
38
1. Diagrama de Flujo:
Diagrama de flujo del Programa Principal:
INICIO
N0x1A
M0x00
PORTB0x01
cont0
RC7=1
NO
SI
d20ms
RC7=1
NO
SI
contcont+1
codigo
POTCW
RC7=0
NO
SI
29
2. Cdigo en Assembler:
;* Este programa despliega un dgito hexadecimal en un display de nodo
;* comn conectado al puerto C. El dgito se incrementa en 1 cada vez que
;* se presiona un botn conectado al MSB del mismo puerto C
;************************************************************************
Include "p16f877.inc"
;Define constantes para 20 milisegundos
N
EQU 0x1A
M
EQU 0x00
cont1 EQU 0x20
cont2 EQU 0x21
cont
equ 0x22
inic
BSF STATUS,RP0
MOVLW 0x80
MOVWF TRISC
BCF STATUS,RP0
;banco 1
;Todos los bits del puerto C como salidas
;y el MSB como entrada
;regresa al Banco 0
MOVLW 0x01
30
MOVWF PORTC
CLRF cont
tecla BTFSS PORTC,7
GOTO tecla
CALL d20ms
BTFSS PORTC,7
GOTO tecla
INCF cont,1
CALL codigo
MOVWF PORTC
Suelta BTFSC PORTC,7
GOTO suelta
GOTO tecla
0x0F
cont,0
PCL,1
0x01
0x4F
0x12
0x06
0x4C
0x24
0x20
0x0F
0x00
0x04
0x08
0x60
0x31
0x42
0x30
0x38
;carga mscara
;enmascara el contador y lo deja en W
;Salta W instrucciones adelante
;cdigo del 0
;cdigo del 1
;cdigo del 2
;cdigo del 3
;cdigo del 4
;cdigo del 5
;cdigo del 6
;cdigo del 7
;cdigo del 8
;cdigo del 9
;cdigo de la A
;cdigo de la b
;cdigo de la C
;cdigo de la d
;cdigo de la E
;cdigo de la F
end
Observacin: Una manera ms cmoda de escribir la lista de instrucciones RETLW al final del
programa anterior puede lograrse usando la directiva DT (Define Table) del ensamblador, la cual
nos permite definir una tabla de datos que ser sustituida por una lista de instrucciones RETLW; as,
31
3.11. Ejemplo 6
Gestin de un LCD
Se realizar la interface del PIC16F877 con un LCD (Liquid Crystal Display) compuesto por dos lneas
de 16 caracteres cada una. Los LCD ms comunes, disponen de una interface ideada por Hitachi y
adoptada como estndar por otros fabricantes. Esta interface hace que el LCD pueda ser conectado al
micro a travs de un bus de 4 u 8 lneas ms tres lneas de control y las de alimentacin.
En la tabla siguiente estn descriptas las funciones de cada lnea disponible del LCD. Las descripciones
en negrita, indican las lneas efectivamente utilizadas en la aplicacin que se realizar.
Pin
Nombre
GND
Funcin
Ground. Conectar al negativo de alimentacin
VDD
LCD
Liquid Crystal Driving Voltage. En este pin debe ser aplicada una tensin variable entre 0 y 5V para
regular el contraste
RS
Register Select. Este pin es una lnea de control con la que se le indica al display si se est enviando en el
bus de datos un comando (RS=0) o un dato (RS=1)
R/W
Read, Write. Esta es otra lnea de control con la que se indica al display si se est enviando un dato (R/W=0) o
leyendo un dato del display (R/W=1)
Enable. Esta lnea de control sirve para habilitar el display para que reciba un dato o instrucciones a
travs del bus (E=1)
DB0
Data Bus Line 0 - Sobre estas lneas viajan los datos entre el micro y el display
DB1
DB2
10
DB3
11
DB4
12
DB5
13
DB6
14
DB7
Para reducir al mximo las conexiones entre el micro y el LCD, se usar la modalidad de interconexin
de datos a 4 bit, usando slo las lneas DB4, DB5, DB6, DB7. Las lneas DB0, DB1, DB2 y DB3 no
sern usadas y sern conectadas a masa.
Tampoco la lnea R/W ser utilizada por lo que ser puesta a masa. De este modo, quedar
seleccionado el modo escritura. En la prctica, slo se podr enviar datos al LCD pero no recibirlos.
I. La lnea 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 travs del bus
de datos (lneas DB4 a DB7). Para hacer esto, son utilizadas dos lneas de control con las que se
comunica al LCD la operacin de transferencia que realizar el bus.
32
Las dos lneas de control son Register Select (pin 4) y Enable (pin 6) del LCD, las cuales se describen
a continuacin:
Con la lnea 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 travs de los comandos, el PIC puede indicar al
LCD el tipo de operacin a realizar, como por ejemplo "limpiar pantalla". Con los datos, el PIC
puede enviar directamente los caracteres ASCII a ser visualizados.
La lnea 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 seal Enable.
33
1. Diagrama de Flujo:
Diagrama de flujo del Programa Principal:
Los diagramas de flujo de las subrutinas de este programa no se presentan, pero a continuacin se
describen brevemente las Subrutinas de gestin del LCD.
34
Subrutina
Funcin
LcdInit
Se ocupa de inicializar el display y de limpiar la pantalla. Debe ser llamada una sola vez y antes de cualquier otra
subrutina.
No requiere paso de parmetros.
LcdClear
LcdLocate
Necesita el valor de fila y columna para posicionar el cursor en el registro W. Los bits desde D0 a D3 contienen
el valor de columna (eje Y) y los bits desde D4 a D7 los valores de filas (eje X). La numeracin de las filas parte
de cero hacia arriba, la de columna parte de cero hacia la derecha.
Enva el carcter ASCII al LCD a ser visualizado en la posicin donde se encuentra el cursor.
LcdSendData
LcdSendByte
2. Cdigo en Assembler:
El cdigo de este ejemplo se muestra a continuacin:
;**************************************************
;
; LCD.ASM
;
;**************************************************
PROCESSOR 16F877
RADIX
DEC
INCLUDE
"P16F877.INC"
__CONFIG
;Register Select
;Enable
ORG
20H
tmpLcdRegister res
msDelayCounter res
Start
bsf
2
2
STATUS,RP0
movlw 00000011B
35
movwf TRISB
bcf
STATUS,RP0
;LCD inizialization
call LcdInit
;Locate LCD cursor on row 0, col 0
movlw 10H
call LcdLocate
;Shows "HELLO WORLD" string on LCD
movlw 'H'
call LcdSendData
movlw 'E'
call LcdSendData
movlw 'L'
call LcdSendData
movlw 'L'
call LcdSendData
movlw 'O'
call LcdSendData
movlw ' '
call LcdSendData
movlw 'W'
call LcdSendData
movlw 'O'
call LcdSendData
movlw 'R'
call LcdSendData
movlw 'L'
call LcdSendData
movlw 'D'
call LcdSendData
movlw ' '
call LcdSendData
movlw '!'
call LcdSendData
foreverLoop
goto foreverLoop
;**********************************************************************
; Delay subroutine
; W = Requested delay time in ms (clock = 4MHz)
;**********************************************************************
msDelay
movwf msDelayCounter+1
clrf msDelayCounter+0
; 1 ms (about) internal loop
msDelayLoop
nop
decfsz msDelayCounter+0,F
goto msDelayLoop
nop
decfsz msDelayCounter+1,F
goto msDelayLoop
36
return
;**********************************************************************
; Init LCD
; This subroutine must be called before each other lcd subroutine
;**********************************************************************
LcdInit
movlw 30
call msDelay
;Wait 30 ms
;****************
; Reset sequence
;****************
bcf
PORTB,LCD_DB4
PORTB,LCD_DB5
PORTB,LCD_DB6
PORTB,LCD_DB7
37
;Wait 2 ms
38
LcdSendData
bsf PORTB,LCD_RS
call LcdSendByte
return
;**********************************************************************
; Send a command to LCD
;**********************************************************************
LcdSendCommand
bcf PORTB,LCD_RS
call LcdSendByte
return
;**********************************************************************
; Send a byte to LCD by 4 bit data bus
;**********************************************************************
LcdSendByte
;Save value to send
movwf tmpLcdRegister
;Send highter four bits
bcf PORTB,LCD_DB4
bcf PORTB,LCD_DB5
bcf PORTB,LCD_DB6
bcf PORTB,LCD_DB7
btfsc
bsf
btfsc
bsf
btfsc
bsf
btfsc
bsf
tmpLcdRegister,4
PORTB,LCD_DB4
tmpLcdRegister,5
PORTB,LCD_DB5
tmpLcdRegister,6
PORTB,LCD_DB6
tmpLcdRegister,7
PORTB,LCD_DB7
tmpLcdRegister,0
PORTB,LCD_DB4
tmpLcdRegister,1
PORTB,LCD_DB5
tmpLcdRegister,2
PORTB,LCD_DB6
tmpLcdRegister,3
PORTB,LCD_DB7
bsf
PORTB,LCD_E
;Enables LCD
39
movlw 1
;Wait 1ms
call msDelay
bcf PORTB,LCD_E ;Disabled LCD
movlw 1
;Wait 1ms
call msDelay
return
END
bus
;LCD
;LCD
;LCD
;LCD
data
data
data
data
line
line
line
line
DB4
DB5
DB6
DB7
Estas constantes definen la asociacin entre las lneas del PIC (todas conectadas al PortB) y las lneas
del LCD. Cada definicin en particular, ser usada en las subrutinas de gestin del LCD en lugar de
cada nmero de identificacin de las lneas de I/O.
tmpLcdRegister res 2
msDelayCounter res 2
Seguidamente, se reserva el espacio para dos registros: tmpLcdRegister, usado por la subrutina de
gestin del LCD y msDelayCounter usada por la subrutina msDelay que generan los retardos por
sofware de 1 ms para el contenido del registro W. Estas subrutinas son usadas siempre por las
subrutinas de gestin para generar las temporizaciones requeridas durante la transmisin de datos y
comandos.
Sigue la definicin de las lneas de conexin entre el PIC y el LCD y luego se arriba a la primera
subrutina que interesa:
call
LcdInit
LcdInit es una subrutina que debe ser llamada solamente una vez en el inicio del programa y antes de
cualquier otra subrutina de gestin. Ella se ocupa de efectuar todas las operaciones necesarias para
inicializar correctamente el LCD y permite que las funciones sucesivas operen correctamente.
Con las instrucciones:
movlw
call
00H
LcdLocate
40
se posiciona el cursor del display en la primera fila y en la primera columna de la pantalla. Los
caracteres enviados sucesivamente, sern visualizados a partir de esta posicin. Los cuatro bits ms
significativos del valor cargado en el registro W con la instruccin:
movlw
00H
Contienen el nmero de fila donde se quiere posicionar el cursor, los cuatro bits menos significativos,
contienen el nmero de columna.
Cambiando el valor en el registro W, se obtiene posicionamientos diferentes. Con el valor 10H, por
ejemplo, se obtiene:
HELLO WORD!_
Con el valor 12H, se obtiene:
HELLO WORD!_
A esta altura, para visualizar cada carcter de la frase, se usan las siguientes instrucciones:
movlw
call
'H'
LcdSendData
Y as sucesivamente para cada letra a ser visualizada. El incremento de la posicin del cursor, se hace
automticamente.
Mayor informacin sobre el uso de los LCDs, puede obtenerse de la hoja de datos que el fabricante
debe proveer.
41