Guten Tag. Ich habe ein 4x20er LCD-Display an einen ATmega32 angeschlossen, um ihn im 4-Bit-I/O-Modus zu betreiben. Die lcd.h habe ich wie folgt angepasst: #define XTAL 4000000 #define LCD_LINES 4 #define LCD_DISP_LENGTH 20 #define LCD_LINE_LENGTH 0x13 #define LCD_START_LINE1 0x00 #define LCD_START_LINE2 0x20 #define LCD_START_LINE3 0x40 #define LCD_START_LINE4 0x60 #define LCD_WRAP_LINES 0 #define LCD_IO_MODE 1 #define LCD_PORT PORTA Wenn ich nun folgende Befehle ausführe: #include"lcd.h" int main(void) { lcd_init(LCD_DISP_ON_CURSOR_BLINK); lcd_gotoxy(0,0); lcd_puts("A"); lcd_gotoxy(0,1); lcd_puts("B"); lcd_gotoxy(0,2); lcd_puts("C"); lcd_gotoxy(0,3); lcd_puts("D"); while(1); } erscheint auf dem Display nur: ++--------------------+ ||A | || | ||C | || | ++--------------------+ Was ist da los? Liegt es an der Library? Oder an meinen Defines? Oder an was ganz anderem?
Welches Display? Welche Bibliothek hast du verwendet? Schreibt das Display nur 'A' und 'C' in die erste und dritte Zeile oder wo ist das Problem? :-)
> Welches Display? "EA DIP204-4" von Reichelt > Welche Bibliothek hast du verwendet? Die von Peter Fleury > Schreibt das Display nur 'A' und 'C' in die erste und dritte Zeile oder wo ist das Problem? :-) Genau das ist das Problem. Eigendlich sollte die Ausgabe so aussehen: ++--------------------+ ||A | ||B | ||C | ||D | ++--------------------+
Hi, versuch es mal damit. Beachte die LCD_START_LINE von Zeile 2 und 4! #define LCD_START_LINE1 0x00 /* DDRAM address of first char of line 1 */ #define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */ #define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */ #define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */ Mfg Sascha
Jetzt sieht's so aus: ++--------------------+ ||A | || C | ||B | || D | ++--------------------+ Irgendwie auch nicht besser...
Dann bleibt dir wohl nichts anderes übrig, als die lcd_init (...) verstehen zu lernen und anhand deines Datenblattes anzupassen ... Es gibt zwar viele Display-Controller, die sich HDD...-kompatibel nennen, doch irgendwie hat doch jeder seine Macke.
Hallo Andrea, hattest du dir schon die Mühe gemacht, dir die Startadressen aus dem Datenblatt zu suchen? Ich habe mal mit einem 4*20 Display von Reichelt gearbeitet. Dort waren die Startadressen der Zeilen: #define LCD_START_LINE1 0x00 #define LCD_START_LINE2 0x40 #define LCD_START_LINE3 0x10 #define LCD_START_LINE4 0x50 Im Zweifel aber immer ins eigene Datenblatt schauen, ist doch nicht so schwierig :-)
> hattest du dir schon die Mühe gemacht, dir die Startadressen aus dem > Datenblatt zu suchen? > Ich habe mal mit einem 4*20 Display von Reichelt gearbeitet. Dort waren > die Startadressen der Zeilen: > #define LCD_START_LINE1 0x00 > #define LCD_START_LINE2 0x40 > #define LCD_START_LINE3 0x10 > #define LCD_START_LINE4 0x50 > Im Zweifel aber immer ins eigene Datenblatt schauen, ist doch nicht so > schwierig :-) Ich habe ins Datenblatt geschaut. Ich hab's mir sogar 10 mal durgelesen, weil ich den Eindruck hatte, etwas vergessen zu haben. Im Datenblatt stehen bei mir aber die Startadressen, die in meinem ersten Beitrag zu sehen sind. Wenn du willst kann ich ein Beweisphoto posten. Deine Startadressen sind scheinbar auch nicht korrekt, da die Ausgabe jetzt noch ein Stück verwirrender aussieht: ++--------------------+ ||A C | || C | ||B D | || D | ++--------------------+ Scheinbar habe ich jetzt auch zwer Cursor: Jeweils einer hinter jedem D.
Vielleicht liegts ja daran? #define LCD_LINE_LENGTH 0x13 /**< internal line length of the display */ bei mir steht: #define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */ Ist auch ein 20*4 mfg sascha
Bei meinem Display sind die Startadressen wie folgt: #define LINE1 0x00 #define LINE2 0x40 #define LINE3 0x10 #define LINE4 0x50
Kannst du mal die Bezeichnung des Displaycontrollers heraus finden? Schon mal mit dem Parameter LCD_WRAP_LINES rumgespielt, also mal auf 1 gesetzt?
> Kannst du mal die Bezeichnung des Displaycontrollers heraus finden? Laut Datenblatt ist es ein KS0073, der angeblich "NAHEZU 100% HD44780 KOMPATIBEL" ist > Schon mal mit dem Parameter LCD_WRAP_LINES rumgespielt, also mal auf 1 > gesetzt? Ja, der ändert aber auch nichts.
Jetzt wird mit einiges klar :-) Da bist du nicht die einzige mit dem Problem, habe in einem anderen Thread bereits eine Lösung gepostet: http://www.mikrocontroller.net/forum/read-1-119278.html#new Alex
@Alex: Ich habe mal deine modifizierte Version der Library ausprobiert, und da seh ich auf dem Display das folgende: ++--------------------+ ||A | || }}}}}}}}}}}}| ||C | || }}}}}}}}}}}}| ++--------------------+ Womit wir wieder am Anfang wären, mit dem Unterschied, dass jetzt geschweifte Klammern aufgetaucht sind. So langsam aber sicher verzweifle ich...
Öffne lcd.c, gehe in die Funktion lcd_init(uint8_t) (ganz am Ende der Datei) und verschiebe die drei von Alex eingefügten Befehle, die sich ganz am Ende der Funkton befinden direkt hinter das #endif. Das sieht dann so aus: [...] /* reset LCD */ delay(16000); /* wait 16ms after power-on */ lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */ delay(4992); /* wait 5ms */ lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */ delay(64); /* wait 64us */ lcd_write(LCD_FUNCTION_8BIT_1LINE,0); /* function set: 8bit interface */ delay(64); /* wait 64us */ #endif lcd_command (0x2C); lcd_command (0x09); lcd_command (0x28); lcd_command(LCD_FUNCTION_DEFAULT); /* function set: display lines */ lcd_command(LCD_DISP_OFF); /* display off */ lcd_clrscr(); /* display clear */ lcd_command(LCD_MODE_DEFAULT); /* set entry mode */ lcd_command(dispAttr); /* display/cursor control */ }/* lcd_init */ [...]
Die Änderungen funktionieren super, aber ich nutze jetzt das EA DIP 204-6 - das hat noch eine Statuszeile wo man vordefinierte Symbole anzeigen kann. Hat jemand eine Idee, wie ich diese Symbole nutzen kann?
Ich habe jetzt die *.h und die *.c auf das Display EA DIP 204-6 angepasst. Ich hoffe P. Fleury hat nichts dagegen, oder? thx nochmal Daniel
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.