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:
Pinbelegung: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); }
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