Hola cerc151 si lo deseas puedes probar con mi libreria q esta preparada para conectar el lcd 2X16 al portd:
//***************** Cabecera LCD.h para el PIC16F87x **********************
//Interace a 4 bits usando el puerto PORTD para conectar el display LCD y el
//Timer 1 para inicializar el LCD. Version 1.0 - 20/06/2002
//************************ Definicion de variables ************************
#define RS RD0
#define RW RD1
#define EN RD2
#define DB4 RD4
#define DB5 RD5
#define DB6 RD6
#define DB7 RD7
unsigned char temp_lcd;
//************************ Prototipos funciones ***************************
void tiempo_lcd (unsigned char t);
void inicializar_lcd (void);
void envia_al_lcd (unsigned char codigo, unsigned char dato);
unsigned char leer_lcd (void);
unsigned char esperar_bf (void);
//******************** Desarrollo de las funciones ************************
void tiempo_lcd (unsigned char t) //Temporiza t milesimas de segundo
{ T1CON=0x00; //Timer 1 sin interrupcion
while (t)
{ TMR1H=0xFC;
TMR1L=0x18;
TMR1ON=1;
while(!TMR1IF);
TMR1ON=TMR1IF=0;
t--;
}
}
void inicializar_lcd (void)
{ TRISD=0x00; //PORTD salida
tiempo_lcd(20); //esperar mas de 15 mseg
PORTD=0x30; //0011--00
EN=1; EN=0;
tiempo_lcd(1+5); //esperar tiempo ejecucion y mas de 4"1 mseg
PORTD=0x30; //0011--00
EN=1; EN=0;
tiempo_lcd(1+1); //esperar tiempo ejecucion y mas de 0"1 mseg
PORTD=0x30; //0011--00
EN=1; EN=0;
tiempo_lcd(1); //esperar tiempo ejecucion
PORTD=0x20; //0010--00
EN=1; EN=0;
temp_lcd=esperar_bf();
PORTD=0x20; //0010--00
EN=1; EN=0;
PORTD=0x80; //1000--00
EN=1; EN=0;
temp_lcd=esperar_bf(); //Interface a 4 bits, 2 lineas y 5x7 puntos
PORTD=0x00; //0000--00
EN=1; EN=0;
PORTD=0x80; //1000--00
EN=1; EN=0;
temp_lcd=esperar_bf(); //Display OFF
PORTD=0x00; //0000--00
EN=1; EN=0;
PORTD=0x01; //0001--00
EN=1; EN=0;
temp_lcd=esperar_bf(); //Display borrado
PORTD=0x00; //0000--00
EN=1; EN=0;
PORTD=0x60; //0110--00
EN=1; EN=0;
temp_lcd=esperar_bf(); //Seleccion modo entrada datos
PORTD=0x00; //0000--00
EN=1; EN=0;
PORTD=0xC0; //1100--00
EN=1; EN=0;
temp_lcd=esperar_bf(); //Activar display, sin cursor ni parpadeo
}
void envia_al_lcd(unsigned char codigo, unsigned char dato)
{ PORTD=(dato&0xF0)|codigo;
EN=1; EN=0;
PORTD=((dato<<4)&0xF0)|codigo;
EN=1; EN=0;
temp_lcd=esperar_bf();
}
unsigned char leer_lcd(void)
{ unsigned char aux=0;
TRISD=0xF0; //DB7 a DB4 entradas
PORTD=0xF3; //RS=RW=1
EN=1;
aux=PORTD&0xF0;
EN=0; EN=1;
aux=((PORTD&0xF0)>>4)|aux;
EN=0;
temp_lcd=esperar_bf();
TRISD=0x00; //PORTD salida
return (aux);
}
unsigned char esperar_bf (void)
{ unsigned char aux=0;
TRISD=0xF0; //DB7 a DB4 entradas
PORTD=0xF2; //RS=0 y RW=1
do
{ EN=1;
aux=PORTD&0xF0;
EN=0; EN=1;
aux=((PORTD&0xF0)>>4)|aux;
EN=0;
}
while((aux&0x80)!=0);
TRISD=0x00; //PORTD salida
return(aux);
}
Y aqui un ejemplo de como usarla, veras q es realmente facil:
#include <pic1687x.h>
#include <lcd.h>
const unsigned char mensaje1[]={"Mensaje 1"};
const unsigned char mensaje2[]={"Mensaje 2"};
void main (void)
{
unsigned char x;
inicializar_lcd();
envia_al_lcd(0,0x01); //borrado
envia_al_lcd(0,0x80); //Primera linea
for(x=0;mensaje1
- ;x++)
envia_al_lcd(1,mensaje1 - );
envia_al_lcd(0,0xC0); //segunda linea
for(x=0;mensaje2 - ;x++)
envia_al_lcd(1,mensaje2 - );
while(1);
}
ESPERO Q PUEDA SERTE UTIL, ES UN SISTEMA SENCILLO DE MANEJAR EL 2X16