Hallo ,
ich benutze eine etwas modifizierte Routine von Wolfgang Schwarz
( http://www.black-strom.de.vu ), der sowas für seine Uhr verwendet hat, schaut's euch mal an:
[Ich hab nur die relevanten Zeilen rauskopiert]
Code:
Dim Stelle_1 As Byte
Dim Stelle_2 As Byte
Dim Stelle_3 As Byte
Dim Stelle_4 As Byte
'Ausgänge:
Segment_a Alias Portb.0
Segment_b Alias Portb.1
Segment_c Alias Portb.2
Segment_d Alias Portb.3
Segment_e Alias Portb.4
Segment_f Alias Portb.5
Segment_g Alias Portc.0
Ziffer_1 Alias Portc.1
Ziffer_2 Alias Portc.2
Ziffer_3 Alias Portc.3
Ziffer_4 Alias Portc.4
Config Timer0 = Timer , Prescale = 1024
On Timer0 7segment
Const Timervorgabe = 200
Do
'Anfang Hauptschleife
Stelle_1 = 4
Stelle_2 = 3 'was angezeigt werden soll ...
Stelle_3 = 2
Stelle_4 = 1
Loop 'Ende Hauptschleife
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Interrupt-Routine für Ziffer ausgabe im 7 Segmentcode
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' Bei jedem Aufruf wir nur eine Ziffer ausgegeben, d.h nur eine Anzeige wird
' angesteuert. Die anderen bleiben dunkel. Bei jedem Aufruf wird eine Anzeige
' weitergeschaltet.
'
' Anzeigen anordnung
'
' 1111 2222 3333 4444
' 1 1 2 2 3 3 4 4
' 1111 2222 3333 4444
' 1 1 2 2 3 3 4 4
' 1111o 2222o 3333o 4444o
'
' ^-- Dezimalpunkt
' ^---- 4. Ziffer | Minute Low Wert | Variable Zl_minute
' ^---------- 3. Ziffer | Minute High Wert | Variable Zh_minute
' ^----------------- 2. Ziffer | Stunde Low Wert | Variable Zl_stunde
' ^----------------------- 1. Ziffer | Stunde High Wert | Variable Zh_stunde
7segment:
Timer0 = Timervorgabe
If Temp_ziffer = 4 Then Temp_ziffer = 0 'bestimmt die auszugebende Ziffer (1 bis 4)
Incr Temp_ziffer 'bei jedem aufruf des Lable wir eine andere Ziffer ausgegeben
Select Case Temp_ziffer 'welche Ziffer soll angesteuert werden
Case 1 : Ziffer_1 = 0 '1. Ziffer
Ziffer_2 = 1
Ziffer_3 = 1
Ziffer_4 = 1
Bcd_aus = Stelle_1
Case 2 : Ziffer_1 = 1 '2. Ziffer
Ziffer_2 = 0
Ziffer_3 = 1
Ziffer_4 = 1
Bcd_aus = Stelle_2
Case 3 : Ziffer_1 = 1 '3. Ziffer
Ziffer_2 = 1
Ziffer_3 = 0
Ziffer_4 = 1
Bcd_aus = Stelle_3
Case 4 : Ziffer_1 = 1 '4. Ziffer
Ziffer_2 = 1
Ziffer_3 = 1
Ziffer_4 = 0
Bcd_aus = Stelle_4
End Select
'Ermittelt aus der Segmentfolge-Tabelle den 7 Segmentcode für die auszugebende Zahl
Select Case Bcd_aus
Case 1 : Ausgang = Lookup(1 , Segmentfolge)
Case 2 : Ausgang = Lookup(2 , Segmentfolge)
Case 3 : Ausgang = Lookup(3 , Segmentfolge)
Case 4 : Ausgang = Lookup(4 , Segmentfolge)
Case 5 : Ausgang = Lookup(5 , Segmentfolge)
Case 6 : Ausgang = Lookup(6 , Segmentfolge)
Case 7 : Ausgang = Lookup(7 , Segmentfolge)
Case 8 : Ausgang = Lookup(8 , Segmentfolge)
Case 9 : Ausgang = Lookup(9 , Segmentfolge)
Case 0 And Temp_ziffer = 1 : Ausgang = Lookup(10 , Segmentfolge) 'Nullstellenunterdrückung bei der ersten Ziffer
Case 0 And Temp_ziffer > 1 : Ausgang = Lookup(0 , Segmentfolge) 'wenn nicht erste Ziffer Null anzeigen
End Select
'Ausgabe des 7 Segmentcodes (Invertierend [Not] bei Anz. mit gem. Anode)
Segment_a = Ausgang.0 'Segment A
Segment_b = Ausgang.1 'Segment B
Segment_c = Ausgang.2 'Segment C
Segment_d = Ausgang.3 'Segment D
Segment_e = Ausgang.4 'Segment E
Segment_f = Ausgang.5 'Segment F
Segment_g = Ausgang.6 'Segment G
Return
End 'Programm Ende
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
' 7 Segmentcode - Tabelle
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'
' --A--
' | |
' F B
' | |
' --G--
' | |
' E C
' | |
' --D--
Segmentfolge: 'GFEDCBA / "1" Segment AN
Data &B0111111 '0
Data &B0000110 '1
Data &B1011011 '2
Data &B1001111 '3
Data &B1100110 '4
Data &B1101101 '5
Data &B1111101 '6
Data &B0000111 '7
Data &B1111111 '8
Data &B1101111 '9
Data &B0000000 'leeres Feld (zur Nullstellenunterdrückung)
Lesezeichen