7-Segment-Anzeigen - Eine Ziffer bitte
Materialbedarf
Wie der AVR 7-Segment-Anzeigen steuert
Wer über 7-Segment-Anzeigen noch etwas mehr wissen möchte, der liest sich erst einmal den Lehrgang
|
Jetzt leuchtet das entsprechende Segment auf wenn das entsprechende Bit des Ports auf 1 gesetzt wird. Segment a ist mit Bit 0 des Ports D verbunden, Segment b mit Bit 1 usw. Normalerweise wird der Dezimalpunkt mit dem letzten Bit des Ports verbunden. Da wir diesen aber hier nicht benötigen lassen wir die Verbindung weg. Hat man eine LED-Anzeige mit gem. Anode, ist der Anschluss ähnlich. Die Anode wird hier natürlich dann mit dem Pluspol der Spannungsversorgung verbunden. Hier würde nun das entsprechende Segment aufleuchten, wenn der entsprechende Portpin auf 0 gesetzt wird. Man müsste also vor der Ausgabe das Bitbild invertieren. Um nun die Anzeige zum Arbeiten zu bewegen benötigen wir ein kleines Programm: |
$regfile "m8def.dat"
$crystal = 1000000 Config Portd = Output Portd = &B00111111 Stop |
Wenn das Programm übersetzt und zum AVR geschickt wurde, zeigt das Display eine '0' an. Will man eine andere Anzeige haben, muss man nur die Zuweisung des Bitbildes zum Port ändern in der Anweisung
Portd = &B00111111 |
Hier fällt sofort auf, dass wir hier den Wert nicht Dezimal sondern als Binärwert zuweisen. Bascom macht daraus wieder den richtigen Dezimalwert. Durch die Verwendung eines Binärwertes ist der Entwurf einzelner Ziffern relativ leicht möglich. Man muss nur an den Bits eine 1 setzen, an dem die entsprechende Segmente angeschlossen sind. Als kleine Hilfe hier noch mal die Bitaufteilung:
Bit: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Segment: | - | g | f | e | d | c | b | a |
Wer möchte, kann nun einmal versuchen die diversen Ziffern zu entwerfen.
Diese Methode der Zuweisung des Ports ist aber ziemlich unflexibel. Man müsste jedes mal im Programm, wenn eine bestimmte Ziffer auf der Anzeige dargestellt werden soll, das entsprechende Bitmuster zum Port schicken. Dies ist recht unbequem. Einfacher wäre es doch, wenn man eine Anweisung in der Form: 'Zeige Bitbild für Ziffer 3' geben könnte.
Das nächste Programm zeigt, dass man es kann:
$regfile "m8def.dat"
|
Hier wird nun ein so genanntes Variablenfeld für die Bitmuster verwendet. Wir legen mit der Anweisung
Dim Dis(10) As Byte |
ein Variablenfeld mit 10 Elementen fest. Für jede mögliche Ziffer ein Element. Nun müssen wir noch die Elemente mit den Bitmustern der einzelnen Ziffern füllen. Dies geschieht hier:
Dis(1) = &B00111111
Dis(2) = &B00000110 Dis(3) = &B01011011 Dis(4) = &B01001111 Dis(5) = &B01100110 Dis(6) = &B01101101 Dis(7) = &B01111101 Dis(8) = &B00000111 Dis(9) = &B01111111 Dis(10) = &B01101111 |
Jetzt braucht man nur noch das entsprechende Variablenelement auslesen, wenn wir das Bitmuster einer bestimmten Ziffer haben wollen. Eine Besonderheit Bascom ist jedoch, dass es ein Feldelement mit der Nummer 0 nicht gibt. Wir müssen also zu unserer gewünschten Ziffer immer 1 hinzu addieren um das entsprechende Bitbild zu bekommen. Dis(1) enthält nun das Bitbild für die Ziffer 0, Dis(2) für die Ziffer 1 usw.
In der DO-LOOP-Schleife steht nun eine kleine Routine, die die einzelnen Ziffern auf dem Display darstellen. Hier kann man gut sehen wie die Zuweisung funktioniert:
Portd = Dis(cnt) |
In der Abbildung sieht man hierzu einige Beispiele. Einiges kennt man evtl. schon von einigen Geräten. Taschenrechner z.B. zeigen gerne mal 'Error' an, wenn eine bestimmte Berechnung nicht möglich ist. Das nachfolgende kleine Programm zeigt, anstatt den Ziffern 0 bis 9, das Wort 'HALLO' auf dem Display an: |
$regfile "m8def.dat"
Cnt = Cnt + 1
|
Eine kleine Anwendung entsteht
Wird das Programm übertragen muss man nun den Taster betätigen. Wird dieser wieder los gelassen, zeigt das Display eine Ziffer zwischen 1 und 6 an. Hier wurde also ein einfacher elektronischer Würfel programmiert. |
$regfile "m8def.dat"
$crystal = 1000000 Config Portb.0 = Input Config Portd = Output Portb.0 = 1 Dim Dis(10) As Byte Dim Cnt As Byte Dis(1) = &B00111111 Dis(2) = &B00000110 Dis(3) = &B01011011 Dis(4) = &B01001111 Dis(5) = &B01100110 Dis(6) = &B01101101 Dis(7) = &B01111101 Dis(8) = &B00000111 Dis(9) = &B01111111 Dis(10) = &B01101111 Cnt = 2 : Portd = Dis(cnt) Do If Pinb.0 = 0 Then Portd = Dis(cnt) : Cnt = Cnt + 1 If Cnt = 8 Then Cnt = 2 End If Loop |