LCD 4x20 mit LiquidCrystal Library

Da ich mich schon immer mal mit Mikrocontrollern beschäftigen wollte, habe ich mir vor ein paar Tagen den Arduino Duemilanove geholt und versuche mich jetzt an einem LCD mit 4x20 Zeichen

Ich hab es so angeschlossen wie im Tutorial:
nur nicht die pins D0 - D3 sondern D4 - D7 wie es wohl auch gehört...

Es wird auch etwas angezeigt, nur wenn ich viele Zeichen schreibe wiederholen sie sich in der 2. Zeile und wenn ich bspw.
lcd.setCursor(0,1);
lcd.print("hallo");
programmiere, wird "hallo" in der 3. Zeile ausgegeben.

Ist wohl klar dass hier was mit der Adressierung nicht stimmt. Ich hab schon versucht in der LiquidCrystal.cpp die Zeile
int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
in int row_offsets[] = { 0x00, 0x20, 0x40, 0x60 }; zu ändern, aber das hat irgendwie keine Auswirkung. Wäre super wenn mir da wer bei helfen könnte.

Was ich auch nicht verstehe ist, dass im Tutorial unten bei dem Codebeispiel so Sachen stehen wie
lcd.begin(2,16);
er kennt bei mir die Funktion begin() gar nicht...

Gruß xcv

Hier noch das Datenblatt des Displays:

Hallo,

also wenn Du die LiquidCrystal Library verwendest, dann könnte Dein Problem sein, dass beim initialisieren der Klasse das Display wie folgt eingerichtet wird:

command(0x28); // function set: 4 bits, 1 line, 5x8 dots
(siehe LiquidCrystal.cpp, Zeile 71)

Damit wird es aber als ein-/zweizeiliges Display initialisiert und nicht als vierzeiliges Display.

An Hand des PDFs müsstest Du mal ausrechnen, was Du statt 0x28 als initialisierung an das LCD schicken musst (ich habe da was bzgl. 0x09 - 4 Zeilen Modus gefunden, aber wie man das verwendet müsstest Du selbst ausprobieren)

Gruß
KiWiX

Hab's hinbekommen. Das Problem war, dass man bei dem LCD-Controller KS0073 erst mit Function Set das RE-Bit setzen muss, dann dann ist das extended Function Set aktiviert und darin kann man dann auf 4-Line Display umschalten.

Hab dazu folgende Befehle verwendet. Vielleicht brauchts ja nochmal einer :slight_smile:

command(0x2C); //Function set RE on
delayMicroseconds(150);
command(0x09); //ext. Function set 4-line display
delayMicroseconds(150);
command(0x28); //Function set RE off

Hallo xcv,

habe mir bei Reichelt auch so ein Display gekauft. Nun suche ich eine Adapterplatine, damit ich das LCD auf ein RM 2.54 Experimentierboard stecken kann.

Wie hast Du die Anschlüsse an den Arduino gemacht?

Gruß

Dude

Hallo Dude,

ich hab Kabel an die LCD pins gelötet und ans andere Ende so Stiftleisten mit Rastermaß 2,54 ( http://media.conrad.de/xl/7000_7999/7300/7390/7394/739456_BB_00_FB.EPS.jpg ) ist es glaub ich, die ich dann in die Arduino Ports stecke...

oder meinst du wie ich es angeschlossen habe?

LCD Arduino

1 (GND) GND
2 (5V) 5V
3 (VEE/Contrast) Mittelabgriff Poti
4 (RS) 13
5 (R/W) GND
6 (Enable) 12
8 (D4) 8
9 (D5) 9
10 (D6) 10
11 (D7) 11

Hier ein Patch.

26a27,28

byte _20x4hack = 0;

68,69c70,71
< _data_pins[7] = d7;
<

_data_pins[7] = d7;

82d83
< begin(16, 1);
108,122c109,111
< //put the LCD into 4 bit or 8 bit mode
< if (! (_displayfunction & LCD_8BITMODE)) {
< // this is according to the hitachi HD44780 datasheet
< // figure 24, pg 46
<
< // we start in 8bit mode, try to set 4 bit mode
< write4bits(0x03);
< delayMicroseconds(4500); // wait min 4.1ms
<
< // second try
< write4bits(0x03);
< delayMicroseconds(4500); // wait min 4.1ms
<
< // third go!
< write4bits(0x03);

// hack for 20x4 Display
if (cols==20 && lines==4) {
command(0x2C); //Function set RE on
124,136c113
<
< // finally, set to 8-bit interface
< write4bits(0x02);
< } else {
< // this is according to the hitachi HD44780 datasheet
< // page 45 figure 23
<
< // Send function set command sequence
< command(LCD_FUNCTIONSET | _displayfunction);
< delayMicroseconds(4500); // wait more than 4.1ms
<
< // second try
< command(LCD_FUNCTIONSET | _displayfunction);


command(0x09); //ext. Function set 4-line display
138,140c115,153
<
< // third go
< command(LCD_FUNCTIONSET | _displayfunction);


command(0x28); //Function set RE off
_20x4hack=1;
}
//put the LCD into 4 bit or 8 bit mode
else
{
if (! (_displayfunction & LCD_8BITMODE)) {
// this is according to the hitachi HD44780 datasheet
// figure 24, pg 46

// we start in 8bit mode, try to set 4 bit mode
write4bits(0x03);
delayMicroseconds(4500); // wait min 4.1ms

// second try
write4bits(0x03);
delayMicroseconds(4500); // wait min 4.1ms

// third go!
write4bits(0x03);
delayMicroseconds(150);

// finally, set to 8-bit interface
write4bits(0x02);
} else {
// this is according to the hitachi HD44780 datasheet
// page 45 figure 23

// Send function set command sequence
command(LCD_FUNCTIONSET | _displayfunction);
delayMicroseconds(4500); // wait more than 4.1ms

// second try
command(LCD_FUNCTIONSET | _displayfunction);
delayMicroseconds(150);

// third go
command(LCD_FUNCTIONSET | _displayfunction);
}
175c188,200
< int row_offsets = { 0x00, 0x40, 0x14, 0x54 };


int row_offsets[4];
row_offsets[0] = 0x00;
if ( _20x4hack==1 ) {
row_offsets[1] = 0x20;
row_offsets[2] = 0x40;
row_offsets[3] = 0x60;
}
else
{
row_offsets[1] = 0x40;
row_offsets[2] = 0x14;
row_offsets[3] = 0x54;
}

Halo XCV,
Ich hab ein gleiche LCD wie du gekauft hast. Hast du mit dieser LCD schon bestandig?

Kan ich dir deine CODE und LIB bitten? vielen Dank.

Hallo dbo,

ich habe das selbe Display und mit der LCD4Bit Library konnte ich das Display initialisieren.

Hier der Link:

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1273918261

Gruß Jürgen

Hallo Juergen_S,
Ja..., da habe ich eigentlich gemacht.
Aber..., mein LCD hat nicht die richtige Anzeige geschaut.
Ich weisse nicht warum. :-[

also... mache ich 4x20 LCD dip204-4 mit KS0073 controller , benutze ich LCD4bit.cpp von originell + dass ich von Ihnen renoviert haben.

vielen Dank! :slight_smile:

Schon fertig. Danke!