20x4 LCD Display mit Fehlerhafter anzeige

Hallo,

ich wollte mein EA DIP 204-6 mit der Liquid Crystal Library betreiben, habe aber feststellen müssen, dass diese nur für 2-zeilige Displays ausgelegt ist. Kann mir jemand sagen ob das dennoch möglich ist das Display damit zu betreiben oder ob es eine andere Möglichkeit gibt?

Danke

VerirrtesSchaf

dass diese nur für 2-zeilige Displays ausgelegt ist

Wo steht dass denn geschrieben?

Inwiefern hattest Du denn Probleme damit? Wie hast Du das Teil verdrahtet? Sofern die Aussage auf dem Werbe-Prospekt stimmt, dass der KS0073 praktisch vollständig komaptibel mit dem HD44780 sei, sollte das problemlos gehen.

In der Header-Datei gibt es m.E. nur Adressierungen für 2 Zeilen.

Das Problem ist, wenn ich folgendes nach dem initalisieren mache:

LiquidCrystal lcd(2,3,5,6,7,8);
lcd.begin(20,4);
lcd.setCursor(0,1);
lcd.print("Hello World!");

dann Beginnt das Dsplay in der 3. zeile zu schreiben und wiederholt das ! in der 4. Zeile.

Verirrtes Schaf

Der HD44780 kann keine 4-Zeilen-Displays ansteueren. Für Dein Display müsstest Du eine Änderung in der Bibliothek machen:

void LiquidCrystal::setCursor(uint8_t col, uint8_t row)
{
  int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
  if ( row >= _numlines ) {
    row = _numlines-1;    // we count rows starting w/0
  }
  
  command(LCD_SETDDRAMADDR | (col + row_offsets[row]));
}

ändern in:

void LiquidCrystal::setCursor(uint8_t col, uint8_t row)
{
  int row_offsets[] = { 0x00, 0x20, 0x40, 0x60 };
  if ( row >= _numlines ) {
    row = _numlines-1;    // we count rows starting w/0
  }
  
  command(LCD_SETDDRAMADDR | (col + row_offsets[row]));
}

Bitte poste das Ergebnis.

Edit: aus dem Englisch wieder Deutsch gemacht :)

Vielen Dank, werd es ausprobieren!

So…Versuch verlief leider nicht wie geplant… Scheinbar ist dieses Display hartnäckiger als gedacht.

probiers mal hiermit:

#include <LiquidCrystal.h>
//lcd (rs, rw, enable, D4, D5, D6, D7)
LiquidCrystal lcd(8, 9, 10, 2, 3, 4, 5);

void setup()
{
lcd.begin(20, 4);
lcd.setCursor(…,…); ← hier die Startpostion eintragen.

}

damit betreibe ich ein 20*4 Display am Arduino Duemillenova ohne Probleme.

So....Versuch verlief leider nicht wie geplant.... Scheinbar ist dieses Display hartnäckiger als gedacht.

Was hast Du denn gekriegt? Ich habe Deine Hardware nicht, um es auszuprobieren. Somit bin ich auf Deinen Feedback angewiesen, um herauszufinden, was schiefgegangen sein könnte. Schildere also möglichst genau, was Du machst und welches Resultat Du erhältst.

was Du machst und welches Resultat Du erhältst.

oder mach ein Foto oder einen kurzes Video. Grüße Uwe

Hallo zusammen,

ich hab das jetzt grade mal mit einem EA W204 Display ausprobiert (also nicht die DIP Ausführung). Das Ding läuft "out of the box" mit der Liquid Crystal Library.

Was wohl die Aussagen in diesem Thread relativieren dürfte: - die Liquid Crystal Library unterstützt doch 4-zeilige Displays - der HD44780 unterstützt doch 4-zeilige Displays

Laut Datenblattvergleich DIP /nicht-DIP Ausführung sollte es da keine Unterschiede geben. Ausser der Tatsache das in der nicht-DIP Ausführung wohl nur HD44780 Controller verbaut sind, in der DIP-Ausführung wohl sowohl HD44780 als auch KS0073 Controller verbaut sein können.

Wobei für HD44780 die "Standardadressierung" 0x00, 0x40, 0x14, 0x54 (wie in der Library) gilt. für KS0073 die von pylon vorgeschlagene Adressierung 0x00, 0x20, 0x40, 0x60

Grüßle Bernd

Hi.
Ich muss das hier mal wieder hochholen.
Ich hatte auch probleme ein 4 Zeiliges Display an meinem Duemilanove in Betrieb zu nehmen.
Habe dadurch das hier gefunden, und hat mir auch schon weiter geholfen.
Nur habe ich noch zwei Probleme.

Ich nutze dieses Display, in verbindung mit dem folgenden Code basierend auf dem Hello World beispiel.

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(20, 4);
  // Print a message to the LCD.
  lcd.print("..::Hello World!::..");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 2);
  // print the number of seconds since reset:
  lcd.print(millis()/10);
    lcd.print(" Sekunden online");
}

Nun zu meinen Problemen.
Die Anzeige funktioniert grundsätzlich.
Nur wird mir der Inhalt der ersten Zeile nach einigen Zeichen in die Zweite Zeile kopiert.
Das gleiche passiert mit der dritten zeile, das in die vierte reinläuft…
Wenn ich etwas in der zweiten zeile anzeigen lassen will, wird dieses durch den “Überlauf” überschrieben.

Zweites Problem:
Nach einer unregelmäßigen zeit (mal 2 min, mal 5, mal 10) habe ich ein wildes Zeichengemüse auf dem Display. Ich kann das auch durch den reset des Arduino nicht beheben. Ich muss den Arduino ganz vom USB trennen, damit sich alles wieder einfängt.

