Hi,

ich habe ebenfalls ein Problem ein LCD mit einem 18F4550 anzusteuern. Ich arbeite erst seit kurzem mit den 18ern. Compilieren tue ich ebenfalls mit C18. Hier mal der fürs LCD relevante Code:

Code:
//Überprüfe LCDStatus
void waitForLCD(void)
{
	//Steuerleitungen einstellen
	LATE |= 0b00000010; //RW
	LATE &= 0b11111011; //RS

	//RD4..7 Inputs
	LATD &= 0b00001111;
	TRISD = 0xFF;
	
	//Busyschleife
	cBusy = 0x80;
	do
	{
		LATE |= 0b00000001;
		Delay1TCY();
		cBusy = PORTD;
		LATE &= 0b11111110;
		Delay1TCY();
		LATE |= 0b00000001;
		Delay1TCY();
		LATE &= 0b11111110;
	}while((cBusy & 0b10000000) != 0x00);

	//Leitungen zurücksetzen
	LATE &= 0b11111001; //RW, RS
	TRISD = 0x0F;
	LATD &= 0b00001111;

	return;	
}

//Übertrage Steuerdaten an LCD
void sendCWToLCD(char cWord)
{
	//Busy-Check
	waitForLCD();

	//Steuerleitungen einstellen
	LATE &= 0b11111000;
	
	//Übertragen der Bits 4..7
	LATD &= 0b00001111;
	LATD |= cWord & 0b11110000;
	LATE |= 0b00000001;
	Delay1TCY();
	LATE &= 0b11111110;

	//Übertragen der Bits 0..3
	LATD &= 0b00001111;
	LATD |= (cWord & 0b00001111) << 4;
	LATE |= 0b00000001;
	Delay1TCY();
	LATE &= 0b11111110;
}

//Übertrage Daten an LCD
void sendDWToLCD(char cWord)
{
	//Busy-Check
	waitForLCD();

	//Steuerleitungen einstellen
	LATE &= 0b11111100; //RW
	LATE |= 0b00000100; //RS
	
	//Übertragen der Bits 4..7
	LATD &= 0b00001111;
	LATD |= cWord & 0b11110000;
	LATE |= 0b00000001;
	Delay1TCY();
	LATE &= 0b11111110;

	//Übertragen der Bits 0..3
	LATD &= 0b00001111;
	LATD |= (cWord & 0b00001111) << 4;
	LATE |= 0b00000001;
	Delay1TCY();
	LATE &= 0b11111110;

	LATE &= 0b11111011; //RS
}

//Initialisierung des LCD
void initLCD(void)
{
	//15ms Warten
	Delay10KTCYx(10);

	//Sende Init-Byte (1)
	LATD &= 0b00001111;
	LATD |= 0b00110000;
	LATE |= 0b00000001;
	Delay1TCY();
	LATE &= 0b11111110;

	//5ms Warten
	Delay10KTCYx(5);

	//Sende Init-Byte (2)
	LATD &= 0b00001111;
	LATD |= 0b00110000;
	LATE |= 0b00000001;
	Delay1TCY();
	LATE &= 0b11111110;

	//100us Warten
	Delay100TCYx(10);

	//Sende Init-Byte (3)
	LATD &= 0b00001111;
	LATD |= 0b00110000;
	LATE |= 0b00000001;
	Delay1TCY();
	LATE &= 0b11111110;

	Delay100TCYx(10);

	//4-bit
	LATD &= 0b00001111;
	LATD |= 0b00100000;
	LATE |= 0b00000001;
	Delay1TCY();
	LATE &= 0b11111110;
	
	Delay100TCYx(10);

	//Display löschen
	sendCWToLCD(0b00000001);
	
	//4-bit Interface und 5x8 Matrix
	sendCWToLCD(0b00101000);

	//Display aus
	sendCWToLCD(0b00001000);

	//Cursorrichtung rechts, Shift aus
	sendCWToLCD(0b00000010);

	//Display ein
	sendCWToLCD(0b00001100);
}
Pinbelegung:

D4..7 -> RD4..7
E -> RE0
RW -> RE1
RS -> RE2

Nur damit ihr euch nicht wundert: An RD0..3 sind Eingänge für ne Tastermatrix.

Wenn ich das Programm laufen lasse passiert nix. Das Display zeigt nix bzw. bei runtergedrehter Kontrastspannung schwarze Kästen an, als wäre es nicht initialisiert.

mfg The Scientist