//*****************  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;		//RW=0 codigo es RS
	EN=1; EN=0;				//RS=0 (instruccion)
	PORTD=((dato<<4)&0xF0)|codigo;		//RS=1 (dato)
	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);
}

