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
Lesezeichen