Auf die Ansteuerung der 8x8 Ledmatrixmodule mit den Max7219 bin ich dort schon eingegangen Ansteuerung des Max7219.
Hier möchte ich eine Möglichkeit darstellen, wie man einfach scrollende Texte darstellen kann. Mir persönlich gefallen die 8x8 fonts nicht, auf diesen 8x8 Matrixen sehen 6x8 fonts besser aus. Ein Buchstabe wird dann genauso platzsparend mit 6 bytes dargestellt.
Wenn die Module so aneinander gereiht werden, dass sie nur mit kurzen Drahtbrücken verbunden werden müssen, ist eine 'on the fly' der Buchstabendaten an die Max nicht so einfach. Übersichtlicher geht es mit einem Bildspeicher. Der Bildspeicher ist so organisiert, dass ein byte eine Spalte repräsentiert.
Bildspeicher.jpg
Dieser Speicher, ein array von bytes, wird zeilenweise an die Max7219 gesendet und so zur Anzeige gebracht.
Wenn ich jetzt einen Buchstaben darstellen will, muss ich nur die 6 bytes eines Buchstabens aus der fonttabelle in den Bildspeicher kopieren.
Es wird durch den Bildspeicher auch sehr einfach, einen scrollenden Text darzustellen. Dazu muss der Inhalt des Bildspeichers um eine Spalte nach links verschoben werden und in die frei werdende, rechteste Spalte eine Spalte des Buchstabens einkopiert werden.
Das will ich hier zeigen.
Der Bildspeicher wird angelegt
Alles anzeigen
Es wird geschickterweise eine sub erstellt, die den kompletten Bildspeicher auf die Module überträgt
Alles anzeigen
Was man in diesem Beispiel noch braucht, ist eine sub, die den Innhalt des Bildspeichers um eine Spalte nach links verschiebt. Das geht ganz einfach
Natürlich muss der Bildspeicher auch mit Daten gefüllt werden, das geschieht hier
Alles anzeigen
Der Text, der ausgegeben werden soll wird in Einzelbuchstaben zerzupft. Aus der fonttabelle wird jetzt eine Spalte des Buchstabens genommen und in die rechteste Spalte des Bildspeichers kopiert. Zuvor wird die durch Verschieben des Bildspeichers frei gemacht.
Jetzt ist alles beieinander. Natürlich müssen die Module noch für den Einsatz mit den Matrixen initialisiert werden.
Eine main-Schleife braucht es noch, um das alles zu steuern, das schaut dann so aus
Alles anzeigen
6x8font_Spalten.txt Hier der font, bei dem die Umlaute am Ende nicht mehr die ASCII-Nummerierung haben. So ist das platzsparender und geht genauso. Jeder Buchstabe wird durch 6 bytes dargestellt, bit0 der bytes ist dabei die obere Kante des Buchstabens.
Und wie schaut das in Echt aus?
So
Wenn man jetzt noch einen Pufferspeicher anlegt, kann man sehr leicht verschiedene Effekte realisieren. In dem folgendem Programm sind verschiedene 'Textübergänge' programmiert. Der Übersichtlichkeit wegen hab' ich jetzt nicht sehr platzsparend programmiert
Textausgabe mit 6x 8x8Ledmatrix_Bildspeicher_1.bas
Das schaut dann so aus
Hier möchte ich eine Möglichkeit darstellen, wie man einfach scrollende Texte darstellen kann. Mir persönlich gefallen die 8x8 fonts nicht, auf diesen 8x8 Matrixen sehen 6x8 fonts besser aus. Ein Buchstabe wird dann genauso platzsparend mit 6 bytes dargestellt.
Wenn die Module so aneinander gereiht werden, dass sie nur mit kurzen Drahtbrücken verbunden werden müssen, ist eine 'on the fly' der Buchstabendaten an die Max nicht so einfach. Übersichtlicher geht es mit einem Bildspeicher. Der Bildspeicher ist so organisiert, dass ein byte eine Spalte repräsentiert.
Bildspeicher.jpg
Dieser Speicher, ein array von bytes, wird zeilenweise an die Max7219 gesendet und so zur Anzeige gebracht.
Wenn ich jetzt einen Buchstaben darstellen will, muss ich nur die 6 bytes eines Buchstabens aus der fonttabelle in den Bildspeicher kopieren.
Es wird durch den Bildspeicher auch sehr einfach, einen scrollenden Text darzustellen. Dazu muss der Inhalt des Bildspeichers um eine Spalte nach links verschoben werden und in die frei werdende, rechteste Spalte eine Spalte des Buchstabens einkopiert werden.
Das will ich hier zeigen.
Der Bildspeicher wird angelegt
BASCOM-Quellcode
- 'Textausgabe mit 6 Max7219 Led8x8 Matrix
- $regfile = "m168pdef.dat"
- $crystal = 8000000
- $hwstack = 34
- $swstack=32
- $framesize=64
- 'Alias
- Din Alias Portd.0 'Mit DIN an der Max-Platine verbinden
- Clk Alias Portd.1 'Mit Clk an der Max-Platine verbinden
- Cs Alias Portd.2 'Mit Cs an der Max-Platine verbinden
- 'ports
- Config Din = Output
- Config Clk = Output
- Config Cs = Output
- 'Variablen
- Const Anzahl_displays = 6
- Const Spalten = 8 * Anzahl_displays 'maximale Anzahl der Spalten
- Dim Bildspeicher(spalten)as Byte
- Dim Bs_spalte As Byte 'Spalte im Bildspeicher
BASCOM-Quellcode
- Ausgabe: 'der Bildspeicher wird an die Max7219 übertragen
- For Zeile = 1 To 8 'Zeilennummer des Bildspeichers, oberste Zeile=1 =bit0 der spalte
- Bs_spalte = 1
- Cs = 0 'Beginn der Datenübertragung
- Do
- For N = 7 To 0 Step -1 'bit7 ist links in der Zeile der Matrix, bit0 rechts
- Bit_nummer = Zeile - 1
- Disp_daten.n = Bildspeicher(bs_spalte).bit_nummer 'ein bit einer Spalte dem bit einer Zeile für den Max zuordnen
- Incr Bs_spalte
- Next N
- 'ein byte ist jetzt zusammen gesetzt und kann gesendet werden
- Shiftout Din , Clk , Zeile , 1
- Shiftout Din , Clk , Disp_daten , 1
- Loop Until Bs_spalte > Spalten
- Cs = 1 'Flanke überträgt die Daten für einer Bildspeicher-Zeile an die Max7219
- Next Zeile
- Return
BASCOM-Quellcode
- Text_schreiben:
- Lang = Len(ausgabetext)
- For B = 1 To Lang 'nacheinander die einzelnen Buchstaben durchgehen
- Buchstabe = Mid(ausgabetext , B , 1) 'Einzelbuchstaben herauspicken
- Tabellenstart = Asc(buchstabe) 'Tabelle berechnen minus 32 zeichen.
- Select Case Buchstabe
- Case "Ä" : Tabellenstart = &H82
- Case "Ö" : Tabellenstart = &H83
- Case "Ü" : Tabellenstart = &H84
- Case "ä" : Tabellenstart = &H80
- Case "ü" : Tabellenstart = &H7F
- Case "ö" : Tabellenstart = &H81
- Case "ß" : Tabellenstart = &H85
- End Select
- Tabellenstart = Tabellenstart - 32
- Tabellenstart = Tabellenstart * 6
- For M = 1 To 6 'das bitmuster spaltenweise in den Speicher schreiben (6 Spalten)
- Gosub Shift_bildspeicher_left 'Bildspeicher nach links verschieben
- Bs_spalte = Lookup(tabellenstart , Font_6x8)
- Bildspeicher(spalten) = Bs_spalte 'in die rechteste Bildspeicherspalte schreiben
- Gosub Ausgabe
- Waitms Scrollpause
- Incr Tabellenstart
- Next M
- Next B
- Return
Jetzt ist alles beieinander. Natürlich müssen die Module noch für den Einsatz mit den Matrixen initialisiert werden.
Eine main-Schleife braucht es noch, um das alles zu steuern, das schaut dann so aus
BASCOM-Quellcode
- 'Textausgabe mit 6 Max7219 Led8x8 Matrix
- $regfile = "m168pdef.dat"
- $crystal = 8000000
- $hwstack = 34
- $swstack = 32
- $framesize = 64
- 'Alias
- Din Alias Portd.0 'Mit DIN an der Max-Platine verbinden
- Clk Alias Portd.1 'Mit Clk an der Max-Platine verbinden
- Cs Alias Portd.2 'Mit Cs an der Max-Platine verbinden
- 'ports
- Config Din = Output
- Config Clk = Output
- Config Cs = Output
- 'Variablen
- Const Anzahl_displays = 6
- Const Spalten = 8 * Anzahl_displays 'maximale Anzahl der Spalten
- Dim Bildspeicher(spalten)as Byte
- Dim Bs_spalte As Byte 'Spalte im Bildspeicher
- Dim Zeile As Byte
- Dim Bit_nummer As Byte
- Dim Befehl As Byte , Disp_daten As Byte
- Dim N As Byte 'Zähler
- Dim B As Byte , M As Byte 'Zähler
- Dim Tabellenstart As Word 'Nummer des Tabelleneintrags
- Dim Ausgabetext As String * 254
- Dim Buchstabe As String * 1
- Dim Lang As Byte
- Dim Scrollpause As Word
- 'Start Programm
- Scrollpause = 100
- Cs = 1
- Gosub Init_max7219 'initialisieren für die Verwendung mit der 8x8 Matrix
- Do
- Ausgabetext = "Hallo Bascom-Gemeinde. Das ist ein Beispiel, wie man einfach einen scrollenden Text auf 8x8 Ledmatrixen anzeigen kann. "
- Gosub Text_schreiben
- Loop
- End
- Text_schreiben:
- Lang = Len(ausgabetext)
- For B = 1 To Lang 'nacheinander die einzelnen Buchstaben durchgehen
- Buchstabe = Mid(ausgabetext , B , 1) 'Einzelbuchstaben herauspicken
- Tabellenstart = Asc(buchstabe) 'Tabelle berechnen minus 32 zeichen.
- Select Case Buchstabe
- Case "Ä" : Tabellenstart = &H82
- Case "Ö" : Tabellenstart = &H83
- Case "Ü" : Tabellenstart = &H84
- Case "ä" : Tabellenstart = &H80
- Case "ü" : Tabellenstart = &H7F
- Case "ö" : Tabellenstart = &H81
- Case "ß" : Tabellenstart = &H85
- End Select
- Tabellenstart = Tabellenstart - 32
- Tabellenstart = Tabellenstart * 6
- For M = 1 To 6 'das bitmuster spaltenweise in den Speicher schreiben (6 Spalten)
- Gosub Shift_bildspeicher_left 'Bildspeicher nach links verschieben
- Bs_spalte = Lookup(tabellenstart , Font_6x8)
- Bildspeicher(spalten) = Bs_spalte 'in die rechteste Bildspeicherspalte schreiben
- Gosub Ausgabe
- Waitms Scrollpause
- Incr Tabellenstart
- Next M
- Next B
- Return
- Shift_bildspeicher_left:
- For N = 2 To Spalten
- Bildspeicher(n -1) = Bildspeicher(n)
- Next N
- Return
- Ausgabe: 'der Bildspeicher wird an die Max7219 übertragen
- For Zeile = 1 To 8 'Zeilennummer des Bildspeichers, oberste Zeile=1 =bit0 der spalte
- Bs_spalte = 1
- Cs = 0 'Beginn der Datenübertragung
- Do
- For N = 7 To 0 Step -1 'bit7 ist links in der Zeile der Matrix, bit0 rechts
- Bit_nummer = Zeile - 1
- Disp_daten.n = Bildspeicher(bs_spalte).bit_nummer 'ein bit einer Spalte dem bit einer Zeile für den Max zuordnen
- Incr Bs_spalte
- Next N
- 'ein byte ist jetzt zusammen gesetzt und kann gesendet werden
- Shiftout Din , Clk , Zeile , 1
- Shiftout Din , Clk , Disp_daten , 1
- Loop Until Bs_spalte > Spalten
- Cs = 1 'Flanke überträgt die Daten für einer Bildspeicher-Zeile an die Max7219
- Next Zeile
- Return
- Init_max7219: ' Initialisieren des MAX7219
- Befehl = &H09 : Disp_daten = &H00 ' kein decode "B" für alle Digits weil 8x8 Matrix
- Gosub Led_write_command
- Befehl = &H0A : Disp_daten = &H04 ' Helligkeit 0-F
- Gosub Led_write_command
- Befehl = &H0B : Disp_daten = 7 ' Anzahl Digits 8 weil 8x8 Matrix
- Gosub Led_write_command
- Befehl = &H0F : Disp_daten = 0 ' Test Off
- Gosub Led_write_command
- Befehl = &H0C : Disp_daten = 1 ' Shutdown Off
- Gosub Led_write_command
- Return
- Led_write_command:
- Cs = 0
- For N = 1 To Anzahl_displays
- Shiftout Din , Clk , Befehl , 1
- Shiftout Din , Clk , Disp_daten , 1
- Next N
- Cs = 1 'Flanke von 0 zu 1 überträgt den Befehl und die Daten in den Max
- Return
- $include 6x8font_spalten.txt
Und wie schaut das in Echt aus?
So
Wenn man jetzt noch einen Pufferspeicher anlegt, kann man sehr leicht verschiedene Effekte realisieren. In dem folgendem Programm sind verschiedene 'Textübergänge' programmiert. Der Übersichtlichkeit wegen hab' ich jetzt nicht sehr platzsparend programmiert
Textausgabe mit 6x 8x8Ledmatrix_Bildspeicher_1.bas
Das schaut dann so aus
6.968 mal gelesen