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
Hallo Gerhard, und, wie schaut´s aus ? Mit dem Übersetzen nach "C" ? Kann ich helfen oder hattest Du nur noch keine Zeit? Gruß Stephan
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.