Denke zu kompliziert > 7-Segment Multiplexanzeige
Ich spiele gerade mit einer gemultiplexten 7-Segmentanzeige herum. Ich möchte im Endeffekt eine 4stellige Variable auf die Anzeige bekommen.
Bild hier
(PortD setzt die Segmente, PortB.0-3 die gemeinsamen Kathoden)
...aber der Code ist gruselig
Die Einer-Stelle wird (vorerst fest) gesetzt, springt in eine Sub, die Kathode für die erste Stelle wird dort gesetzt, nach Zahlvergleich wieder Sprung in eine andere Sub, wo die entsprechenden Segmente gesetzt werden, danach wird die Kathode wieder ausgeschaltet
Zehner-Stelle wird gesetzt......usw.
Das Prinzip ist mir klar und funktioniert auch...aber laut eigener Betrachtung viel zu umständlich. Hat Jemand `nen Tipp für mich für Vereinfachung ?
Code:
$regfile = "m8def.dat"
$crystal = 8000000
Config Portd = Output
Config Portb = Output
Dim E As Byte 'einer
Dim Z As Byte 'zehner
Dim H As Byte 'hunderter
Dim T As Byte 'tausender
Dim X As Byte 'Zeit (ms), wielange Kathoden ein
X = 1
Do
E = 6 'Beispielzahl Einer
Gosub E:
Z = 5 'Beispielzahl Zehner
Gosub Z:
H = 4 'Beispielzahl Hunderter
Gosub H
T = 7 'Beispielzahl Tausender
Gosub T
Loop
End
E:
Portb.0 = 1 'Kathode Einer ein
If E = 0 Then Gosub 0
If E = 1 Then Gosub 1
If E = 2 Then Gosub 2
If E = 3 Then Gosub 3
If E = 4 Then Gosub 4
If E = 5 Then Gosub 5
If E = 6 Then Gosub 6
If E = 7 Then Gosub 7
If E = 8 Then Gosub 8
If E = 9 Then Gosub 9
Waitms X
Portb.0 = 0 'Kathode Einer aus
Return
Z:
Portb.1 = 1 'Kathode Zehner ein
If Z = 0 Then Gosub 0
If Z = 1 Then Gosub 1
If Z = 2 Then Gosub 2
If Z = 3 Then Gosub 3
If Z = 4 Then Gosub 4
If Z = 5 Then Gosub 5
If Z = 6 Then Gosub 6
If Z = 7 Then Gosub 7
If Z = 8 Then Gosub 8
If Z = 9 Then Gosub 9
Waitms X
Portb.1 = 0 'Kathode Zehner aus
Return
H:
Portb.2 = 1 'Kathode Hunderter ein
If H = 0 Then Gosub 0
If H = 1 Then Gosub 1
If H = 2 Then Gosub 2
If H = 3 Then Gosub 3
If H = 4 Then Gosub 4
If H = 5 Then Gosub 5
If H = 6 Then Gosub 6
If H = 7 Then Gosub 7
If H = 8 Then Gosub 8
If H = 9 Then Gosub 9
Waitms X
Portb.2 = 0
Return 'Kathode Hunderter aus
T:
Portb.3 = 1 'Kathode Tausender ein
If T = 0 Then Gosub 0
If T = 1 Then Gosub 1
If T = 2 Then Gosub 2
If T = 3 Then Gosub 3
If T = 4 Then Gosub 4
If T = 5 Then Gosub 5
If T = 6 Then Gosub 6
If T = 7 Then Gosub 7
If T = 8 Then Gosub 8
If T = 9 Then Gosub 9
Waitms X
Portb.3 = 0 'Kathode Tausender aus
Return
0:
Portd = &B00111111 '0
Return
1:
Portd = &B00000110 '1
Return
2:
Portd = &B01011011 '2
Return
3:
Portd = &B01001111 '3
Return
4:
Portd = &B01100110 '4
Return
5:
Portd = &B01101101 '5
Return
6:
Portd = &B01111101 '6
Return
7:
Portd = &B00000111 '7
Return
8:
Portd = &B01111111 '8
Return
9:
Portd = &B01101111 '9
Return
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für das Datenblatt, werde die Anschlüsse gelich mal vergleichen.
Willst Du nur die Segmente ohne Punkt ansteuern ein Tipp von mir:
Du kannst das ganze auf nur einem Port realisieren, wenn Du eine 7-Segment Decoder verwendest. Dann brauchst Du nur 4-Bit zur Darstellung der Zahl und hast die anderen 4-Bit für die Dezimalstellen frei.
Dann solltest Du für den Übergang der einzelnen Stellen ein gewisses Timing einhalten, um zu verhindern, dass die Segmente (kurzzeitig) noch aktiv sind, wenn die Stelle gewechselt wird. Schau mal in die Zeichnung im Anhang.
Liste der Anhänge anzeigen (Anzahl: 1)
Leider sind unsere Displays doch nicht gleich belegt.
Falls Du später mal mit Eagle was aufbauen willst,
ich habe unsere Anzeigen mal in einer LIB aufgebaut...