Ich habe von beiden Problemen mal Bilder gemacht.
Klick mich

Wäre super wenn mir da jemand etwas unter die arme geifen könnte.

MFG Uwe

SpitfireXP: // print the number of seconds since reset: lcd.print(millis()/10);

Der Ausdruck millis()/10 ist kein Sekundenzähler, sondern ein Hundertstelsekundenzähler.

SpitfireXP: lcd.print(" Sekunden online");

Der Text ist 16 Zeichen lang, also kannst Du auf einem 20-Zeichen Display noch vier Zeichen vor diesem Text ausgeben. Sobald also Dein Hundertstelsekundenzähler fünfstellig wird "10000", versuchst Du in der Zeile ein Zeichen mehr auszugeben als in die Zeile hineinpaßt. Das ist nach 100 Sekunden der Fall.

SpitfireXP: Wäre super wenn mir da jemand etwas unter die arme geifen könnte.

Mein Tipp wäre: Niemals versuchen mehr Zeichen in eine Zeile auszugeben als in eine Zeile reinpassen!

Wenn Text in eine andere Zeile rein soll: Vorher mit setCursor() die Ausgabe in einer anderen Zeile des Displays auswählen.

Hi. Danke erstmal für die schnelle Antwort.

Das mit den Millis ist mir bekannt, war auch nur um schneller mehr zahlen zu produzieren :)

In der ersten Zeile Habe ich ja stehen: ..::Hello World!::.. Das sind genau 20 Zeichen. Aber nach dem 12ten Zeichen wird auch schon eine Reihe runterkopiert. Nur warum weiß ich halt nicht.

Was mir grade auffällt: Wenn ich den Hello World schriftzug in der zweiten zeile anzeigen lassen will, erscheint er erst garnicht...

MFG

SpitfireXP: In der ersten Zeile Habe ich ja stehen: ..::Hello World!::.. Das sind genau 20 Zeichen. Aber nach dem 12ten Zeichen wird auch schon eine Reihe runterkopiert. Nur warum weiß ich halt nicht.

Setze mal vor die Hello-World Ausgabe ein "setCursor(0,0);", macht das einen Unterschied?

Hast Du den "RW" Anschluss des Displays auf GND (LOW) angeschlossen?

Also RW liegt auf GND

Das setCursor macht leider keinen unterschied. Was ich jetzt aber herausgefunden habe...

Wenn ich ein Hello in die erste und ein World in die dritte Zeile schreibe und das in der setup und die loop leer lasse läuft das Display für 2 stunden durch ohne abzustürzen.

Ich vermute jetzt, das das etwas mit den Timing der Kommunikation zu tun hat. Kann man die auch noch irgendwo ändern, bzw. vergleichen?

Nochmal eine andere frage. Ich habe ja die Möglichkeit das Display per SPI anzusprechen. Wäre mir damit evtl. schon geholfen, oder eher das gleiche Problem?

Soo.... Kleines Update... Das Problem mit dem Zeichensalat / absturz des Displays ist gelöst. Habe zwei von den Dingern, und das eine ist defekt. Mit dem zweiten jetzt keine Probleme damit.

Jetzt habe ich aber noch immer das Problem mit dem "Überlauf" der Zeilen. Ironischerweise hat es einmal kurz mit dem defekten Display funktioniert.

Kann man in der cpp angeben von wo bis wo eine Zeile geht? Ich gebe ja jetzt nur die Startposition an...

MFG Uwe

Du gibst die Start-Position an und bei jedem Schreibzugriff inkrementiert das Display seinen internen Address-Pointer. Nach 5 Characters ist der also 5 höher und springt demnach in die nächste Zeile wenn diese voll ist. Du musst selbst aufpassen dass du nicht mehr schreibst als Platz in einer Zeile ist.

Soweit mir bekannt sollte es laufen.
Ich habe ja garnicht so viel text der angezeigt werden soll in der zeile.
Und es wird ja nach dem 12ten zeichen rübergesetzt, obwohl ich ja 20 habe.

Ich habe nochmal das aktuelle Sketch und die cpp angehängt.
Ebenso ein weiteres Bild (letzte) das die aktuelle Anzeige zeigt.

Kann ja sein, das ich da irgendwo einen Denkfehler habe…

Sketch:

/*
  LiquidCrystal Library - Hello World
 
 Demonstrates the use a 20x4 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the 
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 
 This sketch prints "Hello World!" to the LCD
 and shows the time.
 
  The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 22 Nov 2010
 by Tom Igoe
 
 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/LiquidCrystal
 */

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(20, 4);
  // Print a message to the LCD.
  lcd.print("Hallo M-Perium!");
  lcd.setCursor(0, 1);
  lcd.print("Hallo M-Perium!2");
  lcd.setCursor(0, 3);
  lcd.print("Hallo M-Perium!4");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 2);
  // print the number of seconds since reset:
  lcd.print(millis()/1000);
  lcd.print(" Sekunden");
}

cpp:

/*
  LiquidCrystal Library - Hello World
 
 Demonstrates the use a 20x4 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the 
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 
 This sketch prints "Hello World!" to the LCD
 and shows the time.
 
  The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 22 Nov 2010
 by Tom Igoe
 
 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/LiquidCrystal
 */

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(20, 4);
  // Print a message to the LCD.
  lcd.print("Hallo M-Perium!");
  lcd.setCursor(0, 1);
  lcd.print("Hallo M-Perium!2");
  lcd.setCursor(0, 3);
  lcd.print("Hallo M-Perium!4");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 2);
  // print the number of seconds since reset:
  lcd.print(millis()/1000);
  lcd.print(" Sekunden");
}