Hallo Habe schon gesucht aber nichts passendes gefunden. Mein Problem ist das ich bei meinem 2x16 Display nicht die zweite Zeile aktiviert bekomme. Bei einem Assambler Projekt funktionierten beide Zeilen. Habe mal die lcd.c angehangen. Vielleicht findet ja Jemand den Fehler. (ATMEGA8 und C) Vielen Dank elomt
Schreib mal das Display hintereinanderweg Zeichen für Zeichen voll und laß dir gleichzeitig am Displayanfang die Position anzeigen. Und notiere den Offset, wenn das erste Zeichen in der zweiten Zeile erscheint. Dieser Offset ist hier: case 2: tmp=0x80+0x40+x; break; einzutragen. Nämlich da, wo die 0x40 steht. Alternativ mal den Cursor auf Zeile 3 oder 4 setzen. Und ggfs. die Offsets auch dort anpassen, falls das erste Zeichen bei set_cursor(0, Zeile); nicht am Zeilenanfang steht. Leider ist es so, daß manche Displays eine merkwürdige Adreßzuordnung haben. Die Offsetwerte in dieser Funktion muß ich auch regelmäßig anpassen.
1 | void set_cursor(uint8_t x, uint8_t y) |
2 | {
|
3 | uint8_t tmp; |
4 | |
5 | switch (y) { |
6 | case 1: tmp=0x80+0x00+x; break; |
7 | case 2: tmp=0x80+0x40+x; break; |
8 | case 3: tmp=0x80+0x10+x; break; |
9 | case 4: tmp=0x80+0x50+x; break; |
10 | |
11 | }
|
12 | lcd_command(tmp); |
13 | }
|
Gruß Jadeclaw.
lcd_command(0x30); // 3 mal 0x30 ins Steuerregister schreiben Warum tust du nicht einfach das was da als Kommentar steht?
Hi Habe den Fehler endlich gefunden. Die Pausen zwischen den Befehlen waren zu kurtz. Trozdem Vielen Dank elomt
@Holger: Macht er doch.
1 | lcd_command(0x30); // 3 mal 0x30 ins Steuerregister schreiben |
2 | _delay_ms(10); |
3 | lcd_enable(); |
4 | _delay_ms(10); |
5 | lcd_enable(); |
Das lcd_command(0x30); schreibt die 0x30 das erste mal in den Port und danach ins Display. die zwei nachfolgenden lcd_enable(); schreiben die 0x30 noch zweimal ins Display. Da die 0x30 noch im Port stehen, reicht es, die Enable-Leitung zweimal zu toggeln. Im 4-Bit-Modus geht das natürlich nicht so einfach, an den übertragenen Werten ist aber zu erkennen, hier wird im 8-Bit-Modus gearbeitet. @elomt: Prozessortakt an den vorgesehenen Stellen eingetragen? #define F_CPU, Makefile oder Projekteinstellungen, falls GCC im AVRStudio. Danach stimmen auch die Delay-Zeiten. Wobei - Manche Displays sind aber auch echte Schlaftabletten... Gruß Jadeclaw.
>@Holger: Macht er doch. Ich weiß. > lcd_command(0x30); // 3 mal 0x30 ins Steuerregister schreiben > _delay_ms(10); > lcd_enable(); > _delay_ms(10); > lcd_enable(); Wenn er statt dem unübersichtlichen Kram da oben dreimal lcd_command(0x30); geschrieben hätte, würde ihm hinter dem letzten lcd_enable(); auch kein kurzes delay fehlen ;)
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.