www.mikrocontroller.net

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


Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Marcel K. (viewer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marcel K. (viewer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin F. (theo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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):
  switch (lcd_y) {
    case 0:  lcd_offset = 0x80; break;  // Zeile 1
    case 1:  lcd_offset = 0xA0; break;  // Zeile 2 
    case 2:  lcd_offset = 0xC0; break;  // Zeile 3
    case 3:  lcd_offset = 0xE0; break;  // Zeile 4 
    default: lcd_offset = 0x80;         // Zeile>4
  }
  write_lcd(lcd_x+lcd_offset,1);        // Kursorposition setzen

Oder meinst Du was anderes?

Matthias

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.