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
@ 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
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.
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.