LCD EA DIP204 KS0073 4-Bit, 8-Bit und serielle C-Routinen

Gast #653970
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
Angehängte Dateien:
#675667
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
#676714
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
Gast #676744
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.
#704896
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
Gast #705396
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

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