Max7219 mit 8x8 Ledmatrix, scrollende Textdarstellung mit einem schmalen font

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • scrollender Text auf einer Reihe von 8x8 Ledmatrixen
    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

    BASCOM Source Code

    1. 'Textausgabe mit 6 Max7219 Led8x8 Matrix
    2. $regfile = "m168pdef.dat"
    3. $crystal = 8000000
    4. $hwstack = 34
    5. $swstack=32
    6. $framesize=64
    7. 'Alias
    8. Din Alias Portd.0 'Mit DIN an der Max-Platine verbinden
    9. Clk Alias Portd.1 'Mit Clk an der Max-Platine verbinden
    10. Cs Alias Portd.2 'Mit Cs an der Max-Platine verbinden
    11. 'ports
    12. Config Din = Output
    13. Config Clk = Output
    14. Config Cs = Output
    15. 'Variablen
    16. Const Anzahl_displays = 6
    17. Const Spalten = 8 * Anzahl_displays 'maximale Anzahl der Spalten
    18. Dim Bildspeicher(spalten)as Byte
    19. Dim Bs_spalte As Byte 'Spalte im Bildspeicher
    Display All
    Es wird geschickterweise eine sub erstellt, die den kompletten Bildspeicher auf die Module überträgt

    BASCOM Source Code

    1. Ausgabe: 'der Bildspeicher wird an die Max7219 übertragen
    2. For Zeile = 1 To 8 'Zeilennummer des Bildspeichers, oberste Zeile=1 =bit0 der spalte
    3. Bs_spalte = 1
    4. Cs = 0 'Beginn der Datenübertragung
    5. Do
    6. For N = 7 To 0 Step -1 'bit7 ist links in der Zeile der Matrix, bit0 rechts
    7. Bit_nummer = Zeile - 1
    8. Disp_daten.n = Bildspeicher(bs_spalte).bit_nummer 'ein bit einer Spalte dem bit einer Zeile für den Max zuordnen
    9. Incr Bs_spalte
    10. Next N
    11. 'ein byte ist jetzt zusammen gesetzt und kann gesendet werden
    12. Shiftout Din , Clk , Zeile , 1
    13. Shiftout Din , Clk , Disp_daten , 1
    14. Loop Until Bs_spalte > Spalten
    15. Cs = 1 'Flanke überträgt die Daten für einer Bildspeicher-Zeile an die Max7219
    16. Next Zeile
    17. Return
    Display All
    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

    BASCOM Source Code

    1. Shift_bildspeicher_left:
    2. For N = 2 To Spalten
    3. Bildspeicher(n -1) = Bildspeicher(n)
    4. Next N
    5. Return
    Natürlich muss der Bildspeicher auch mit Daten gefüllt werden, das geschieht hier

    BASCOM Source Code

    1. Text_schreiben:
    2. Lang = Len(ausgabetext)
    3. For B = 1 To Lang 'nacheinander die einzelnen Buchstaben durchgehen
    4. Buchstabe = Mid(ausgabetext , B , 1) 'Einzelbuchstaben herauspicken
    5. Tabellenstart = Asc(buchstabe) 'Tabelle berechnen minus 32 zeichen.
    6. Select Case Buchstabe
    7. Case "Ä" : Tabellenstart = &H82
    8. Case "Ö" : Tabellenstart = &H83
    9. Case "Ü" : Tabellenstart = &H84
    10. Case "ä" : Tabellenstart = &H80
    11. Case "ü" : Tabellenstart = &H7F
    12. Case "ö" : Tabellenstart = &H81
    13. Case "ß" : Tabellenstart = &H85
    14. End Select
    15. Tabellenstart = Tabellenstart - 32
    16. Tabellenstart = Tabellenstart * 6
    17. For M = 1 To 6 'das bitmuster spaltenweise in den Speicher schreiben (6 Spalten)
    18. Gosub Shift_bildspeicher_left 'Bildspeicher nach links verschieben
    19. Bs_spalte = Lookup(tabellenstart , Font_6x8)
    20. Bildspeicher(spalten) = Bs_spalte 'in die rechteste Bildspeicherspalte schreiben
    21. Gosub Ausgabe
    22. Waitms Scrollpause
    23. Incr Tabellenstart
    24. Next M
    25. Next B
    26. Return
    Display All
    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

    BASCOM Source Code

    1. 'Textausgabe mit 6 Max7219 Led8x8 Matrix
    2. $regfile = "m168pdef.dat"
    3. $crystal = 8000000
    4. $hwstack = 34
    5. $swstack = 32
    6. $framesize = 64
    7. 'Alias
    8. Din Alias Portd.0 'Mit DIN an der Max-Platine verbinden
    9. Clk Alias Portd.1 'Mit Clk an der Max-Platine verbinden
    10. Cs Alias Portd.2 'Mit Cs an der Max-Platine verbinden
    11. 'ports
    12. Config Din = Output
    13. Config Clk = Output
    14. Config Cs = Output
    15. 'Variablen
    16. Const Anzahl_displays = 6
    17. Const Spalten = 8 * Anzahl_displays 'maximale Anzahl der Spalten
    18. Dim Bildspeicher(spalten)as Byte
    19. Dim Bs_spalte As Byte 'Spalte im Bildspeicher
    20. Dim Zeile As Byte
    21. Dim Bit_nummer As Byte
    22. Dim Befehl As Byte , Disp_daten As Byte
    23. Dim N As Byte 'Zähler
    24. Dim B As Byte , M As Byte 'Zähler
    25. Dim Tabellenstart As Word 'Nummer des Tabelleneintrags
    26. Dim Ausgabetext As String * 254
    27. Dim Buchstabe As String * 1
    28. Dim Lang As Byte
    29. Dim Scrollpause As Word
    30. 'Start Programm
    31. Scrollpause = 100
    32. Cs = 1
    33. Gosub Init_max7219 'initialisieren für die Verwendung mit der 8x8 Matrix
    34. Do
    35. Ausgabetext = "Hallo Bascom-Gemeinde. Das ist ein Beispiel, wie man einfach einen scrollenden Text auf 8x8 Ledmatrixen anzeigen kann. "
    36. Gosub Text_schreiben
    37. Loop
    38. End
    39. Text_schreiben:
    40. Lang = Len(ausgabetext)
    41. For B = 1 To Lang 'nacheinander die einzelnen Buchstaben durchgehen
    42. Buchstabe = Mid(ausgabetext , B , 1) 'Einzelbuchstaben herauspicken
    43. Tabellenstart = Asc(buchstabe) 'Tabelle berechnen minus 32 zeichen.
    44. Select Case Buchstabe
    45. Case "Ä" : Tabellenstart = &H82
    46. Case "Ö" : Tabellenstart = &H83
    47. Case "Ü" : Tabellenstart = &H84
    48. Case "ä" : Tabellenstart = &H80
    49. Case "ü" : Tabellenstart = &H7F
    50. Case "ö" : Tabellenstart = &H81
    51. Case "ß" : Tabellenstart = &H85
    52. End Select
    53. Tabellenstart = Tabellenstart - 32
    54. Tabellenstart = Tabellenstart * 6
    55. For M = 1 To 6 'das bitmuster spaltenweise in den Speicher schreiben (6 Spalten)
    56. Gosub Shift_bildspeicher_left 'Bildspeicher nach links verschieben
    57. Bs_spalte = Lookup(tabellenstart , Font_6x8)
    58. Bildspeicher(spalten) = Bs_spalte 'in die rechteste Bildspeicherspalte schreiben
    59. Gosub Ausgabe
    60. Waitms Scrollpause
    61. Incr Tabellenstart
    62. Next M
    63. Next B
    64. Return
    65. Shift_bildspeicher_left:
    66. For N = 2 To Spalten
    67. Bildspeicher(n -1) = Bildspeicher(n)
    68. Next N
    69. Return
    70. Ausgabe: 'der Bildspeicher wird an die Max7219 übertragen
    71. For Zeile = 1 To 8 'Zeilennummer des Bildspeichers, oberste Zeile=1 =bit0 der spalte
    72. Bs_spalte = 1
    73. Cs = 0 'Beginn der Datenübertragung
    74. Do
    75. For N = 7 To 0 Step -1 'bit7 ist links in der Zeile der Matrix, bit0 rechts
    76. Bit_nummer = Zeile - 1
    77. Disp_daten.n = Bildspeicher(bs_spalte).bit_nummer 'ein bit einer Spalte dem bit einer Zeile für den Max zuordnen
    78. Incr Bs_spalte
    79. Next N
    80. 'ein byte ist jetzt zusammen gesetzt und kann gesendet werden
    81. Shiftout Din , Clk , Zeile , 1
    82. Shiftout Din , Clk , Disp_daten , 1
    83. Loop Until Bs_spalte > Spalten
    84. Cs = 1 'Flanke überträgt die Daten für einer Bildspeicher-Zeile an die Max7219
    85. Next Zeile
    86. Return
    87. Init_max7219: ' Initialisieren des MAX7219
    88. Befehl = &H09 : Disp_daten = &H00 ' kein decode "B" für alle Digits weil 8x8 Matrix
    89. Gosub Led_write_command
    90. Befehl = &H0A : Disp_daten = &H04 ' Helligkeit 0-F
    91. Gosub Led_write_command
    92. Befehl = &H0B : Disp_daten = 7 ' Anzahl Digits 8 weil 8x8 Matrix
    93. Gosub Led_write_command
    94. Befehl = &H0F : Disp_daten = 0 ' Test Off
    95. Gosub Led_write_command
    96. Befehl = &H0C : Disp_daten = 1 ' Shutdown Off
    97. Gosub Led_write_command
    98. Return
    99. Led_write_command:
    100. Cs = 0
    101. For N = 1 To Anzahl_displays
    102. Shiftout Din , Clk , Befehl , 1
    103. Shiftout Din , Clk , Disp_daten , 1
    104. Next N
    105. Cs = 1 'Flanke von 0 zu 1 überträgt den Befehl und die Daten in den Max
    106. Return
    107. $include 6x8font_spalten.txt
    Display All
    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 :D
    Textausgabe mit 6x 8x8Ledmatrix_Bildspeicher_1.bas
    Das schaut dann so aus

    1,856 times viewed