Vous êtes sur la page 1sur 8

E.P.S.

de Ingeniera de Gijn
rea de Tecnologa Electrnica

Ejemplos con microcontroladores PIC


Universidad de Oviedo

Interface con Pantallas de Cristal Lquido (LCD) de Caracteres


Representacin del tiempo para un cronmetro digital
Se trata de realizar el diseo del programa encargado de realizar el
interface con una pantalla de cristal lquido del tipo matriz de puntos
que dispone de un driver HD44780 o compatible para implementar un
cronmetro digital que dispone de pulsadores de MARCHA y PARADA. En
caso de que ambos pulsadores se encuentren activados, debe prevalecer el
pulsador de MARCHA sobre el de PARADA. Si estando el cronmetro
parado, se acta por segunda vez sobre el pulsador de PARADA, se
resetear la cuenta de tiempo (se pondr a cero).
El crono representar en la primera lnea de la pantalla del LCD
Horas:Minutos:Segundos.Dcimas de Segundo y ser posible completar
hasta 24 horas de cuenta. Si se llegaran a completar las 24 horas, el crono
se reseteara y se parara. En la segunda lnea del LCD aparecer el estado
del cronmetro, con uno de los siguientes mensajes: Crono contando o Crono
Parado segn proceda. El diseo se basa en el empleo de un
microcontrolador PIC16F877 con un oscilador de 4MHz. El interface se
realizar con las 4 lneas ms altas de datos del LCD: DB7, DB6, DB5 y DB4
y las 3 lneas de control E, RS y R/W, segn se muestra en la figura.
Se facilitan tambin los ficheros que incluyen los subprogramas para
interface con el LCD.

1 de 8

Fernando Nuo Garca

E.P.S. de Ingeniera de Gijn


rea de Tecnologa Electrnica

Ejemplos con microcontroladores PIC


Universidad de Oviedo

Las CONEXIONES de entradas y salidas al microcontrolador para la


placa de entrenamiento PICDEM2 plus son las siguientes:
Datos LCD
Control LCD
Pulsadores
Puertos DB7 DB6 DB5 DB4 E
RS
R/W MARCHA PARADA
PORTA:
RA1 RA3 RA2
RA4
PORTB:
RB0
PORTD: RD3 RD2 RD1 RD0
A continuacin en las pginas siguientes, se adjunta un posible algoritmo
para el programa correspondiente a la solucin propuesta.

2 de 8

Fernando Nuo Garca

E.P.S. de Ingeniera de Gijn


rea de Tecnologa Electrnica

Ejemplos con microcontroladores PIC


Universidad de Oviedo

Un posible planteamiento
El programa principal consiste en un bucle donde se exploran
permanentemente el estado de los pulsadores de MARCHA y de PARADA, si
alguno de ellos est activado
Se utiliza TMR1 y el mdulo CCP1 en modo comparacin con evento especial
de disparo para realizar temporizaciones de 0,1 s mediante la sucesiva
generacin de interrupciones. Con cada interrupcin se modifican las
posiciones que almacenan Dcimas, Segundos, Minutos y Horas en BCD y se
envan al LCD como caracteres a representar. Al LCD slo se envan los
caracteres cuando se necesita cambiar la representacin y se envan todos,
aunque tambin podra ser posible situar el puntero de direcciones de la
DDRAM del LCD y enviar slo los que cambian.
DECIMAS
0
SEGUNDOS Decenas de Segundo
MINUTOS Decenas de Minuto
HORAS
Decenas de Hora

Dcimas de Segundo
Unidades de Segundo
Unidades de Minuto
Unidades de Hora

El temporizador TMR1 se configurar en modo temporizador con un


prescaler de 8 y ser reseteado por el mdulo CCP1 cuando alcance el valor
de 16 bits que se haya cargado entre los registros CCPR1H y CCPR1L
Los registros del mdulo CCP1 deben cargarse por tanto con un valor tal que
0,1 s = 4/4MHz * 8 * CCPR1H_CCPR1L
de donde CCPR1 = 12500 (0x30D4), luego CCPR1H = 0x30 y CCPR1L = 0xD4
Para el envo de caracteres y comandos al LCD se utilizan los subprogramas
presentes en el fichero s2_lcd4b_p2p.asm ya que en este caso el interface
se realiza con 4 bits y se emplean las 4 lneas ms bajas del puerto D. El
fichero necesario que contiene los subprogramas se incluye en el cdigo
fuente total mediante la correspondiente directiva include.

3 de 8

Fernando Nuo Garca

E.P.S. de Ingeniera de Gijn


rea de Tecnologa Electrnica

