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 ?
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
segm schrieb: > Somit ist die > Maskierung wohl etwas aufwendiger, oder ? Nein, macht keinen Unterschied. Peter
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.
Hallo peter, und wie muss ich dann da vorgehen ? Bei einer Maskierung werden doch immer 8bit berücksichtigt, oder ?
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.
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.
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
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
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.
Du meinst mit diesem hier: PORTD = PORTD & 1<<PD4 | new_ziffer & ~(1<<PD4); wasi ist mit new_ziffer gemeint
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.