Librería para el manejo de un módulo LCD en CCS C

Ya vimos Conexión y funciones de un módulo LCD y Control de un módulo LCD con PIC y CCS C, partiendo de esa base podemos seguir adelante y ¿por qué no directamente con ejemplos? Bueno, en esta ocasión les traigo una librería lista para operar con módulos LCD con buses de 4 u 8 bits, y conexión al PIC de modo serial o paralelo. Se trata de una librería que bauticé con el nombre, no muy creativo, de lcdgar.c.
Lo bueno que tiene esta librería es que para configurarla sólo hacen falta definir o no algunas macros, de modo que es bastante flexible y puede usarse de muchas maneras.
Aquí les presento el primer ejemplo, y es la forma mas rápida de configurar lcdgar, ya que es predeterminada, sin definir nada la librería se auto-configura.
#include <16f88.h>         // Tipo de PIC y declaraciones
#use delay(internal=8MHz)  // Usar delay con un reloj interno a 8 MHz
#Fuses INTRC_IO            // Oscilador interno
#Fuses PUT                 // Espera unos mS a que se estabilice la
                           // tensión antes de iniciar.
#Fuses BROWNOUT            // Si la tensión cae por debajo de un límite
                           // reinicia el PIC

// Defino la configuración para que LCDGAR establezca comunicación con
// el módulo LCD. Debe definirse toda la configuración antes
// de llamar a lcdgar.c

// Como se usará la configuración predeterminada no se definirá nada,
// y al llamar a  se autoconfigurará. Si deseamos cambiar
// dicha configuración aquí deberán aparecer todos los cambios.

#include <lcdgar.c>

void main(){

   init_LCD();       // Inicio el Módulo LCD

   locate(7,0);      // ubico el cursor en la columna 7 de la primer 
   print("HOLA");    // línea, escribe HOLA

   locate(6,1);      // ubico el cursor en la columna 6 de la segunda 
   print("MUNDO");   // fila y escribo MUNDO.
   
   do{               // Entra en un bucle infinito
   }while(true);
}
Con este código cargado en el PIC se puede controlar un módulo LCD con bus de 8 bits usando todo el puerto B para la comunicación PIC-LCD, el Pin A0 será el encargado de la señal ENABLE y el Pin A1 el encargado de la señal RS.
Si quisieramos, por ejemplo, en lugar del Puerto B, utilizar el Puerto C como bus de datos, deberíamos definir, antes de llamar a la librería mediante la directiva #INCLUDE, el macro Bus_Puerto_C:
#define Bus_Puerto_C
Ahora bien, se puede usar un shift register para controlar el LCD y de esa forma ahorrarnos pines del microcontrolador, en la entrada SHIFT REGISTER ¿que son y como se usan? puedes ver más sobre dichos integrados. En el caso del PIC16F877A y con sólo el display conectado no hace falta ahorrar, pero cuando se trata de una aplicación donde no nos quede muchos pines libres, es algo muy valioso, ya que pasaremos de requerir 10 pines en modo paralelo a sólo 4 en el modo serial y sólo el Pin que corresponde a la señal ENABLE debe ser exclusivo para el manejo del módulo, de modo que los demás pines podrán ser compartidos, inclusive los pines del shift register se podrían usar para, por ejemplo, controlar un teclado.
Para utilizar la líbreria en modo serial solo hace falta definir el macro "LCD_Serial" del siguiente modo:
#define LCD_Serial
Si queremos usar el bus de datos de 4 bits debemos definir, tambien antes de llamar a la librería, el macro "LCD_4Bits", mediante:
#define LCD_4Bits
Cabe destacar que cuando se utiliza el Bus de 4 bits, conexión paralela y está definido un puerto como bus, el dato se envía completo al puerto usado, pero el display LCD sólo reconoce los 4 MSB o sea <4:7>. Si no se desea escribir en todo el puerto cada vez que se utiliza el display, puede definir los 4 pines que serán los bits del bus al LCD del siguiente modo:
#define Bit0 Pin_X 
#define Bit1 Pin_X 
#define Bit2 Pin_X 
#define Bit3 Pin_X
Aquí puedes bajarte la última versión de la librería actualizada al día 6/11/2010 versión 1.03. Ahora disponible desde Dropbox

