#include <p18f6680.h>
#include <Delays.h>

#define RESETB	LATAbits.LATA0
#define RS		LATAbits.LATA1
#define WR		LATAbits.LATA2
#define RD		LATAbits.LATA3

#define CONTROL_TRIS	TRISA

#define LCD_DATA	LATD
#define LCD_TRIS	TRISD
#define LCD_PORT	PORTD

unsigned char LCDread (unsigned char stat)
{
	unsigned char data=0;
	LCD_PORT=0;
	LCD_TRIS=0xFF;
	if (stat=='S') RS=0;		//status
	if (stat=='D') RS=1;		//data
	RD=0;
	Delay1TCY();
	data= LCD_PORT;
	LATE=data;
	RD = 1;
	LCD_TRIS = 0x00;
	return data;	
}

void LCDwrite (unsigned char sel,unsigned char data)
{
	while (LCDread('S')& 0x80);
	if (sel == 'D') RS=1;		//data
	if (sel == 'C') RS=0;		//command
	WR=0;
	LCD_DATA = data;
	Delay10TCYx(10);
	WR=1;
	Delay10TCYx(10);
}

void INITport (void)
{
	LCD_DATA=0;
	RS=WR=RD=RESETB=0;
	CONTROL_TRIS	=	0x00;
	LCD_TRIS		=	0x00;
	RS=WR=RD=RESETB	=	1;
}
	
void main (void)
{
	unsigned char a;
	LATE=0x00;
	TRISE=0x00;
	INITport();
	Delay10KTCYx(250);		
	Delay10KTCYx(250);
	Delay10KTCYx(250);
	Delay10KTCYx(250);
	Delay10KTCYx(250);

	RESETB 	= 	0;			//reset
	Delay10KTCYx(250);
	RESETB	=	1;
	LATE=LCDread('S');		//read status
	while(1);
}
