Forum: Mikrocontroller und Digitale Elektronik 7Segmentanzeige


von segm (Gast)


Lesenswert?

Hallo zusammen,

wenn ich eine 7Segmentanzeige über einen kompletten Port eines µC 
anschliesse und maskiere, werden alle 8 Segmente, also inkl. Punkt mit 
maskiert. Nun, ich würde für meine Anwendung den Punkt nicht brauchen 
und den Ausgang anderweitig verwenden. Ich weiß, dass man ihn aus der 
Maskierung weglassen kann. Mein Problem ist aber, der Punkt ist am 4. 
Bit angeschlossen, also nicht am Ausgang 0 oder 7. Somit ist die 
Maskierung wohl etwas aufwendiger, oder ?

von Thomas (Gast)


Lesenswert?

Wieso? Ich würde die entsprechenden Masken in einem konstanten Array 0-9 
ablegen, da ist es doch egal, welche Bits Du maskierst.
Gruß
Thomas

von Peter D. (peda)


Lesenswert?

segm schrieb:
> Somit ist die
> Maskierung wohl etwas aufwendiger, oder ?

Nein, macht keinen Unterschied.


Peter

von segm (Gast)


Lesenswert?

Hi,

hab ich ja so gemacht. Nur kann ich den entsprechenden Ausgang für den 
Punkt nicht mehr ein und ausschalten, weil er als Null maskiert wurde, 
da er ja nicht gebraucht wird. Es wurden ja alle 8bits maskiert.

von segm (Gast)


Lesenswert?

Hallo peter,

und wie muss ich dann da vorgehen ? Bei einer Maskierung werden doch 
immer 8bit berücksichtigt, oder ?

von spontan (Gast)


Lesenswert?

... dann ist was falsch gemacht.

von Peter II (Gast)


Lesenswert?

segm schrieb:
> Hallo peter,
>
> und wie muss ich dann da vorgehen ? Bei einer Maskierung werden doch
> immer 8bit berücksichtigt, oder ?

zeigt doch mal wie du es machst.

von segm (Gast)


Lesenswert?

wieso, es funktioniert ja. alle ziffern werden korrekt angezeigt

von segm (Gast)


Lesenswert?

0x77 für eine 0 und 0x11 für eine 1 usw. das ganze in einem array mit 10 
elementen für die ziffern 0 - 9.

von Peter D. (peda)


Lesenswert?

segm schrieb:
> hab ich ja so gemacht. Nur kann ich den entsprechenden Ausgang für den
> Punkt nicht mehr ein und ausschalten, weil er als Null maskiert wurde,

Dann hast Du ihn nicht maskiert, sondern auf 0 gesetzt.
Maskieren heißt, er bleibt auf seinem alten Zustand.
1
PORTD = PORTD & 1<<PD4 | new_ziffer & ~(1<<PD4);


Peter

von segm (Gast)


Lesenswert?

und wie wäre jetzt der richtige ansatz für das array ?

von oldmax (Gast)


Lesenswert?

Hi
Du  machst es dir scon schwer. In Assemblerwürd ich so vorgehen:
Ausgabe:   .Byte 1    ; Ausgabe
Anzeige:   .Byte 1    ; für 7 Segmentcode
Matrix_0:  .Byte 1    ; Ablage für Zahlenmuster
Matrix_1:  .Byte 1
etc

Ausgabebyte wird immer dem Port übergeben, also mußt du dafür sorgen, 
das dein SChaltausgang nix mit dem 7-Segmentcode zu tun bekommt.
Ausgang war Bit 4, also
1
;*** Schaltbit  aus   ****
2
LDS   R16, Ausgabe
3
ANDI  R16, 0b11101111      ; Schaltbit auf 0, 7-Segmentcode bleibt
4
STS   Ausgabe, R16
5
6
7
;*** Schaltbit  ein   ****
8
LDS   R16, Ausgabe
9
ORI   R16, 0b00010000      ; Schaltbit auf 1, 7-Segmentcode bleibt
10
STS   Ausgabe, R16
Angenommen, du hast in einer Matrix den 7-Segmentcode hinterlegt, dann 
musst du die Matrix ja auf das Ausgabebyte übertragen, ohne das 
Schaltbit zu verändern. Also machst du bei der Variablen Ausgabe alle 
Bits bis aufs Schaltbit aus
1
LDS   R16, Ausgabe
2
ANDI  R16, 0b00010000      ; 7-Segmentcode aus, Schaltbit bleibt
3
STS   Ausgabe, R16

Nun löscht du das Bit 4 in der Mattrix, falls da was drin stehen sollte
1
LDS   R17, Matrix_x
2
ANDI  R17, 0b11101111      ; pos. Schaltbit aus, Matrix bleibt
3
OR    R16, R17             ; Matrix und Schaltbit zusammenführen
4
STS   Ausgabe, R16
5
6
; irgendwann weist du dann den Port zu
7
LDS  R16, Ausgabe
8
OUT  Portx, R16
So hast du die Ausgabe an einer Stelle, unabhängig, wo du die Bits in 
die Variable bastelst.
Gruß oldmax

von segm (Gast)


Lesenswert?

ich kann grad mal ein bisschen C, von assembler ganz zu schweigen ;-)

von Bastler (Gast)


Lesenswert?

Dann mach's doch mit dem Array, mensch.
1
unsigned char get7[10] = {0b10110111, 0b....., ....};
dadrin sind dann deine Segmentmuster. Das vierte Bit kannst du immer auf 
0ß oder 1 setzen, ist ja wurscht. Und dann weiter wie Peter schon 
schrieb.

von sandman (Gast)


Lesenswert?

Du meinst mit diesem hier:

PORTD = PORTD & 1<<PD4 | new_ziffer & ~(1<<PD4);

wasi ist mit new_ziffer gemeint

von Bastler (Gast)


Lesenswert?

Das ist das neue Bitmuster.

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.