Forum: Projekte & Code Serielles LCD/Keypad Interface


von Gerhard O. (gerhard_)


Angehängte Dateien:

Lesenswert?

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

von Stephan H. (stephan-)


Lesenswert?

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

von Gerhard O. (gerhard_)


Lesenswert?

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

von Stephan H. (stephan-)


Angehängte Dateien:

Lesenswert?

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.

von Gerhard O. (gerhard_)


Lesenswert?

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

von Stephan H. (stephan-)


Lesenswert?

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
Noch kein Account? Hier anmelden.