Ejemplos con microcontroladores PIC


Universidad de Oviedo

Se distinguen tres estados posibles en el funcionamiento del sistema, con


las transiciones que se indican con el estado de los pulsadores
Pulsado RA4

CONTANDO

PARADO y
a CERO
Pulsado RA4

Nueva Pulsacin en RB0

PARADO y
mostrando T
actual

Nueva Pulsacin en RB0

Algoritmo utilizado:
INICIALIZACIN

Puertos: PORTD de entrada en sus 4 lneas altas e inicialmente de


salida en sus 4 lneas ms bajas para enviar datos y comandos al
LCD, aunque ser de entrada en algunos intervalos para leer
estado del LCD (flag BF por ejemplo)
PORTA ser de salida en 3 de sus bits (RA1, RA2 y RA3) para
manejar las lneas de control del LCD (RS,R/W y E), son salidas
permanentemente. Resto de lneas del PORTA de entrada
Definimos todas entradas como digitales en el PORTA. Aunque
RA1, RA2 y RA3 vayan a ser lneas de salida, se van a utilizar
instrucciones del tipo BSF y BCF sobre ellas. Estas instrucciones
leen primero todo el puerto y vuelven a sacar valores: modifican
el bit al que afecta la instruccin y el resto de los bits vuelven a
salir con el valor que se ha ledo. Si estn activas las entradas
como analgicas, stas sern ledas siempre como ceros (vase
esquema del PORTA) y saldrn siempre como tales ceros en los
bits del PORTA no afectados por la instruccin
Resto de los Puertos como entradas
Reseteamos por software el LCD por si la alimentacin no cumple
con los valores requeridos para asegurar el reset inicial.

4 de 8

Fernando Nuo Garca

E.P.S. de Ingeniera de Gijn


rea de Tecnologa Electrnica

Ejemplos con microcontroladores PIC


Universidad de Oviedo

Inicializamos el LCD: datos de 4 bits, las 2 lneas del LCD activas,


display activo, sin cursor, limpiamos DDRAM e incremento en
escritura y lectura del LCD
CCP1 en modo comparacin con evento especial de disparo
Carga de CCPR1H con 0x30 y CCPR1L con 0xD4
TMR1: modo temporizador, prescaler de 8 y parado al principio
Puesta a cero de TMR1H y TMR1L
INTERRUPCIONES: habilitamos las del mdulo CCP1
Variables del algoritmo a cero: DECIMAS, SEGUNDOS,
MINUTOS Y HORAS
Activamos interrupciones globales y de perifricos (GIE y PEIE)
Llamamos al subprograma encargado de enviar los caracteres
ASCII de lo que queremos sacar en el LCD (SACATIEMPO) al
principio
Llamamos a un subprograma (MENSAJE) que enva a la lnea 2 del
LCD un mensaje que mostrara Crono Parado, que es el estado
inicial.
Registramos en ANTES_B el estado previo del PORTB con el
pulsador libre
BUCLE PRINCIPAL
Llamamos a subprograma que realiza una espera de 50ms para
evitar muestreos demasiado prximos en los pulsadores que haran
que los rebotes fueran considerados como nuevas pulsaciones
(ESPERA_50ms)
Exploramos el estado de RA4 (pulsador de marcha):
Si est pulsado, RA4==0 entonces
Se pone en marcha TMR1
Se marca ANTES_B a 1 (como libre)
Volvemos al principio del bucle sin mirar el otro pulsador (es
prioritario el de marcha)
Exploramos el estado de RB0 (pulsador de parada):
Si est pulsado, RB0== 0 entonces
Se comprueba cmo estaba antes el pulsador (ANTES_B)
Si antes no estaba pulsado (ANTES_B.0==1) entonces
Si el crono estaba parado (TMR1ON==0)
entonces
Reseteamos tiempo total (HORAS, MINUTOS,)
Mostramos el tiempo (SACATIEMPO)
Se saca el mensaje de la segunda lnea (Crono Parado)
Se para el temporizador TMR1: TMR1ON=0

5 de 8

Fernando Nuo Garca

E.P.S. de Ingeniera de Gijn


rea de Tecnologa Electrnica

Ejemplos con microcontroladores PIC


Universidad de Oviedo

Guardamos el valor actual del PORTB en ANTES_B para la


prxima deteccin de cambio en la pulsacin de RB0
Volvemos al principio del bucle principal

PROGRAMA DE TRATAMIENTO DE LA INTERRUPCIN DE CCP1

Se comprueba que el flag CCP1IF est a 1


