Hier ist ein kleiner Beitrag zu einem seriellen LCD/Keypad Interface mit
nur drei Leitungen.
(Ich hoffe es ist nicht der Schnee vom letzten Jahr;-) )
Die Funktionsweise ist wie folgend beschrieben:
Der Controller sendet die LCD Daten im Nibble Format zum HD44780.
LCD-Strobe Betrieb ist wie üblich. Datenleitungen QG/QH steuern den MUX
input des Keypad Treibers mit dem 4052.
Die Datenleitung ist als Open Drain konfiguriert so dass nach jeden
Daten Byte zum 74HC164 die Datenleitung als Input umgeschaltet wird um
den Schaltzustand einlesen zu können.
Bei jeden Datenbyte zum LCD werden die MUX Eingänge nach der Reihe
umgeschaltet so dass die C0-C3 Eingänge nacheinander zwischen jedem LCD
update gelesen werden können. Da der ROW Treiber die ROW Leitungen nur
einzeln auf Masse legt macht es nichts aus wenn mehr als eine Taste
gedrückt wird und machen Entkopplungsdioden überflüssig. Alle nicht
aktiven ROW Leitungen bleiben hochohmig.
R1 entkoppelt die Keypad von der Datenleitung so dass das Drücken der
Tasten beim Senden nichts ausmacht.
R2 ist ein Pull-Up für die Tasten sollte der Controller keine
eingebauten Pull-Ups haben.
Die Beschaltung der LCD Backlight Dioden wurde nicht eingezeichnet.
Diese Anordnung hat den Vorteil dass die Keypad zwischen dem Senden der
LCD Daten bearbeitet werden kann. Wenn nichts zum LCD gesendet werden
muss, lässt man einfach die LCD-STROBE in Ruhe und sendet zum Scannen
der Keypad nur die QG und QH Bits. (Diese Schaltung arbeitet mit Peter
Daneggers Key Matrix Entprellroutine einwandfrei. An der prinzipiellen
Arbeitsweise ändert sich nichts.)
Daten Diagramm:
OUTP INP OUTP INP OUTP INP OUTP INP (Port Data Dir.)
__^^^^^^^^____^^^^^^^^_____^^^^^^^^_____^^^^^^^^_______^^^... (CLOCK)
---------- ----------- ------------ ------------ --------
U U U U ... (LCD-E)
__XXXXXXLL....XXXXXXHL.....XXXXXXLH.....XXXXXXHH.......XXX... (DATA)
LCD #1 | | LCD #2 | | LCD #3 | | LCD #4 | |
----------Keys--------Keys----------Keys---------Keys--(Column Bits
Data)
R0C0 R0C1 R0C2 R0C3 R1C0 ... R1C1...
Nach senden von 16 LCD Daten-Nibbles hat man die gesamte Keypad gelesen
Die Komplexität der Steuerroutine hielt sich in Grenzen und ich werde in
Kürze einen Beispiel Code beisteuern.
mfg,
Gerhard
Hallo Gerhard,
die Idee ist grundsätzlich nicht schlecht. Aber wo gehen denn DB0-DB3
vom Diplsay hin ? Für 4 Bit LCD gibts ja sogar 1 oder 2 wire Lösung mit
ner Diode und einem Schieberegister. Nur mal informatorisch. Ich hätte
den Link gern angehägt, finde den aber nicht. Evtl. stammt die Idee
sogar aus dem 8051 Applikationskochbuch.
Aber, was hindert Dich daran das Keypad direkt auf die gleichen
Leitungen zu legen wie das Display ? Schon mal drüber nachgedacht ?
Sofern Dein Display nur zur Runtime beschrieben wird, können die 8
momentan brach liegenden Leitungen anderweitig zB. als Input benutzt
werden. Das geht aber nur dann easy, wenn das Display nicht wie bei mir,
in der ISR beschrieben wird.
Guter Ansatz, mit Sparpotential.
Weiter so.
Gruß
Stephan
Hallo Stephan!
die DB0-3 bleiben unbenutzt und sind nicht angeschlossen.
Stephan Henning schrieb:> Hallo Gerhard,>> die Idee ist grundsätzlich nicht schlecht. Aber wo gehen denn DB0-DB3> vom Diplsay hin ? Für 4 Bit LCD gibts ja sogar 1 oder 2 wire Lösung mit> ner Diode und einem Schieberegister.
Ich wollte eigentlich keine "Trickschaltung" verwenden. Eine 1-Draht
Lösung habe ich mir auch schon ausgedacht; nur gefallen mir solche
Trickschaltungen weniger weil man dann weniger Spielraum mit den
Daten-Timings hat. Irgendwie ist mir was Solides lieber.
> Nur mal informatorisch. Ich hätte> den Link gern angehägt, finde den aber nicht. Evtl. stammt die Idee> sogar aus dem 8051 Applikationskochbuch.
Das Buch kenne ich (noch) nicht.
>> Aber, was hindert Dich daran das Keypad direkt auf die gleichen> Leitungen zu legen wie das Display ? Schon mal drüber nachgedacht ?
So habe ich es früher schon öfters gemacht. Ich wollte hier
hauptsächlich Leitungen zu einer Frontplatte einsparen.
> Sofern Dein Display nur zur Runtime beschrieben wird, können die 8> momentan brach liegenden Leitungen anderweitig zB. als Input benutzt> werden. Das geht aber nur dann easy, wenn das Display nicht wie bei mir,> in der ISR beschrieben wird.
Apropos ISR Berieb! Da hätte ich eine Frage: Wenn man das LCD im
(gepufferten) Interrupt-betrieb beschreibt, dann müsste man auch die LCD
Kommandos einbetten so dass der RS-pin entsprechend für Befehle
gesteuert werden kann. Wie hast Du das verwirklicht? Verwendest Du für
solche Kommandos ESC Sequenzen ähnlich wie die damaligen EPSON Drucker?
Das interessiert mich brennend weil ich gerne mal einen gepufferten LCD
Betrieb realisieren möchte. Ich glaube nicht dass das zu schwierig sein
dürfte.
> Guter Ansatz, mit Sparpotential.>> Weiter so.
Danke für die Kritik und Interesse.
Gruß,
Gerhard
>> Gruß>> Stephan
Hallo Gerhard,
wegen der datenleitungen habe ich nur gefargt, da die auf den Buss
gehen, aber am Bus kein GND zu sehen ist. Das die da leigen war mir
schon klar.
Ich habe irgendwo noch ein Stück Bus vermisst aus welchem hervor geht
das die auf GND gehen. Als Label im Plan unter Eagle kein Problem, aber
ausgedruckt nicht erkennbar. Nur mal so nebenbei.
nee nicht so kompliziert. Der Displayinhalt liegt 1:1 im RAM als ASCI
Code. Daher kannst Du Deine Rechenwerte, was auch immer, einfach da rein
legen.
Die ISR ist so ausgelegt das je nach Anzahl Zeichen und Zeilen 3-4
Aktualisierungen des Display/Minute erfolgen.
In der ISR wird je Durchlauf immer nur ein Zeichen an das Display
gesendet. Die minimale Freequenz der ISR entspricht der max.
Verarbeitunsgzeit des Displaycontrollers (Busy Time)
Daher spart man sich das Abfragen des Busy Flags.
Bein Init des Display gehe ich ganz prgmatisch ran und nehme die
maximale Verarbeitungszeit wobei ich auch die ISR nutze nur einen
zusätzlichen Zähler um die Zeit zu verlängern
Die Werte (egal ob Steuer oder Nutzdaten) lege ich einfach in den
reservierten RAM Bereich ab und übergebe nur mit einem Flag ob es sich
um Steuer oder Programmdaten handelt. Das wars auch schon. Die
Zeilenumschaltung macht die ISR auch noch nebenbei.
Die Idee stammt auch aus dem o.g. Buch, Die Umsetzung ist aber von mir.
Der Eine oder Andere mag das sicher kürzer oder effizienter machen, aber
ich verdiene damit ja auch nicht meine Brötchen.
Fall Du 8051 ASM etwas lesen kannst das Listing als Auschnitt dabei.
In den Tabellen ist gut zu sehen das es sich sowohl um Nutz als auch
(tabelle_init) um Steuerdaten handelt.
Gruß
Stephan
die Dateien aus Wordpad als RTF wegen der Formatierung uns Lesbarkeit.
Hallo Stephan,
vielen Dank für Deine ausführlichen Details und Deine gute Beschreibung
dazu. Ich gebe Dir recht, ich dachte etwas zu kompliziert bzgl. des
Nutzen der ESCAPE Codes. Ein RAM LCD Puffer reicht hier vollständig aus.
Das sieht man mal wieder wie gut es sein kann wenn jemand mitdenkt.
Werde das mal in C ausprobieren. Dieses Konzept ist auf alle Fälle recht
einfach zu verwirklichen.
Die DB0-3 Leitungen sind nicht an Masse oder Vdd angeschlossen weil der
Controller das lt. Datenblatt schon intern macht und auf Masse legen
kann bis zwischen 200uA bis 1mA extra Strom kosten. .
https://www.sparkfun.com/datasheets/LCD/HD44780.pdf
Seite 51:
Pull-up MOS current
(DB0–DB7, RS, R/W)
–Ip 50 125 250 uA VCC = 5 V
Gruß,
Gerhard