Display mit 160 Segmenten refreshen. Wie? Struct?

Gast #2335699
Lesenswert?

Hallo zusammen!

Ich habe hier ein Display, welches 160 Segmente besitzt. Auf dem LCD 
sind Zahlen und Symbole, welche wiederum aus ihren einzelnen Segmenten 
bestehen.

Um das komplette Display zu aktualisieren, muss man also 160 Bit 
hinschicken und dann reinlatchen.

Aber wie macht man das am besten? Also quasi eine Variable mit 160Bit...

Mit einem Struct, welches man als Pointer einfach Bit für Bit 
abarbeitet? Ich habe momentan noch ein kleines Versätndnisproblem, wie 
es mit den Zahlen ist, also wenn ich beispeilsweise eine einzelne Zahl 
anzeigen will.

Quasi so:


Zahl 8 :              X  X  X  X  X  X  X
Segment:  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 ...

Wie kann ich denn jetzt am sinnvolsten genau disen Bereich in meinen 
160Bit manipulieren?


Hat da jemand schonmal was ähnliches gehabt?
#2335713
Lesenswert?

Hallo,

es gibt (wie eigentlich überall) mehrere Möglichkeiten:

A) Die Aufbereitung der Daten (Ziffern & Symbole) erfolgt im 
Hauptprogramm. Dann musst deine Routine (im Unterprogramm) nur noch die 
160 Bits aus dem Speicher lesen (sorry, bin Assemblerprogrammierer) und 
zum Display übertragen. Dies hätte den Vorteil, dass die Daten schnell 
zum Display geschickt werden können und die Übertragungsroutine z.B. per 
Timerinterrupt aufgerufen werden könnte.

Ich denke aber folgende Methode ist für dich geeigneter:

B) Du legst dir einen Speicherbereich (ein Array) an, wobei jedes 
Element für eine komplette Ziffer steht (oder für 8 Symbole). Wenn du 
dann das Display updaten willst, dann kostet das etwas Rechenleistung, 
weil du für jedes Bit, welches du überträgst, nachsiehst, ob das 
entsprechende Segment an oder aus ist.

Beispiel:
Zahl 8 :              X  X  X  X  X  X  X
Segment:  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 ...

Du willst das Bit für das Segment 5 senden, also schaust du nach, ob in 
dem Speicher für diese Ziffer das entsprechende Bit für das Segment an 
oder aus ist. Und dann sendest du entsprechend eine 1 oder 0.

Hoffe das hilft fürs Erste...

Gruß,
Thomas
Gast #2335725
Lesenswert?

Einige Randbedinungen musst du schon festlegen.

Deine Segmente unterteilst du in struct Arrays und legst dir einen 
passenden Schriftsatz an.

Passend dazu schreibst du dir eine Funktion welche gezielt einen 
eingeteilten Segmentbereich mit einen beliebigen Zeichen beschreibt bzw.
die entsprechenden Teile deines struct Arrays beschreibt.

Gleichzeitig schreibst du dir eine Funktion welche das komplette
Display aktualisiert.


Aber:
Was ist das eigentlich für ein Display? Vorallen, wie habe ich mir
"160 Segmente" vorzustellen?
#2335733
Lesenswert?

Deet schrieb:
> Byte-Array OK, aber eine Ziffer geht halt auch mal über ein Byte hinaus,
> daher die Frage, wie ich das realisieren könnte?

In diesem Falle musst Du natuerlich die Bits in zwei Bytes manipulieren.
Zu manipulierendes Bit = X
Betrifft Byte Y = floor(X/8)
Betrifft Bit Z = X-(8*Y)

Es wird natuerlich jeweils bei 0 angefangen zu zaehlen. Und dann wird 
Bit Z in Byte Y durch eine bitweise Operation gesetzt oder nicht 
gesetzt.

Volker
Gast #2335811
Lesenswert?

Nachtaktiver schrieb:
> Dann habe ich ein wenig Mist von mir gegeben. Hatte an ein Klassischen
> Graphisches LCD gedacht.

Nee leider nicht :-( Und das Problem ist halt, dass es nicht eine Ziffer 
pro Byte ist, sondern die fortlaufend durchgehen von Segment 1 bis 160.

Danke schonmal für eure Rückmeldungen, das muss ich mir jetzt mal zu 
Gemüte führen.
#2335968
Lesenswert?

- leg ein Array von 20 Byte (= 160 Bit) an.
- erstelle eine Funktion, die das Array ans LCD ausgibt
- erstelle eine Funktion, die ein Segment in diesem Array setzt oder 
löscht

Diese Funktion rufst Du dann entsprechend der Ziffer für jedes Segment 
auf.
Dazu ist ein weiteres Array (im Flash) nötig, welches das Segmentmuster 
pro Ziffer oder Zeichen enthält.

Oftmals sind die Segmente eines Digits in gleicher Order, dann kannst Du 
mit dem Digit-Offset auswählen, an welche Stelle die Ziffer kommt.


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren