Zwei LCD Module über parallele Schnittstelle anspr

Hallo,

ich habe zwei 20x2 LCD Module mit paralleler Schnittstelle und HD44… Controller geschenkt bekommen und möchte diese beiden „gleichzeitig“ über den parallelen Port ansteuern. Dazu habe ich nur 4Bits je Modul zur Verfügung. Wie kann ich dann eine Aufteilung der normalen 8Bitbreite in 4Bits realisieren?

Ich möchte die Module unter C ansprechen, jedes einzelen für sich läuft, aber beide zusammen…
Falls Ihr noch weiter infomrationen benötigt, einfach melden!

Für Eure Hilfe schon mal recht herzlichen Dank.

Grüße
Robert

Hallo Robert,

ich habe gerade auch mit LCD-Displays herumexperimentiert. Ich lasse sie unter Visual Basic auch am Parallelport im 4-bit Modus laufen. Wenn es dich interessiert, dann findest du die Ergebnisse meiner Experimente unter www.12move.de/home/hanskrause.
Nun zu deiner Frage.
Du kannst die beiden Module gleichzeitig betreiben, wenn du die 4 Datenleitungen jedes Moduls an die Datenleitungen des Ports anschliesst. Also LCD 1 an D0…D3 und LCD 2 an D4…D7. Nun brauchst du noch die RS,RW und Enable Signale. Die kannst du dir auch aus der Parallelen Schnittstelle von den Signalen STROBE (PIN 1 vom Parallelenport), Auto-Feed (PIN 14) und PRINTER INI (PIN 16) holen. Diese Ausgänge kannst du über das Adresseregister 37AH ansprechen. Die Steuersignale der beiden LCD’s schliesst du parallel auf diese Pins an und bedienst sie damit gleichzeitig mit den Steuersignalen. Wie du diese Signale bedienen musst kannst du dir auf meiner homepage abgucken (bei der Ansteuerung der LCD’s im 8 bit Modus).
Falls die Signale aus dem Druckerport zu schwach sein sollten um beide LCD’s anzusteuern würde ich dir empfehlen, dir eine Lochrasterplatine mit ein paar TTL-Treibern dazwischen zu schalten. Ich würde das auf jeden Fall tun.
Nun zum Programm. Du musst die Daten die zum LCD 1 und zum LCD 2 gehen sollen in 2 nibbles (4 bit) zerlegen und das jeweilige nibble für LCD 1 und LCD2 gleichzeitig auf dem Port (Portregister 378H) ausgeben. Dann setzt du die Steuersignale gleichzeitig (die sind ja parallel geschaltet) für beide LCD’s ab. Das wiederholst du dann mit dem 2 nibble Paar und damit hast du die beiden Datenbytes gleichzeitig an die 2 LCD’s übertragen.
Es erübrigt sich ja wohl zu erwähnen, das du damit völlig unterschiedliche Texte auf den beiden LCD’s anzeigen kannst.

Viel Erfolg wünscht
Hans

Hallo Hans,

Du kannst die beiden Module gleichzeitig betreiben, wenn du
die 4 Datenleitungen jedes Moduls an die Datenleitungen des
Ports anschliesst. Also LCD 1 an D0…D3 und LCD 2 an D4…D7.

Du kannst doch problemlos beide LCD-Module (LCD 1 und LCD 2) an D0…D3 hängen (d. h. D4…D7 völlig unbenutzt lassen), oder sehe ich das falsch? Lediglich das E-Signal braucht jedes LCD-Modul wirklich für sich allein, alles andere kann als Bus ausgelegt sein, d. h. beliebig viele LCD-Module können mit ihren Leitungen „RS“, „R/W“ und „D4…D7“ am selben Bus hängen.

Die Befehlssequenz sollte klar sein: „RS“, „R/W“ und „D4…D7“ für LCD 1 auf den Bus legen, warten bis Signale stabil, dann E-Signal für LCD 1 abfeuern (dabei beachten, daß das E-Signal mindestens 450 ns lang auf H-Pegel liegen muß!). Danach „RS“, „R/W“ und „D4…D7“ für LCD 2 auf den Bus legen, warten bis Signale stabil, dann E-Signal für LCD 2 abfeuern.

Nun brauchst du noch die RS,RW und Enable Signale.

Dazu noch ein Hinweis: Das „R/W“-Signal ist unter bestimmten Voraussetzungen nicht erforderlich. Oft ist das einzige, was man vom LDC-Modul lesen will, das „Busy“-Flag, das anzeigt, ob der Controller im LCD-Modul noch beschäftigt ist oder schon einen neuen Befehl entgegennehmen kann. Aber auch das Lesen des Busy-Flags kann man sich sparen, wenn man dem Controller einfach genug Zeit läßt für alle Befehle, die er abzuarbeiten hat. Die Controller sind unterschiedlich schnell, aber alle haben die meisten Befehle nach 200 µs abgearbeitet; manche Befehle (z. B. „Display löschen“) benötigen jedoch deutlich länger, bis zu 5 ms. Wenn man es so einrichtet, daß der Controller immer ausreichend Zeit für seine Geschäfte hat, dann erübrigt sich die Abfrage des „Busy“-Flags. Wenn man auch sonst nichts vom Controller zu lesen hat (was ohnehin selten vorkommen dürfte), braucht man ihn nie in den Lese-Modus zu setzen, und das bedeutet, daß man den R/W-Pin in diesem Fall einfach auf Masse schalten kann. Die Sache ist zwar ohne Abfrage des Busy-Flags nicht mehr ganz so schnell, aber das dürfte kaum ins Gewicht fallen.

Mit freundlichem Gruß
Martin

Klar, du hast recht!!!
Hallo Martin,

wie schon gesagt hast du völlig recht mit allem was du in deiner Antwort geschrieben hast.
Manchmal ist man doch etwas blind auf einem Auge .-))

Gruss
Hans

Hallo Martin und Hans,

habe mich sehr über Euren Eifer gefreut.

Nun zu dem Problem:
ich muß einfach pro LCD die Dateneingägne D4 bis D7 anschließen und übertrage einfach zuerst das höherwertige Nibble und dann das niederwertige, um den normalen Zeichenumfang zu realisieren?

D.h.: Datum an Bit D4…D7 anlegen, R/W auf Gnd und R/S auf High, und E auslösen und dann quasi das „lownibble“ an D4 bis D7 anlegen und wieder E auslösen??

Grüße und nochmals Danke

Robert

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Robert,

ich muß einfach pro LCD die Dateneingägne D4 bis D7
anschließen und übertrage einfach zuerst das höherwertige
Nibble und dann das niederwertige, um den normalen
Zeichenumfang zu realisieren?

Richtig !
Übrigens werden auch die Befehlsbytes (cursor home, clear display, lcd Initialisierung, …) auf diese Weise gesendet. Wie die Reihenfolge der Initialisierung abläuft kannst du im Sourcecode meiner Visual Basic Programme anschauen (z.B. lcd_4b2z.frm mit notepad.exe).

D.h.: Datum an Bit D4…D7 anlegen, R/W auf Gnd und R/S auf
High, und E auslösen und dann quasi das „lownibble“ an D4 bis
D7 anlegen und wieder E auslösen??

Fast richtig !
Wie Martin richtigerweise bemerkt hat, kann man R/W fest auf GND legen. R/S schaltet aber zwischen Befehls-und Datenmodus um. D.h. während der Initialisierung oder wenn du Befehle wie cursor home, clear display, usw. sendest, dann ist R/S auf 0. Wenn du Daten ans LCD sendest, dann ist R/S 1. Also du musst R/S schon bedienen, kannst aber das R/S von beiden LCD’s parallel schalten.
Wenn du dir den Source-Code meiner Visual Basic Programme anschaust (z.B. lcd_4b2z.frm mit notepad.exe) dann siehst du bei der sub routine datenclock und cmdclock wie R/S jeweils 1 und 0 ist.

Viel Spass beim programmieren wünscht
Hans