I2CLCD.c Anpassen auf 20x4 LCD

Gast #2606633
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
Angehängte Dateien:
#2606664
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.
Gast #2607410
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren