Hola japifer, no necesariamente debes utilizar una librería; pues el manejo del LCD a 8 o 4 bit es simple, puedes crear una funcion que haga lo que necesitas.
Prueba con este ejemplo, modo de configuración a 4 y 8 bit
saludos
#include <16F873A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
#byte porta=5 //Definicion de variables del pic
#byte portb=6
#byte adcon1=0x1f
#define puerto_lcd portb
#define rs1 porta,0 //Definicion de bits
#define e1 porta,1
#define rs2 porta,2
#define e2 porta,3
int i; //Variable de 8 bit
byte const tabla1[17]={"Prueba LCD 8 bit"}; //Tabla que contiene la palabra
byte const tabla2[17]={"Prueba LCD 4 bit"}; //para el LCD
byte const caracter1[8]={ 0b10000,
0b10100,
0b10010,
0b11111,
0b00010,
0b00100,
0b00000,
0b00000,};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void display_8b(short valor, int respaldo) //Rutina que envia al LCD una palabra de control o dirección
{
if(valor == 0)
{bit_clear(rs1);}
else
{bit_set(rs1);}
puerto_lcd = respaldo;
bit_set(e1);
delay_cycles(10);
bit_clear(e1);
delay_ms(1);
}
///////////////////////////////////////////////////////////////////////////////
void display_4b(short valor , int respaldo) //Rutina que envia al LCD una palabra de control o dirección
{
int respaldo2;
if(valor == 0)
{bit_clear(rs2);}
else
{bit_set(rs2);}
puerto_lcd &= 0x0f;
respaldo2 = respaldo & 0xf0 ;
puerto_lcd |= respaldo2;
bit_set(e2);
delay_cycles(10);
bit_clear(e2);
puerto_lcd &= 0x0f;
respaldo2 = swap(respaldo) & 0xf0 ;
puerto_lcd |= respaldo2;
bit_set(e2);
delay_cycles(10);
bit_clear(e2);
delay_ms(1);
}
///////////////////////////////////////////////////////////////////////////////
void mensa_1_4b()
{
display_4b(0 , 0x80); //Dirección donde se escribirá el mensaje
for(i=0;i<sizeof(tabla2)-1;i++) //Ciclo que envía la palabra "prueba LCD"
{
display_4b(1 , tabla2[i]);
}
display_4b(0 , 0xc8); //Dirección donde se escribirá el mensaje
display_4b(1 , 0);
}
///////////////////////////////////////////////////////////////////////////////
void mensa_1_8b()
{
display_8b(0 , 0x80); //Dirección donde se escribirá el mensaje
for(i=0;i<sizeof(tabla1)-1;i++) //Ciclo que envía la palabra "prueba LCD"
{
display_8b(1 , tabla1[i] );
}
display_8b(0 , 0xc8); //Dirección donde se escribirá el mensaje
display_8b(1 , 0);
}
///////////////////////////////////////////////////////////////////////////////
void ini_lcd_8b()
{
display_8b(0 , 0b00111000); //Codigo para display a 8 bits
display_8b(0 , 0b00001100); //Codigo que activa el display
display_8b(0 , 0b00000110); //Codigo que define el cursor para
//Que se desplace hacia la derecha
//display_8b(0 , 0b00000111)//Codigo que define el cursor para
//que desplace hacia la izquierda
display_8b(0 , 1); //Limpia el display
delay_ms(2);
}
///////////////////////////////////////////////////////////////////////////////
void ini_lcd_4b() //modo de configuracion para 4 bit
{
int i;
delay_ms(15);
bit_clear(rs2);
puerto_lcd = 0b00110000; //se envia 3 veces este binario
for(i=1;i<=3;i++)
{
delay_cycles(10);
bit_set(e2);
delay_cycles(10);
bit_clear(e2);
delay_ms(5);
}
puerto_lcd = 0b00100000;
delay_cycles(10);
bit_set(e2);
delay_cycles(10);
bit_clear(e2);
delay_ms(5);
display_4b(0 , 0b00101000); //Codigo para display a 4 bits
display_4b(0 , 0b00001100); //Codigo que activa el display
display_4b(0 , 0b00000110); //Que se desplace hacia la derecha
//display_4b(0 , 0b00000111) //Codigo que define el cursor para
//que desplace hacia la izquierda
//todo el mensaje
display_4b(0 , 1); //Limpia el display
delay_ms(2);
}
///////////////////////////////////////////////////////////////////////////////
void crear_carac_8b()
{
for(i=0x40;i<=0x48;i++)
{
display_8b(0 , i);
display_8b(1 , caracter1[i-0x40]);
}
}
///////////////////////////////////////////////////////////////////////////////
void crear_carac_4b()
{
for(i=0x40;i<=0x48;i++)
{
display_4b(0 , i);
display_4b(1 , caracter1[i-0x40]);
}
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#zero_ram //Borrado de la memoria ram
void main() //Rutina principal
{
set_tris_a(0b010000); //Configuracion de entradas y salidas del puerto A
set_tris_b(0b00000000); //Configuracion de entradas y salidas del puerto B
port_b_pullups(true); //Habilitación de las resistencias pull-ups
adcon1=(0x07); //Configuracion del tmr1
porta = 0; //Porta inicia en 0
puerto_lcd = 0; //Portb inicia en 0
delay_ms(2);
ini_lcd_4b();
ini_lcd_8b();
crear_carac_8b();
crear_carac_4b();
while(true) //Rutina general
{
delay_ms(500);
mensa_1_4b();
mensa_1_8b();
}
}
///////////////////////////////////////////////////////////////////////////////