Hallo habe probleme die i2clcd.c (h) an ein 20x4 LCD anzupassen. Ich kann in Zeile 1 und 3 schreiben aber im LCD steht dann: Zeile 3:1ABCDEFGHIJKLMNOPQRS Zeile 4:LMNOPQRS Wenn ich das richtig gesehen habe hängt es im Unterprogramm "lcd_gotolr" da wird die Variable "row-1" auf die Ausgänge geschrieben aber ohne es auf 4 Bit zu zerlegen. Befinde mich aber im 4 Bit modus. Dadurch kann ich auch keine Spalte über 16 angeben. Aber wieso der dann die letzten 8 Buchstaben doppelt schreibt weiß ich nicht. Kann mir da jemand weiter helfen? lg Peter
Schau einfach mal ins Datenblatt Deines konkreten LCD. Da steht dann drin, an welcher Adresse jede Zeile beginnt. Und die mußt Du dann einfach + 0x80 als Kommando ans LCD schicken, schon bist Du in der gewünschten Zeile. Peter
Schau mal die LCD-Seite von Sprut an. http://www.sprut.de/electronic/lcd/ Da ist die Adress-Zuordnung des 4x20-Display genau beschrieben. Hans Peter
Peter schrieb: > Hallo habe probleme die i2clcd.c (h) an ein 20x4 LCD anzupassen. Welche Anpassungen im Code hast du vorgenommen (das ist ja scheinbar ein Code vom Peter Fleury. Ich kann aber das Original auf die Schnelle nicht finden) > Wenn ich das richtig gesehen habe hängt es im Unterprogramm "lcd_gotolr" > da wird die Variable "row-1" auf die Ausgänge geschrieben aber ohne es > auf 4 Bit zu zerlegen. Befinde mich aber im 4 Bit modus. Uninteressant. Dazu hast du die Funktion lcd_write. Die kümmert sich um die Zerlegung. Ausserhalb lcd_write interessiert es keinen, dass du 4 Bit MOdus hast. > ich auch keine Spalte über 16 angeben. Aber wieso der dann die letzten 8 > Buchstaben doppelt schreibt weiß ich nicht. > Kann mir da jemand weiter helfen? Ich schätze mal, dass dein LCD nicht in den 4 Zeilen Modus gesetzt wurde. Zumindest sieht das hier
1 | //- From now on in 4-bit-Mode
|
2 | lcd_command(LCD_4BIT | LCD_2LINE | LCD_5X7); //- 2-Lines, 5x7-Matrix |
3 | lcd_command(LCD_4LINE); |
nicht koscher aus. Zuerst wird in 2 Zeilen geschaltet und danach auf 4 Zeilen. Das ist aber nicht schlau, denn durch das 2.te lcd_command werden die Einstellungen des ersten lcd_command wieder rückgängig gemacht. Da solche Dinge Peter eigentlich normalerweise nicht passieren: Hast du am Code umgebastelt? Abgesehen davon: Bei einem LCD, welches über I2C angesprochen wird, welchen Sinn macht da ein 4-Bit Modus? Ich verstehs nicht.
Karl Heinz Buchegger schrieb: > Bei einem LCD, welches über I2C angesprochen wird, > welchen Sinn macht da ein 4-Bit Modus? Ich verstehs nicht. Es läuft über einen I²C-IO-Expander, der nur 8 Outputs hat.
Probier mal lcd_command(0x2C); lcd_command(LCD_4LINE); lcd_command(0x28);
Beim HD44780-Controller existiert kein 4-Zeilen-Befehl! Die in "i2clcd.h" enthaltene Konstante "LCD_2LINE", ist sowohl für "2x40"- wie für "4x20"-LCDs gültig. Die Charakter-Position auf dem entsprechenden Display wird nur über die Funktion "lcd_gotolr"gewählt. In http://www.sprut.de/electronic/lcd/ ist es so schön erklärt! Hans Peter
>Beim HD44780-Controller existiert kein 4-Zeilen-Befehl!
Beim Ks0073 aber schon.
Ja ich bin vom falschem Display ausgegangen, da Peter in seinem Programmkopf den LCD-Kontrollertyp nicht geändert hat. Das EA DIP204-4 hat natürlich einen KS0073-Kontroller mit einem 4-Zeilen-Befehl. Also muss die lcd-Init-Sequenz in i2clcd.c wie folgt geändert werden: void lcd_init(void) { lcd_wait_ms(16); //-Wait for more than 15ms after VDD rises to 4.5V lcd_write(LCD_D5 | LCD_D4); //-Set interface to 8-bit lcd_wait_ms(5); //-Wait for more than 4.1ms lcd_write(LCD_D5 | LCD_D4); //-Set interface to 8-bit lcd_wait_us(101); //-Wait for more than 100us lcd_write(LCD_D5 | LCD_D4); //-Set interface to 8-bit lcd_write(LCD_D5); //-Set interface to 4-bit //- From now on in 4-bit-Mode lcd_command(LCD_4BIT | RE_REG); //-extension register lcd_command(LCD_4LINE) lcd_command(LCD_DISPLAYOFF); //-Display off lcd_command(LCD_CLEAR); //-Clear Screen lcd_command(LCD_INCREASE | LCD_DISPLAYSHIFTOFF);//- Entrymode (Display Shift: off, Increment Address Counter) lcd_command(LCD_DISPLAYON); //-Display on } Und in i2lcd.h muss folgendes eingefügt werden: #define LCD_CONFIGURATION 0x20 /**< Set function */ #define LCD_8BIT LCD_CONFIGURATION | 0x10 /**< 8 bits interface */ #define LCD_4BIT LCD_CONFIGURATION | 0x00 /**< 4 bits interface */ #define LCD_4LINE 0x09 /**< 4 line display */ #define RE_REG LCD_CONFIGURATION | 0x04 /**< extension register #define LCD_2LINE LCD_CONFIGURATION | 0x08 /**< 2 line display */ #define LCD_1LINE LCD_CONFIGURATION | 0x00 /**< 1 line display */ #define LCD_5X10 LCD_CONFIGURATION | 0x04 /**< 5 X 10 dots */ #define LCD_5X7 LCD_CONFIGURATION | 0x00 /**< 5 X 7 dots */ Hans Peter
> lcd_command(LCD_4BIT | RE_REG); //-extension register > lcd_command(LCD_4LINE) Wo wird RE_REG wieder auf 0 gesetzt?
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.