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:
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.
MUY BUENO TODO, EL TEMA ES QUE EN MI CASO LO SIMULO EN PROTEUS Y NO ME MUESTRA NADA, POR QUE PUEDE SER?? ES PARA CUALQUIER LCD??
ResponderSuprimirLo acabo de comprobar y el ejemplo funciona, lo único que encontré es que el diagrama está explicado con un PIC16F84A y el ejemplo en CCS C está escrito para un PIC16F876A.
ResponderSuprimirDebes cambiar la primera línea donde dice:
#include <16f876a.h>
por:
#include <16f84a.h>
o reemplazarla por el PIC que utilices.
Saludos.
simon lo programe en assambly para un pic16f877 y funciona al 100, valiosa informacion, primera ves que trabajo con lcd, saludos!!!!!
ResponderSuprimirHOLA AMIGO, LE COMENTO QUE CUANDO LE VOY CAMBIAR DONDE DICE #include <16f876a.h> por:
ResponderSuprimir#include <16f84a.h> ME DA ERROR A LA COMPILACION,
O SINO ME PODRIAS REGALAR EL ESQUEMATICO PARA PODERLO GRABAR CON EL PIC 16F876A.
GRACIAS JOSE LUIS
DESDE BOGOTA COLOMBIA
Hola, aparte de esa línea, prueba cambiando las líneas:
ResponderSuprimir#define E Pin_C0
#define RS Pin_C1
por
#define E Pin_A0
#define RS Pin_A1
El problema se debe a que el ejempo está escrito para el PIC16F876A y el esquema está hecho para el PIC16F84A y este último no tiene implementado el Puerto C.
De todos modos también corrijo lo errores del ejemplo. Gracias por colaborar.
Saludos.
HOLA TE COMENTO, YA EL PROGRAMA NO GENERA ERROR, PERO AL SIMULARLO, NO ME APARACE NADA EN EL LCD.
ResponderSuprimirJOSE LUIS
HOLA AMIGO, COMO SE PUEDE HACER QUE EL MENSAJE SE DESPLACE DE DERECHA A IZQUIERDA, IZQUIERDA A DERECHA.
ResponderSuprimirJOSE LUIS
En la entrada http://picrobot.blogspot.com/2008/11/display-lcd-cmo-se-controlan.html está explicado el comando CURSOR OR DIPLAY SHIFT.
ResponderSuprimirDebes implementarlo con el bit D3 en 1 (Mover display) y el bit D2 a 0 para mover el display a la derecha o en 1 para moverlo a la izquierda.
Supongo que has solucionado el problema por el cual no aparecía nada en pantalla...
Saludos.
hola amigo, le entendi su mensaje, pero en que parte del programa va esa funcion de mover el mesnaje, de izquierda a derecha viceversa, y lo del mensaje ya lo solucione, era que no habia colocado la resistencia de 1k a positivo, por eso no me aparecia.
ResponderSuprimiry como se hace para colocar mas caracteres, por que tu en tu programa solo admite 8 caracteres.
jose luis
Envíame un mail a picblog@hotmail.com y te aclararé las dudas por ese medio. Para no cargar de mensajes el post.
ResponderSuprimirSaludos.
hola por favor me interesa saber si si "print" y "enviar" son funciones predefinidas porque normalmente solemos utilizar el "printf" y de "enviar" no se ni de donde sale.
ResponderSuprimirUN SALUDO
No, ENVIAR se encarga de gestionar los comandos o datos a "enviar" al display. PRINT "envía" una serie de ENVIAR al display, son funciones creadas.
ResponderSuprimirENVIAR "envia" un caracter; PRINT("HOLA");, es como hacer:
Enviar("H", 1);
Enviar("O", 1);
Enviar("L", 1);
Enviar("A", 1);
printf envía datos preformateados a una salida que en este caso podría ser print, es una "función" del lenguaje.
Para usar printf aquí deberías usar:
printf(print,"texto formateado",...);
con la sintaxis de printf, en la ayuda de CCS C encontrarás todo lo necesario para continuar.
saludos.
Una pregunta, que software utilizas para programar ya que programe en MICKROC pero hay algunas instrucciones que no encuentro como int8, una pregunta más que modelo de LCD utiliza ya que yo probe con un LCD SC162A3 y pues no puedo hacer ke despliege caracteres
ResponderSuprimirTe contesté en la otra entrada, donde haz hecho la misma pregunta.
ResponderSuprimirSaludos.