So läuft es ich habe noch einige Fehler entdeckt und korrigiert, Stelle 4 war auf PD5 anstatt auf PD4 und die Tabelle war das ein oder andere Bit falsch für die Ziffern Darstellung.
Deine Beschreibung habe ich etwas geändert.
Code:
'BASCOM Demo Version 2.0.7.5
'
'Multipexen einer 4-stelligen, 7 Segment Anzeige mit gemeinsamer Kathode
'zB µC Atmega16
'Dargestelt wird die Zahl 2017
'
'by Searcher im 26.02.2017
'Hardware auf Stekboard getestet.
'
'In Anlehnung an Zeichnung http://rn-wissen.de/wiki/index.php?title=Datei:Siebensegment_4fach_Multiplexing_V2.png'
'auf http://rn-wissen.de/wiki/index.php?title=Siebensegmentanzeige#Multiplexing
'
'Verschaltung am Atmega16
'PD1 über Transistor an Kathode Stelle 1
'PD2 über Transistor an Kathode Stelle 2
'PD3 über Transistor an Kathode Stelle 3
'PD4 über Transistor an Kathode Stelle 4
'Dezimalpunkt (dp) nicht genutzt
'PB6 an Segment a
'PB5 an Segment b
'PB4 an Segment c
'PB3 an Segment d
'PB2 an Segment e
'PB1 an Segment f
'PB0 an Segment g
'
'Zur Darstellung der Ziffer 0 an der ersten Stelle der 4 X 7 Segment Anzeige
'muß die Kathode Stelle 1 und die Segmente a, b, c, d ,e, f angesteuert werden.
'Nach dem Stromlauf müssen die entsprechenden Segmente ein HIGH vom µC bekommen.
'Grundzustand: alle Portpins auf 0 -> Anzeige komplett aus.
'PB0, PB1, PB2, PB3, PB4, PB5 auf "1" setzen. PB6 (Segment g auf "0")
'Segmente sind nun zum Einschalten vorbereitet.
'
'Da die Stellen über einen NPN Transistor angesteuert werden, muß bei Ansteuerung
'der Stellen die Basis des Transistors auch ein HIGH vom µC ausgegeben werden damit die
'Kathode der 7-Segment-Anzeige ein GND bekommt. Also für die erste Stelle den PD1 auf "1",
'die anderen auf "0". Vorbereitete Segmente sind nun eingeschaltet und Ziffer 0
'wird nun an erster Stelle der 4 X 7 Segment Anzeige angezeigt.
'
'Soll die Ziffer 0 an der zweiten Stelle der 7-Segment Anzeige angezeigt werden, wird
'PD1 auf "0" gesetzt (Stelle 1 ausgeschaltet), dann die Segmente für die Ziffer 0 gesetzt,
'die ja die gleichen Segmente und Portpins wie für Stelle eins sind, und dann
'PD2 auf "1" setzen. Ziffer 0 wird an Stelle 2 angezeigt.
'
'Ziffer 1 auf Stelle 3 anzeigen: PD2 auf "0", alle Segment Pins PB0..PB6 mit Pattern
'für Ziffer 1 überschreiben. Segment Pins PB1, PB2 auf "1", die anderen PBs auf "0". Dann PD3 auf "1".
'u.s.w
$Regfile="m16def.dat"
$Crystal=8000000
$hwstack=40
$swstack=16
$framesize=32
Dim Zahl As Word
Dim Hilfs_variable As Word
Dim Dezimalziffern(4) As Word
Dim Stelle As Byte
DDRB = Bits(pb6 , Pb5 , Pb4 , Pb3 , Pb2 , Pb1 , Pb0) 'Portpins für Segmente als Ausgang
DDRD = Bits(pd1 , Pd2 , Pd3 , Pd4) 'Portpins für die Stellen als Ausgang
Config Timer0 = Timer , Prescale = 8 'Overflow Interrupts mit ca. 488Hz bei 1MHz Systemtakt
On Ovf0 Isr_multiplex 'in der Overflos Interrupt Service Routine wird die Anzeige geschaltet
Enable Ovf0
Zahl = 2017 'Diese Zahl soll in der Anzeige erscheinen
'Den Inhalt der Variablen Zahl, der als Binärzahl gespeichert ist, in Dezimalstellen zerlegen
'und die Stellen zum späteren einfachen Abruf (indexen) beim Multiplexen in ein Array geben.
Dezimalziffern(1) = Zahl / 1000
Hilfs_variable = Zahl Mod 1000
Dezimalziffern(2) = Hilfs_variable / 100
Hilfs_variable = Zahl Mod 100
Dezimalziffern(3) = Hilfs_variable / 10
Hilfs_variable = Zahl Mod 10
Dezimalziffern(4) = Hilfs_variable / 1
Enable Interrupts 'startet das Multiplexing (Schalten der ziffern in der ISR)
Do
'leere Hauptschleife, Action findet in der ISR statt.
Loop
End
Isr_multiplex: 'schaltet Stellen mit ca. 488Hz (ca alle 2ms) weiter
'Bei jedem Aufruf der ISR wird
'sicherheitshalber alle Stellen über die Transistoren der Stellenansteueung die Anzeige abgeschaltet
'die Segmente der nächsten anzuzeigenden Dezimalziffer vorbereitet
'die entsprechende Stelle eingeschaltet.
'Eine Stelle is 2ms an und 6ms aus
If Stelle < 5 Then Incr Stelle Else Stelle = 1 'Index weiterschalten zur nächsten Stelle
Portd = Portd And &B11100001 'Alle 4 Stellen abschalten, andere Portpins nicht verändern
Portb = Lookup(dezimalziffern(stelle) , Ziffern_pattern) 'Lookup holt aus den Daten unter Ziffern_pattern
'das Pattern, das zur Zahl in Dezimalstellen(stelle) gehört
'und setzt damit im PORTB die Segmentportpins
Select Case Stelle 'und eine Stelle der vier wieder unter Strom setzen
Case 1 : Portd.1 = 1 'Stelle 1 einschalten
Case 2 : Portd.2 = 1 'Stelle 2 einschalten
Case 3 : Portd.3 = 1 'Stelle 3 einschalten
Case 4 : Portd.4 = 1 'Stelle 4 einschalten
End Select
Return
Ziffern_pattern: 'Daten zur Segmentansteuerung.
'Eine "1" bringt zusammen mit der Stellenansteuerung
'das entsprechende Segment zum leuchten
'Seg.dp,abcdefg (dp: Dezimalpunkt nicht genutzt)
Data &B01111110 'Muster für Ziffer 0
Data &B00110000 'Ziffer 1
Data &B01101101 'Ziffer 2
Data &B01111001 'Ziffer 3
Data &B00110011 'Ziffer 4
Data &B01011011 'Ziffer 5
Data &B01011111 'Ziffer 6
Data &B01110000 'Ziffer 7
Data &B01111111 'Ziffer 8
Data &B01111011 'Ziffer 9
'Wird ein Datenbyte auf PortB geschrieben, kommt das LSB (Segment g) auf PB0,
'MSB (Segment a) auf PB6 - passend zur Verdrahhtung.
Lesezeichen