16 comentarios:

  1. Excelente blog, hermano. Gracias...

    ResponderEliminar
  2. Anónimo28/4/10

    Hola, muy util esta libreria, aunque ¿ como se puede enviar un dato de una variable?

    ResponderEliminar
  3. Me imagino que deseas mostrar un determinado numero, para eso utiliza printn(numero, cifras, ceros_izquierda)

    Aunque esta función es bastante pesada.

    saludos.

    edito: Modifiqué la librería y cambie la función printn(), ahora la sintaxis es:

    printn(numero,cifras);

    numero es un signed int16
    y cifras es la cantidad de ceros a la izquierda.

    saludos.

    ResponderEliminar
  4. Muchas pero muchas gracias por este aporte

    Saludos cordiales.

    ResponderEliminar
  5. Anónimo27/2/12

    hola a todos,tengo un controlador DMX que usa un modulo lcd con la matricula TC802C-01(R) se uilumina la pantalla pero no se ven ni los numeros ni letras como lo puedo checar

    ResponderEliminar
  6. Buenas, tendrás que quitar el módulo del controlador y luego conectarlo como está indicado en esta entrada http://picrobot.blogspot.com/2008/11/display-lcd-cmo-se-controlan.html, graba el archivo .HEX en el PIC y listo.

    Saludos.

    ResponderEliminar
  7. Anónimo19/9/12

    Hola a todos!
    estoy aprendiendo a programar pics con CCS, y estoy intentando introducir una señal analogica, almacenarla en una variable y que ese valor se muestre en la pantalla LCD...
    Se puede hacer con esta libreria? como sería?
    Muchas gracias...

    ResponderEliminar
  8. Debes hacerlo con el ADC del microntrontrolador, que es uno o varios pines del PIC que tienen la capacidad de "leer" el voltaje presente, y el microcontrolador lo "traduce" en una variable int o int16, según el caso.

    Saludos.

    ResponderEliminar
  9. Hola, es posible con esta libreria escribir carateres grandes (cada caracter ocupa las 2 lineas del display) muchas gracias.

    ResponderEliminar
  10. Si, es posible ya que la gestión de los caracteres la realiza el microcontrolador del propio display.

    Saludos.

    ResponderEliminar
  11. Anónimo13/2/13

    Buenas, amigo excelente tu blog, me podrias ayudar en como generar un PWM en ccs para sacarlo por cualquier puerto sin tener que usar los CCP...

    ResponderEliminar
  12. Anónimo17/3/13

    Hola, felicidades por tu trabajo es muy bueno.
    Tengo una duda, si quisiera cambiar el pin de Enable y el de RS del pin A0 y A1 respectivamente, por otros en el puerto C.. Primeramente eso es posible? y si es así cómo lo defino?

    De antemano muchas gracias por su tiempo.

    ResponderEliminar
  13. Hola, gracias.

    Para cambiar los pines Enable y RS solo debes incluir las líneas antes de llamar a la librería:

    #define LCD_E Pin_C0
    #define LCD_RS Pin_C1

    Eso en el caso de que quieras usar el Pin C0 y el C1 para Enable y RS, respectivamente.

    Saludos.

    ResponderEliminar
  14. Anónimo24/5/13

    hola, quiero usar tu libreria para un sensor de temperatura con el F887, tengo todo el programa hecho pero cuando quiero mostrar en el lcd el valor me dice cualquier simbolo, me das alguna idea de como hacer? la variable del adc es de 10bits graicas!

    ResponderEliminar
  15. Anónimo29/5/13

    Hola que tal, tengo una duda que no puedo resolver, para mostrar una variable hago lo siguiente:
    signed int16 f = 12;

    printf(print,"",f);



    que estoy haciendo mal?

    ResponderEliminar
  16. hola y si tengo un pic 18f2550 que es lo que tengo que hacer

    ResponderEliminar


Tal vez le interese: