# Ubicar librería 16x2 LCD en MPLABX XC8



## nimio (Mar 23, 2013)

Hola,

siguiendo con mi aprendizaje ahora estoy inmerso en el control de un LCD 16x2.

Uso el compilador XC8 y el pic 16F84A.

Como librería uso la que viene con el compilador llamada xlcd.h que aunque parece que esté enfocada para los 18F he visto que la gente la usa.

Lo que me mosquea es q vienen declaradas las funciones pero no su contenido, ok encontré la publicación de una librería que un usuario había hecho en base a xlcd.h añadiendo lo que falta.

Poco a poco he ido adaptándola, la cuestión:

Quiero saber donde ubicar exactamente la librería lcd.h (xlcd.h renombrada). 

La he puesto en la carpeta de mi proyecto y desde MPLABX la he añadido a Header Files luego he copiado en una carpeta los archivos .c asociados a la librería y los he añadido también a mi proyecto para luego añadirlos a Source Files desde el MPLABX.

Es así?? Donde hay que ubicar estos archivos realmente???

En cualquier caso parece que al compilar mi archivo principal encuentra como error este #include <xlcd.h> en uno de los archivos .c (busyxlcd.c), lo cambio por #include "lcd.h" pero sigue dándome el siguiente error:

LCD/busyxlcd.c:2: error: can't open include file "lcd.h": No such file or directory


Me vuelve loco!!! por favor ayudadme, porque me da error si le digo que use comillas para que busque en la carpeta del proyecto??? 

Por cada cosa que corrijo me salen más errores.

Esto de las librerías de LCD parece bastante complicado y como hay tantas maneras de hacer lo mismo... no me aclaro con la info que encuentro. Que les costaba a los de Microchip proporcionar una librería 100% operativa???

Agradecería toda la ayuda posible.

Gracias

1 Saludo


----------



## ByAxel (Mar 23, 2013)

Hola.
Ahí no hay magia. No es necesario agregar el archivo al proyecto, solo necesitas llamarlo con #include <>. Ahora la librería LCD que quieres solo funciona para los P18.

Si quieres ver los archivos, busca xlcd.h donde están declarados las funciones pero las mismas funciones están por separado en varios archivos *.c...; me refiero a que una función esta en un archivo y así el resto.

Esta librería es buena Librería genérica en C – Control LCD. Esta si es necesario agregar al proyecto.

Saludos.


----------



## nimio (Mar 23, 2013)

Hola ByAxel,

gracias por la respuesta. Soy consciente de que no es necesario pero ya que lo iba a modificar preferí agregarlo al proyecto haciendo #include "" preservando el original, lo mismo hice con los archivos *.c los cuales vi que, efectivamente, contenían las funciones.

Entonces si entiendo bien... con agregar al proyecto las librerías y archivos *.c necesarios es suficiente no? sin necesidad de una ubicación concreta o de añadirlos desde el MPLABX??

Te haré caso y trabajaré en función de la librería que me recomiendas. La conocía pero como he visitado tantas páginas... ya no se cual usar.

Muchas gracias. Investigo.

Saludos


----------



## nimio (Mar 24, 2013)

Hola, estoy adaptando la librería, pero hay cosas que me desconciertan:

En LCDGeneric.h, en la zona de selección de compilador... no se como incluír mi compilador XC8, es decir... modifico en base a la sección MPLAB C18... C30... C COMPILER CCS... o HI-TECH C???

Creo que el compilador Hi-Tech usa código más similar a XC8 pero no se si es mejor modificar esa sección de código... o añadir la opción XC8 o que? y en cualquier caso... como sería?? Por ejemplo para HI-TECH pone #if defined(HI_TECH_C), para XC8 como lo defino???

Sigo investigando.

Saludos.


----------



## ByAxel (Mar 26, 2013)

Hola.
Sugiero que agregues otro *#if defined* con *(__XC8)* y pongas las configuraciones necesarias como pines y delays.
La libreria funciona bien, ya lo he probado en esquemas reales.
Saludos.


----------



## nimio (Mar 26, 2013)

Muchas gracias ByAxel, justamente es lo que he hecho pero poniendo __XC (no __XC8), la verdad que voy dando palos de ciego mirando ejemplos por la red sin saber muy bien el porqué de según que cosas.

Ahora mi problema es que no se como manipular el LCD, es decir... compila bien pero no se ni como ni cuando usar __delay_1Cycle(); __delay_1us(); __delay_100us(); __delay_2ms(); si es que los tengo que usar. He leído algo de respetar los tiempos de inicialización del LCD, de escritura... etc pero no se si la librería lo hace a nivel interno o tengo que marcarle yo los tiempos.

Lo mismo me pasa con:


```
vInitLCD();   // INICIALIZA LCD
vWriteLCD(1,1); // (DATO, TIPO)--> TIPO: 1=DATO, 0=BYTE DE CONTROL
vGotoxyLCD(1,1);    // POSICIÓN DE INICIO PARA ESCRIBIR
vLCD_Putc("Hola Mundo");
vPuts_LCD("Hola Mundo2");
```

He comentado estas instrucciones pero agradecería saber si hacen lo que comento porque todo es suposición. Que diferencias hay entre las instrucciones de Putc y Puts? He visto q a veces ponen \n o \f o parecido en el texto a visualizar pero ni idea. 

Como sería un ejemplo con esta librería y la sintaxis de las instrucciones? (inicializar LCD, vWriteLCD... coordenadas... temporizaciones... cuando usar vLCD_Putc o vPuts_LCD).
No se que poner en los parentesis, creo que sólo tengo claro que poner en vGotoxyLCD();.

Una vez más gracias por la atención y paciencia.

1 Saludo.


----------



## ByAxel (Mar 27, 2013)

Hola.
1. Los delay son para uso interno, debes de acondicionar las macros (*#define __delay_1Cycle()*) de delay a la sintaxis del XC8, revisa el archivo PDF de ayuda del compilador.

2. En la web de la libreria indica los puntos que se pueden modificar ya sea cantidad de lineas, los pines, etc.

3. Para Iniciar el LCD se usa vInitLCD(); , ésta función espera unos (15ms) para luego configurar el LCD. El resto no es necesario ya que deja el cursor del LCD al inicio.

4. La diferencia de vLCD_Putc y vPuts_LCD es que la primera es para escribir un carácter en el LCD, si escribes una cadena de texto es posible que el compilador te genera avisos. La segunda es para escribir cadenas de texto ya sean de variables o constantes, si revisas la función verás que la variable de entrada es un puntero. Es posible que el compilador genera avisos cuando uses variables como string o array, para eso utiliza vPuts_LCD((char*)&buffer); donde buffer es la variable.

5. Los \n y \f son los denominados secuencias de escape para trabajar con string que para esta librería están limitados a solo 3, siendo \f para limpiar el LCD, \n para ir a la segunda linea del LCD y \0 que es nulo en string.

Saludos.


----------



## nimio (Mar 27, 2013)

Tengo la librería modificada pero sigue sin ir aunque no me da error de compilación, me salen carácteres extraños de manera aleatoria cada vez en la línea superior. Aún tengo que mirar lo de los delays porque también he modificado la frecuencia a 4MHz y en la librería es 20MHz así que supongo que los delays hay que adecuarlos a esa frecuencia no? si así fuera como sería?. Otra cosa que veo es que si comento la línea #define LcdType 2 me da error y técnicamente no la necesito porque mi LCD es 16x2.

Voy a mirar el tema delays como dices a ver si se me escapa algo.

Gracias nuevamente.

Saludos.


----------



## nimio (Mar 27, 2013)

Hola una vez más,

Antes trataba de usar un LCD de un PICDEM 2 PLUS del 2006 controlándolo externamente desde una protoboard, pero viendo que no logro hacer funcionar el LCD correctamente he cortado por lo sano y he usado un módulo LCD que tenía por ahí.

Ahora porfín he podido escribir Hola Mundo, pero ha sido por eliminar un bucle infinito que tenía al final del código.

Uso un potenciómetro de 50K para el contraste ya que no encontré ningún otro de menor valor.

Cada vez que doy alimentación tengo que darle toquecitos a los cables de datos del LCD para que muestre el mensaje el display, intuyo que harán mal contacto pero si no toco los cables cuando va ok y quito y vuelvo a dar alimentación... tengo que volver a darles toquecitos (como si necesitara impulsos electricos cada vez), lo dejo como dato por si suscita algún comentario.

Sólo me queda agradecer la atención prestada.

Saludos!


----------



## el ingeniero (Sep 8, 2015)

he buscado tanto y por fin encontré un código para lcd en xC8 pero es para el P18
En mi caso utilicé un 18F4455 y jaló de maravilla. aquí les dejo el código para un hola mundo:

Saludos.


----------



## Franciscano (Ene 12, 2016)

Yo en mi caso el tema de las librerias lo arregle, como tenía la versión 1.35, pues me baje la versión anterior 1.34 y de la carpeta /include/plib , las copie a include de la 1.35. Pues no habia forma de que me pillara la dichosa libreria xlcd.h  Ya todo va bien.

Un saludo.


----------

