Partiendo de saber la Conexión y funciones de un módulo LCD ahora veremos como se utiliza en la práctica. Para empezar aquí les dejo el diagrama de la conexión mas básica para poder comenzar a utilizar el display.
En el diagrama utilizamos el Pin 0 del puerto A para la señal Enable del display y el Pin 1 del mismo puerto para la señal RS.
R/W lo conectamos directamente a GND ya que en este proyecto no leeremos el estado del display en ningún momento.
El puerto B lo dedicaremos enteramente al bus de datos del LCD.
Todos los puertos que no utilizaremos, asi como el RESET del PIC, los conectamos a 5V por medio de un resistor.
Alimentamos todo a 5V por medio de una fuente que puede llegar a ser la Fuente de alimentación y cargador de baterías explicada en este blog y listo.
Pero falta algo, el programa o firmware que hace que el display haga algo... Para eso debemos crear el código, compilarlo y grabarlo en el PIC para que este lo ejecute, nosotros usaremos CCS C .
La rutina que hace esto sería esta:
#include <16f84a.h>
#use delay (clock=4000000)
#define E Pin_A0
#define RS Pin_A1
/* Declaro las funciones antes de utilizarlas en main()
para que sean reconocidas */
void print(int c);
void Enviar(int8 Dato, int1 Comando);
void Iniciar_LCD(void);
//Comienzo del programa
void main(void){
Iniciar_LCD(); // Inicio el Modulo
print ("PICROBOT"); // Escribo PICROBOT en la pantalla
}
//Funciones
void print(int8 c){
enviar (c,1); // Envio caracter c con RS a 1 (dato)
// CCS C se encarga de enviar uno a uno
} // los caracteres contenidos en c
void Enviar(int8 Dato, int1 Comando){
output_low(E); // E en bajo
output_b(Dato); // Cargo el puerto B con Dato
output_bit(RS,comando); // Pongo RS en 0 o 1 dependiendo si es
// un comando o dato lo que estoy
// enviando
output_high(E); // E en alto
delay_us(1); // Espero a estabilizar tensión
output_low(E); // E en bajo
delay_us(40); // Espero 40 uS a que el LCD trabaje
//
if (Dato < 4) delay_us(1600); // Si envio un Home o un Clear display
// espero otros 1600 uSegundos que
// sumado a los 40 uS anteriores hacen
} // 1.64 mS que es lo que tardan estas
// operaciones
void Iniciar_LCD(void){ //
delay_ms(15); // Espero a que se estabilice
// la tensión.
enviar(0b00000001,0); // Envio un CLEAR DISPLAY
// (Borra la pantalla)
delay_ms(5); // Espero 5 mS
enviar(0b00111000,0); // Envio un FUNCTION SET para bus de 8
// bits, 2 lineas y caracteres de 5x7
// pixeles.
enviar(0b00001100,0); // Envio un DISPLAY ON/OFF CONTROL
// con pantalla encendida, Cursor
// apagado y si parpadear.
enviar(0b00000110,0); // Envio un ENTRY MODE SET con
// Incrementa cursor y desplaza cursor
}
Este programa introducido en el PIC conectado al circuito anterior hace que nuestro módulo muestre en pantalla la frase:
PICROBOT
En realidad lo único que hace es inicializar el LCD y mostrar el mensaje, se puede adaptar y hacer que muestre cualquier frase cambiando simplemente la palabra PICROBOT por lo que deseen en la línea:
print ("PICROBOT");
Hay que aclarar que para que funcione hay que respetar las comillas.
Pero si arman el circuito y graban el PIC con la rutina, verán que pueden modificar la frase, pero siempre aparecerá en la primer línea. Si volvemos a Conexión y funciones de un módulo LCD y consultamos dichas funciones, veremos que hay una que se llama SET DD RAM ADDRESS; La memoria DD RAM es la que contiene los caracteres que están en pantalla. De modo que esa función se llama Establecer la dirección de la DD RAM, o sea, que lo que hace es cambiar la posición donde se almacenará el próximo caracter, por lo tanto, lugar donde aparecerá en pantalla.
Para hacer que escriba donde queramos, antes de escribir, deberemos ejecutar un SET DD RAM ADDRESS. Continuando con nuestra rutina lo podemos hacer del siguiente modo:
void locate(x,y){
int d=128; // Cargo d con 128 (10000000) b7 a 1
d+=y*64; // si y (linea) es 1 sumo 64 a d (11000000) b6 a 1
d+=x; // a todo esto le sumo la posicion de x
enviar (d,0); // envio todo al display con RS a 0 (comando)
}
Entonces si, por ejemplo, queremos escribir Hola en la primer línea y Mundo en la segunda, el main() de nuestra rutina se vería así:
void main(void){
Iniciar_LCD(); // Inicio el Módulo
locate(6,0); // Ubico el cursor en la columna 6
// de la primer línea
print ("HOLA"); // Escribo HOLA
locate(5,1); // Ubico el cursor en la columna 5
// de la segunda línea
print ("MUNDO"); // y escribo MUNDO
}
En un display de 16 caracteres x 2 líneas se verá centrada la frase HOLA MUNDO. Cabe destacar que antes de poder utilizar la función locate() se debe declarar mediante la sentencia:
void locate(x,y);
Luego podemos simplificar el borrado de la pantalla (CLEAR DISPLAY) con la función:
void cls(void){
enviar (1,0); // envio 00000001 (Clear display)
} // con RS a 0 (comando)
Recuerden que CLEAR DISPLAY era 00000001 que es igual a 1 en decimal. De esta forma y previamente declarado cada vez que querramos borrar la pantalla introduciremos en el código la línea cls(); Por último en la entrada Librería para el manejo de un módulo LCD en CCS C encontrarás todas las funciones y la opción para descargarla.