Salvaguarda del contexto (W y STATUS, PCLATH no es
necesario)
Incremento de DECIMAS
Si hemos llegado a 10, ponemos a 0 DECIMAS e incrementamos
SEGUNDOS
si no, vamos directamente a la salida del programa de tratamiento
Se incrementa SEGUNDOS en una unidad
Se extraen los 4 bits ms bajos (unidades)
Si unidades=0x0A entonces sumamos 6 a SEGUNDOS (para hacer
el ajuste a BCD)
si no, vamos directamente a la salida del programa de tratamiento
Se extraen los 4 bits ms altos de SEGUNDOS (decenas de
segundo)
Si hemos llegado a 6 entonces se pone a cero SEGUNDOS y se
incrementan los minutos (MINUTOS)
si no, vamos directamente a la salida del programa de tratamiento
Se extraen los 4 bits ms bajos de MINUTOS (unidades de
minuto)
Si unidades=0x0A entonces se suma 6 a MINUTOS (para hacer el
ajuste a BCD)
si no, vamos directamente a la salida del programa de tratamiento
Se extraen los 4 bits ms altos de MINUTOS (decenas de minuto)
Si se ha llegado a 6 entonces ponemos a cero MINUTOS y se
incrementan las horas (HORAS)
si no, vamos directamente a la salida del programa de tratamiento
Se extraen los 4 bits ms bajos de HORAS (unidades de hora)
Si unidades=0x0A entonces se suma 6 a HORAS (para hacer el
ajuste a BCD)
Salida del programa de tratamiento:
Se comparan las HORAS con 24 si las hemos alcanzado:
Ponemos HORAS a cero, paramos TMR1 y mostramos en
la segunda lnea el mensaje: Crono parado
si no las hemos alcanzado:

6 de 8

Fernando Nuo Garca

E.P.S. de Ingeniera de Gijn


rea de Tecnologa Electrnica

Ejemplos con microcontroladores PIC


Universidad de Oviedo

Mostramos en la segunda lnea el mensaje: Crono


contando
Llamamos al Subprograma que saca el tiempo total para
actualizar el LCD
Se pone el flag de CCP1 a cero (CCP1IF=0)
Recuperacin del contexto
Retorno de interrupcin

SUBPROGRAMA SACATIEMPO
Se encarga de tomar los valores almacenados en DECIMAS, SEGUNDOS,
MINUTOS Y HORAS y enviarlos al LCD en formato ASCII, se intercalan
tambin caracteres de separacin : (dos puntos) entre horas y minutos y
entre minutos y horas y . (punto) entre segundos y dcimas

Se coloca el cursor en casa (esquina superior izquierda)


Enviamos 3 espacios en blanco para centrar en pantalla
Extraemos decenas de horas, le aadimos el ASCII del cero y lo
enviamos al LCD con el subprograma LCDPUTCHAR
Lo mismo con las unidades de horas
Enviamos el ASCII de :
Envo del ASCII de las decenas de minutos
Envo del ASCII de las unidades de minutos
Enviamos el ASCII de :
Envo del ASCII de las decenas de segundos
Envo del ASCII de las unidades de segundos
Enviamos el ASCII de .
Envo del ASCII de las dcimas de segundo
Retorno de subprograma

SUBPROGRAMA ESPERA_50ms

Se precarga TMR0 con d60 para que desborde al cabo de 50ms


con un prescaler de 256: 50 ms = 1s * 256 * (256 60)
Se pone a cero el flag de TMR0: T0IF
Espera a que T0IF ==1
Retorno de subprograma

7 de 8

Fernando Nuo Garca

E.P.S. de Ingeniera de Gijn


rea de Tecnologa Electrnica

Ejemplos con microcontroladores PIC


Universidad de Oviedo

SUBPROGRAMA MENSAJE
Sita el contador de direcciones de la DDRAM del LCD al principio de la
segunda lnea y va enviando al LCD los caracteres almacenados en una de las
dos tablas alternativas almacenadas en la memoria de programa. El final de
las tiras de caracteres guardadas en las tablas se identifican mediante el
carcter especial _.
En funcin del valor almacenado en la posicin TIRA se recogen los
caracteres de la tabla que indica Crono parado (si TIRA==0) bien de la
que dice: Crono contando (si TIRA==1).
Para recoger los caracteres se incrementa un puntero, que se carga en W
antes de hacer la llamada a la tabla. Volvemos de la tabla trayendo en W l
correspondiente carcter.
Para almacenar la tira de caracteres se emplea la directiva DT que va
situando sucesivas instrucciones RETLW con el cdigo ASCII de cada uno.

8 de 8

Fernando Nuo Garca

Vous aimerez peut-être aussi