Forum: Projekte & Code LCD EA DIP204 KS0073 4-Bit, 8-Bit und serielle C-Routinen


von Matthias (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

als Anhang die Basis C-Routinen zur Ansteuerung des EA DIP-204 (4x20 
Zeichen) mit KS0073 LCD-Controller. Dieser LCD-Controller ist ein 
verbesserter HD44780, mit mehr Funktionen, verbesserten Zeichensatz und 
der Möglichkeit der seriellen SPI-Ansteuerung.
siehe hier: http://www.lcd-module.de/deu/dip/dip.htm

Inhalt:
- 4-Bit Parallel-Mode
- 8-Bit Parallel-Mode
- Serieller Mode (mit Software SPI)

Der Code passt für SDCC 8051 (getestet mit Version 2.7.0 und 
Standard-8051, 11.0592MHz) und kann sicher leicht auf andere MCs 
portiert werden. Eine SPI-Schnittstelle beim MC ist nicht zwingend 
erforderlich, wird hierbei per Software nachgebildet. Eine Anpassung auf 
Harware-SPI dürfte unproblematisch sein.

Gruß
Matthias
Kontakt: mm19 (ALTGR und Q) gmx-topmail.de

von Marcel K. (viewer)


Lesenswert?

@  Matthias,

danke für den Link. Den Link kannte ich zwar schon. Aber ich habe mir 
die Datei trotzdem nochmal angeschaut. Ganz unten in der init wird beim 
aller ersten mal, bevor überhaupt Daten an das LCD gelegt werden, das EN 
einmal "getoggelt". Wenn ich das bei mir mache, funktioniert es, aber 
nicht richtig!!! Wenn ich den oberen Code verwende dann ist alles gut, 
möchte ich aber das Blinken des Cursors abschalten (0x0E) dann geht 
wieder nichts!!

lcd_init()
{
  pause(20000);

  //Port A als Ausgang
  LCD_D=0xff;
  LCD=0x00;

  LCD &= ~  (1<<RS);  // RS auf low
  LCD &= ~  (1<<RW);  // RW auf low

  toggel_en();
  send_to_lcd(0x20);  // schaltet in den 4 Bit Modus
  pause(20000);       // länger Zeit warten
  send_to_lcd(0x24);  // RE = 1
  send_to_lcd(0x0B);  // 5 DOT, normal cursor, 4 Lines
  send_to_lcd(0x20);  // RE = 0
  send_to_lcd(0x0E);  // Display, Cursor = 1, blink = 0
  send_to_lcd(0x01);  // clear Display
  pause(20000);       // länger Zeit warten
  send_to_lcd(0x06);  // Entry-Mode
  send_to_lcd(0x02);  // Cursor @ Home
}

Da stimmt doch irgendetwas nicht....

Wie ist den das generell  mit dem EN Pin??

reicht es wenn man es nur high und dann wieder low "macht"?

Grüße, Marcel

von Matthias (Gast)


Lesenswert?

Das ist eine 8051-Spezifik, da nach dem Reset bei 8051ern die I/O-Pins 
alle automtisch auf H liegen (pull-up). Ansonsten ist es ok, wenn man 
zur Datenübernahme E auf H setzt und dann auf L lässt.

von Marcel K. (viewer)


Lesenswert?

Hallo Mathias,

ich habe das ganze jetzt hin bekommen!!!! freu

Bin von mir selber etwas beeindruckt (kleinlaut)

meine Funktion:

void send_to_lcd(U8 byte)
{
  U8 rs_rw_buffer;

  rs_rw_buffer = (LCD&(RS+RW)); // in der Variable "rs_rw_buffer" werden
                                // die zwei Bits RS und RW gespeichert

  LCD = (byte&0xf0);            // An die Datenleitungen D4 - D7 wird 
das
                                // obere Nibbel der Daten angelegt.
                                // (dabei werden die RS und RW
                                //  Bits gelöscht)

  LCD = (LCD|rs_rw_buffer);     // jetzt werden die Bits RS und RW
                                // wieder an das LCD übertragen

  toggel_en();                  // EN "toggeln" --> high / low

  LCD = (byte<<4);              // Die Datenbytes werden 4 mal nach 
rechts
                                // geschoben dabei steht im unteren
                                // Nibbel 0000

  LCD = (LCD|rs_rw_buffer);     // jetzt werden die Bits RS und RW
                                // wieder an das LCD übertragen

  toggel_en();                  // EN "toggeln" --> high / low
}


Bin halt noch nicht so der "programmierguru".

Ich habe den Resetpin noch nicht angeschlossen da ich nur ein 
neunadriges Kabel habe. Mal sehen....

Auf jeden Fall kann man das Display jetzt an einem Port anschließen.

Ich denke der nächste Schritt wäre das Dispaly per SPI anzuschließen, 
dazu brauch ich aber etwas mehr Zeit!!! :o)

Danke für deine Hilfe und Grüße aus der nähe Heidelberg!!!

Marcel

von Matthias (Gast)


Lesenswert?

Schön das es klappt, man muss bei Ports die nicht Bitadressierbar sind 
sehr aufpassen, wenn man einzelen Pins setzen oder löschen will.

Der Schritt zur SPI-Ansteuerung des Dip-204 ist Überlegung wert, da man 
weitere Pins einsparen kann. Musst ja nur die Senderoutine anpassen und 
den Jumper auf dem Display auf SPI umlöten.

von Martin F. (theo)


Lesenswert?

Hallo Matthias,

danke für die guten Beispiele.

Beim übertragen der Funktion auf einen ATmega32 ist mir aufgefallen, das 
in der Funktion printf_LCD (8Bit mode) ein Fehler steckt. Bei der 
Postitionierung des Cursors muss gemäß Datenblatt des EA DIP204-6 das 
Bit7 zwingend gesetzt sein.

Hier die kleine Änderung dann funktioniert die Positionierung des 
Strings auch fehlerfrei:

lcd_x += lcd_offset;
lcd_x |= _BV(7);    // Set bit 7, siehe Datenblatt LCD DD-RAM Adresse
write_LCD(lcd_x,1); // schreibe Cursorposition
lcd_x ^= _BV(7);    // original x Koordinate wieder herstellen
lcd_x -= lcd_offset;// lcd_offset wieder abziehen zur Weiterverarbeitung

Gruß

Theo

von Matthias (Gast)


Lesenswert?

Danke für den Hinweis:
Ich kann keine Positionierungsfehler finden. Das Bit 7 ist auch immer 
auf 1 gesetzt, wenn der Kursor positioniert wird (weil lcd_offset >= 
0x80 vorher gesetzt wird):
1
  switch (lcd_y) {
2
    case 0:  lcd_offset = 0x80; break;  // Zeile 1
3
    case 1:  lcd_offset = 0xA0; break;  // Zeile 2 
4
    case 2:  lcd_offset = 0xC0; break;  // Zeile 3
5
    case 3:  lcd_offset = 0xE0; break;  // Zeile 4 
6
    default: lcd_offset = 0x80;         // Zeile>4
7
  }
8
  write_lcd(lcd_x+lcd_offset,1);        // Kursorposition setzen

Oder meinst Du was anderes?

Matthias

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.