En la entrega anterior de este tutorial aprendimos como enviar mensajes al usuario mediante una pantalla LCD alfanumérica. Hoy construiremos un pequeño modulo que nos permita realizar algunas prácticas, y que seguramente emplearemos más adelante como parte de otros proyectos.En realidad, construir un modulo de expansión para nuestro PIC Trainer es muy sencillo, gracias a la electrónica incluida a bordo de cada módulo LCD, que se encarga de las tareas más complejas.
Nuestro proyecto consiste básicamente en una serie de conectores que permiten al microcontrolador situado en el PIC Trainer enviar los caracteres y comandos a la pantalla. Dado que los LCD tienen (generalmente) la posibilidad de ajustar su contraste o luz de fondo, hemos previsto la electrónica necesaria para poder seleccionar mediante una serie de jumpers alguna de esas funciones. Y por supuesto, hemos dotado a la placa con un preset de 10K para regular el contraste del LCD.
Debido a que el consumo del modulo (sobre todo si hacemos uso de los LEDs de backlite) es algo elevado (unos 200mA) para cargárselo al regulador de voltaje incluido en el PIC Trainer, hemos dotado a la placa del LCD con su propio regulador. Hemos elegido para esta tarea a un “hermano menor” del 7805, el 78L05, que en una capsula mucho más pequeña puede entregarnos 5V perfectamente regulados.
La siguiente imagen nos muestra el esquema eléctrico de nuestra nueva placa de expansión:
Como podemos ver, el circuito es verdaderamente sencillo: una tensión de alimentación de entre 7.5 y 15 voltios se conecta en la bornera de alimentación, pasa a través de un diodo que protege al regulador de voltaje de una conexión errónea de la fuente de alimentación, y mediante el 78L05 y los condensadores asociados es regulada a 5V.
El modulo LCD tiene conectados los cuatro bits más altos de su bus de datos a un conector tipo molex de 10 vías, al que hemos llamado “A”. Los restantes cuatro bits están unidos al conector B. De esta manera, si queremos utilizar un programa que emplea solo cuatro bits para comunicarse con el modulo, usaremos el conector A; y en caso de querer probar un programa que utiliza un bus de datos de 8 bits, utilizaremos ambos conectores.
El tercer molex, llamado “C”, es el conector “de control”. En efecto, las líneas de control del LCD se encuentra agrupadas en este conector, teniendo la posibilidad de seleccionar la función “R/W” mediante un jumper (JP1). Si el jumper se encuentra colocado entre los pines 1 y 2, el control de la línea “R/W” estará en manos del microcontrolador, por lo que el programa deberá poner un “0” en esa línea antes de poder escribir en el. Si el jumper está en la posición 2-3, el LCD estará preparado para que escribamos en el todo el tiempo. No podremos leer su memoria interna (tarea poco frecuente) y utilizaremos un pin menos en el microcontrolador.
El cuarto pin de control corresponde al backlite. Esta es la iluminación trasera del display, que permite utilizarlo en condiciones de iluminación pobre, por ejemplo de noche. Como el consumo del backlite es excesivo para alimentarlo directamente desde un puerto del microcontrolador, hemos utilizado un transistor 2N3906 que se encargue de esa tarea.
El jumper JP2 sirve para seleccionar si el backlite va a estar encendido (jumper en 1-2), bajo el control del PIC (jumper en 2-3) o apagado permanentemente (sin jumper). En caso de seleccionar el control desde el microcontrolador, podremos utilizar pulsos PWM para regular la intensidad luminosa de los LEDs. Esto y el control de velocidad de motores de corriente continua será tema de otro capítulo del tutorial.
Por último, el preset de 10k, que aparece en color azul en las fotos, es el encargado de fijar el nivel de contraste del display, para que su lectura sea lo más cómoda posible.
El armado del modulo de expansión no tiene secretos, es muy similar a otros que hemos realizado en NeoTeo, con la salvedad de que en este caso hemos formado una especie de “sándwich” con la placa de circuito impreso y el LCD, que se monta sobre pines de bronce para permitir que debajo de él se ubiquen el transistor, la resistencia de su base y algunos puentes necesarios.
Para el armado utilizaremos de referencia las fotos incluidas en el artículo, y comenzaremos fabricando el PCB mediante el método explicado anteriormente, para luego soldar todos los componentes, dejando para el final el montaje del LCD.
En caso de que al alimentar el circuito el LCD este “en blanco”, deberemos ajustar el preset. Cuando el cursor del mismo está en la mitad del recorrido, el display debería ser perfectamente legible.
Para realizar las prácticas, deberemos conectar este módulo con el PIC Trainer de 40 pines como se ve en la foto siguiente.
Una vez conectado todo, podemos cargar en el PIC el primero de nuestros ejemplos:
A continuación, un par de ejemplos de cómo se utilizan todas estas instrucciones. El primero se encarga de mostrar un texto parpadeando en la primera línea del display. Intenten deducir como está conectado el LCD al PIC mirando las instrucciones “DEFINE” del principio del programa.
DEFINE LCD_BITS = 8
DEFINE LCD_DREG = PORTD
DEFINE LCD_DBIT = 0
DEFINE LCD_RSREG = PORTB
DEFINE LCD_RSBIT = 1
DEFINE LCD_EREG = PORTB
DEFINE LCD_EBIT = 3
DEFINE LCD_RWREG = PORTB
DEFINE LCD_RWBIT = 2
LCDINIT 0 ‘inicializo el LCD sin cursor.
loop:
LCDOUT “www.NeoTeo.com” ‘Muestra el texto…
WAITMS 1000 ‘Espero un segundo
LCDCMDOUT LcdClear ‘Borro el display
WAITMS 1000 ‘Espero un segundo
GOTO loop ‘Vuelvo a loop: para repetir indefinidamente.
Como podemos deducir a partir de lo visto en el capitulo anterior, el LCD está conectado con el bus de datos (de 8 bits) en el PORTD, el pin PORTB.1 se emplea para el control de la línea RS del LCD, el pin PORTB.3 para la línea E y el control de R/W está a cargo del PIC, mediante el pin PORTB.2.
En el modulo LCD debemos poner el jumper JP1 en la posición 1-2 para permitir al PIC 16F877A el control de la gestión de lecto/escritura del LCD.
El siguiente ejemplo solo difiere del anterior en que se utiliza un bus de control de solo 4 bits de ancho, en la parte baja del PORTD (D.0 a D3) y dejamos la línea R/W siempre en escritura. Para hacer esto, debemos mover JP1 a la posición 2-3. El cable plano que une la parte alta del PORTD (conector 4) con el LCD puede ser removido, ya que no pasaran datos por él. Así quedaría el programa:
DEFINE LCD_BITS = 4
DEFINE LCD_DREG = PORTD
DEFINE LCD_DBIT = 0
DEFINE LCD_RSREG = PORTB
DEFINE LCD_RSBIT = 1
DEFINE LCD_EREG = PORTB
DEFINE LCD_EBIT = 3
LCDINIT 0 ‘inicializo el LCD sin cursor.
loop:
LCDOUT “www.NeoTeo.com” ‘Muestra el texto…
WAITMS 1000 ‘Espero un segundo
LCDCMDOUT LcdClear ‘Borro el display
WAITMS 1000 ‘Espero un segundo
GOTO loop ‘Vuelvo a loop: para repetir indefinidamente.
Si quisiesmos utilizar la parte alta del PORTD como bus de control del LCD, solamente deberíamos cambiar la línea
DEFINE LCD_DBIT = 0
a
DEFINE LCD_DBIT = 4
El resto del programa quedaría igual. Por supuesto, se debe cambiar de lugar el cable plano de datos, y ponerlo entre el conector 5 y el LCD, caso contrario, no veremos nada en el display.
El último ejemplo es una adaptación del ejemplo visto en el capitulo anterior: muestra como imprimir el contenido de una variable (“A”) en el LCD. En el segundo renglón se cuentan los números del 65535 al 0 en el segundo, mientras que se muestra un texto en el primero.
DEFINE LCD_BITS = 8
DEFINE LCD_DREG = PORTD
DEFINE LCD_DBIT = 0
DEFINE LCD_RSREG = PORTB
DEFINE LCD_RSBIT = 1
DEFINE LCD_EREG = PORTB
DEFINE LCD_EBIT = 3
DEFINE LCD_RWREG = PORTB
DEFINE LCD_RWBIT = 2
DIM A AS WORD
A = 65535
LCDINIT 3 ‘Cursor parpadeando
WAITMS 1000
loop:
LCDOUT “¡Estoy contando!” ‘Texto del primer renglón
LCDCMDOUT LcdLine2Home ‘Paso al Segundo renglón
LCDOUT #A ‘Muestro el valor de A
A = A – 1
WAITMS 250
LCDCMDOUT LcdClear ‘Limpio del display
GOTO loop
Dejamos al lector la tarea de deducir como deben configurase los jumpers del modulo LCD y de qué manera se conectan los cables entre el entrenado y el LCD.
Es muy recomendable realizar estas prácticas, por simples que puedan parecer, ya que servirán para tomar confianza con el uso del display, y sobre todo, para poder comenzar a construir nuestros propios programas.