Forum: Mikrocontroller und Digitale Elektronik I2CLCD.c Anpassen auf 20x4 LCD


von Peter (Gast)


Angehängte Dateien:

Lesenswert?

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

von Peter (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch der Schaltplan!

von Peter D. (peda)


Lesenswert?

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

von Hans Peter B. (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

Probier mal

  lcd_command(0x2C);
  lcd_command(LCD_4LINE);
  lcd_command(0x28);

von Hans Peter B. (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>Beim HD44780-Controller existiert kein 4-Zeilen-Befehl!

Beim Ks0073 aber schon.

von Hans Peter B. (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>  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
Noch kein Account? Hier anmelden.