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...
Liste der Anhänge anzeigen (Anzahl: 2)
Also das hat mir jetzt keine Ruhe gelassen
Hier der Source:
Code:
' 4-Digit Multipexed Display an Port C
' PortC.4 = 1er
' PortC.5 = 10er
' PortC.6 = 100er
' PortC.7 = 1000er
' Portc.0 bis Portc.3 = BCD Code der Zahl &H00 bis &HFF
' Hierzu einen 7-Segmentdecoder (74LS48) zwischen PortC(0..3) und den Segmenten schalten
' Nicht vergessen die Treibersegmentausgänge mit 470R PullUp zu schalten.
' Der Baustein 74LS48 kann nur Zahlen (0-9) darstellen heine Hex Codes (ABCDEF)
' Falsche Werte (>9) (>&H09) (>&B00001001) führen zu Anzeigefehlern.
$regfile = "m32def.dat" ' AT Mega 32
$crystal = 16000000 ' 16 MHz
$baud = 19200 ' Serielle Schittstelle einrichten
Anzeigeport Alias Portc ' Hier einstellen an welchem Port
' das Display angeshclossen wird
Config Anzeigeport = Output ' Direction einstellen
Declare Function Anzeige(byval B_speed As Byte) As Integer
Dim X As Integer ' Variable für For Scheife
Dim Y As Integer ' Variable für For Scheife
Dim B_ar_zahl(4) As Byte
Portc = 0 ' Port C initialisieren
' Die Anzeige soll "4321" darstellen
B_ar_zahl(1) = 1 ' Hier die 1er Zahlen der Anzeige
B_ar_zahl(2) = 2 ' Hier die 10er Zahlen der Anzeige
B_ar_zahl(3) = 3 ' Hier die 100er Zahlen der Anzeige
B_ar_zahl(4) = 4 ' Hier die 1000er Zahlen der Anzeige
Do
For Y = 0 To 9
X = Anzeige(5)
Next Y
Loop
End 'end program
' ******************************************************************************
Function Anzeige(byval B_speed As Byte) As Integer
Dim B_x As Byte ' Schleifen Variable
Dim B_decade As Byte ' Aktivierung der Decade
Dim B_select As Byte
For B_x = 4 To 7 ' Schleife für Decaden
' Bit 4 bis 7 sind Decaden
B_decade = 2 ^ B_x ' Bitmuster für Decade berechnen
B_select = B_x - 3 ' Feld des Array's bestimmen
Anzeigeport = B_decade ' Nur Decade aktivieren
Anzeigeport = Anzeigeport Or B_ar_zahl(b_select)
' Decade + Anzeigewert aktivieren
' Hiermit wird auch das Anzeigetiming
' realisiert
Waitms B_speed ' Anzeigedauer der einzelnen Decade
Next B_x
Anzeige = 0 ' Rükgabewert 0 = ok
End Function
' ******************************************************************************
End 'end program
Dann noch der Schaltplan für Dein IC
und der Beweis dass es geht....