Uhr mit 4x 8x8 Led-Matrix Max7219

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Uhr mit 4x 8x8 Led-Matrix Max7219

      Hallo,
      hat jemand zu diesem Thema noch Code-Listings aus dem alten Bascom-Forum oder andere Bascom Listings. Ich habe diesbezüglich noch keine Erfahrung gemacht.
      Momentan arbeite ich mit einem Arduino Uno und der Punktmatrix. Leider ohne erfolg, weil ich mir, so wie es aussieht den Bootloader zerschossen habe. Kann aber noch über ISP genutzt werden. Das Bascom-Code myAVR_MAX7219_8x8.bas funktioniert.
      Anbei die Abbildungen meiner Hardware

      Gruß Michael
      Download (1).jpgsainsmart_uno_r3.png
    • Du hast es so gewollt

      BASCOM-Quellcode

      1. 'Max7219 Test
      2. $regfile = "m32def.dat"
      3. $crystal = 16000000
      4. $hwstack = 256
      5. $swstack = 256
      6. $framesize = 256
      7. 'SPI einrichten
      8. Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1 Spiinit
      9. 'DCF77 einrichten
      10. Config Dcf77 = Pind.7 , Timer = 1 , Update = 0 , Inverted = 0 , Check = 1 , Timer1sec = 0 , Gosub = Sectic
      11. Set Portd.7 'pullup setzen
      12. Declare Sub Schreiben(byval Buchstaben As String )
      13. Declare Sub Hoch(byval Buchstaben As String )
      14. Enable Interrupts
      15. Const Anzahl_module = 6
      16. Dim Display_array(8 , Anzahl_module) As Byte '8 Zeilen für jedes Modul
      17. Dim Speicher(16)as Byte
      18. Dim Temp As Byte
      19. Dim Modul As Byte
      20. Dim Zeile As Byte
      21. Dim Loesch As Byte
      22. Dim Display_daten As Byte , Display_digit As Byte
      23. Dim Modul_nummer As Byte , X As Byte
      24. Dim Standort_alt As Word
      25. Dim Standort_neu As Word
      26. Dim Test As String * 6
      27. Dim M As Dword
      28. Dim Text_alt As String * Anzahl_module
      29. Dim N As Byte
      30. Dim Uhrzeit As String * 6
      31. Dim Stunde_st As String * 2
      32. Dim Minute_st As String * 2
      33. Dim Sekunde_st As String * 2
      34. Dim Stunde As Byte
      35. Dim Minute As Byte
      36. Dim Sekunde As Byte
      37. Config Portb.3 = Output : Cs Alias Portb.3
      38. Spiinit
      39. Gosub Init_max7219 'Display initialisieren
      40. Gosub Loeschen 'Display loeschen
      41. Text_alt = " "
      42. '##################################################### Main-Frame
      43. _hour = 0 : _min = 0
      44. Do
      45. Sekunde = _sec
      46. Minute = _min
      47. Stunde = _hour
      48. Stunde_st = Str(stunde)
      49. Stunde_st = Format(stunde_st , "00")
      50. Minute_st = Str(minute)
      51. Minute_st = Format(minute_st , "00")
      52. Sekunde_st = Str(sekunde)
      53. Sekunde_st = Format(sekunde_st , "00")
      54. Uhrzeit = Stunde_st + Minute_st + Sekunde_st
      55. Call Hoch(uhrzeit)
      56. While Sekunde = _sec
      57. Wend
      58. Loop
      59. End
      60. '##################################################### Main-Frame
      61. Sub Schreiben(buchstaben As String )
      62. Local Count As Byte
      63. Local Zeichen_neu As String * 1
      64. Local Zeichen_alt As String * 1
      65. Local Tabellen_stelle As Word
      66. Local Durchlauf As Byte
      67. Local Restschritte As Byte
      68. For Modul_nummer = 1 To Anzahl_module
      69. Zeichen_neu = Mid(buchstaben , Modul_nummer , 1) 'Einzelbuchstaben herauspicken
      70. Standort_neu = Asc(zeichen_neu) 'Tabelle berechnen minus 32 zeichen.
      71. Standort_neu = Standort_neu - 32
      72. Standort_neu = Standort_neu * 8
      73. For X = 0 To 7 'das bitmuster zeilenweise in den Speicher schreiben
      74. Tabellen_stelle = Standort_neu + X
      75. Zeile = X + 1 'digit0 =1, digit7=8
      76. Display_array(zeile , Modul_nummer) = Lookup(tabellen_stelle , Font_tabelle)
      77. Next X
      78. Next Modul_nummer 'für den nächsten Buchstaben die Modulnummer weiterschalten
      79. Text_alt = Buchstaben
      80. End Sub
      81. Sub Hoch(buchstaben As String )
      82. Local Count As Byte
      83. Local Zeichen_neu As String * 1
      84. Local Zeichen_alt As String * 1
      85. Local Tabellen_stelle As Word
      86. Local Durchlauf As Byte
      87. Local Restschritte As Byte
      88. For Durchlauf = 1 To 8 'nach 8 Zeilenverschiebungen wird der neue Text "Buchstaben" angezeigt
      89. Waitms 100
      90. For Modul_nummer = 1 To Anzahl_module
      91. Zeichen_neu = Mid(buchstaben , Modul_nummer , 1) 'Einzelbuchstaben herauspicken
      92. Zeichen_alt = Mid(text_alt , Modul_nummer , 1)
      93. If Zeichen_neu <> Zeichen_alt Then
      94. Standort_neu = Asc(zeichen_neu) 'Tabelle berechnen minus 32 zeichen.
      95. Standort_neu = Standort_neu - 32
      96. Standort_neu = Standort_neu * 8
      97. Standort_alt = Asc(zeichen_alt) 'Tabelle berechnen minus 32 zeichen.
      98. Standort_alt = Standort_alt - 32
      99. Standort_alt = Standort_alt * 8
      100. For X = 0 To 7 'das bitmuster zeilenweise in den Zwischenspeicher schreiben
      101. Tabellen_stelle = Standort_alt + X
      102. Zeile = X + 1 'digit0 =1, digit7=8
      103. Speicher(zeile) = Lookup(tabellen_stelle , Font_tabelle)
      104. Tabellen_stelle = Standort_neu + X
      105. Zeile = X + 9 'digit0 =1, digit7=8
      106. Speicher(zeile) = Lookup(tabellen_stelle , Font_tabelle)
      107. Next X
      108. For X = 1 To 8 'das bitmuster versetzt zeilenweise in den Speicher schreiben
      109. Zeile = X + Durchlauf 'digit0 =1, digit7=8
      110. Display_array(x , Modul_nummer) = Speicher(zeile)
      111. Next X
      112. End If
      113. Next Modul_nummer 'für den nächsten Buchstaben die Modulnummer weiterschalten
      114. Gosub Graphik
      115. Gosub Ausgabe
      116. Next Durchlauf
      117. Text_alt = Buchstaben
      118. End Sub
      119. Ausgabe:
      120. 'Ausgabe an die Module und den neuen Speicherinnhalt anzeigen lassen
      121. For Zeile = 1 To 8 'nacheinander die Zeilen an allen Modulen aktualisieren
      122. Cs = 0
      123. For Modul = 1 To Anzahl_module '6 x max 7219 Module
      124. Temp = Display_array(zeile , Modul) , 1 'geht nicht direkt mit Spiout ??
      125. Spiout Zeile , 1 'MSB
      126. Spiout Temp , 1 'LSB
      127. Next Modul
      128. Cs = 1
      129. Next Zeile
      130. Return
      131. Graphik: 'Doppelpunkte zwischen Stunde und Minute und Minute und Sekunde innerhalb der Einerstellen
      132. Display_array(1 , 2) = Display_array(1 , 2) Or 1
      133. Display_array(2 , 2) = Display_array(2 , 2) Or 1
      134. Display_array(3 , 2) = Display_array(3 , 2) Or 1
      135. Display_array(4 , 2) = Display_array(4 , 2) Or 1
      136. Display_array(5 , 2) = Display_array(5 , 2) Or 1
      137. Display_array(6 , 2) = Display_array(6 , 2) Or 1
      138. Display_array(7 , 2) = Display_array(7 , 2) Or 1
      139. Display_array(8 , 2) = Display_array(8 , 2) Or 1
      140. Display_array(1 , 4) = Display_array(1 , 4) Or 1
      141. Display_array(2 , 4) = Display_array(2 , 4) Or 1
      142. Display_array(3 , 4) = Display_array(3 , 4) Or 1
      143. Display_array(4 , 4) = Display_array(4 , 4) Or 1
      144. Display_array(5 , 4) = Display_array(5 , 4) Or 1
      145. Display_array(6 , 4) = Display_array(6 , 4) Or 1
      146. Display_array(7 , 4) = Display_array(7 , 4) Or 1
      147. Display_array(8 , 4) = Display_array(8 , 4) Or 1
      148. Return
      149. Init_max7219: ' Initialisieren des MAX7219
      150. Display_digit = &H0C : Display_daten = &H00 ' Shutdown On
      151. Gosub Led_write_command
      152. Display_digit = &H09 : Display_daten = &H00 ' kein decode "B" für alle Digits
      153. Gosub Led_write_command
      154. Display_digit = &H0A : Display_daten = &H04 ' Helligkeit 0-F
      155. Gosub Led_write_command
      156. Display_digit = &H0B : Display_daten = 7 ' Anzahl Digits 8
      157. Gosub Led_write_command
      158. Display_digit = &H0F : Display_daten = 0 ' Test Off
      159. Gosub Led_write_command
      160. Display_digit = &H0C : Display_daten = 1 ' Shutdown Off
      161. Gosub Led_write_command
      162. Return
      163. Led_write_command:
      164. Cs = 0
      165. For N = 1 To 6
      166. Spiout Display_digit , 1
      167. Spiout Display_daten , 1
      168. Next N
      169. Cs = 1
      170. Return
      171. Loeschen:
      172. Temp = 0
      173. For Modul = 1 To Anzahl_module '6 Module angeschlossen
      174. For Zeile = 1 To 8 '8x8 LED-Array löschen
      175. Cs = 0
      176. Spiout Zeile , 1
      177. Spiout Temp , 1
      178. Cs = 1
      179. Next Zeile
      180. Next Modul
      181. Return
      182. Sectic:
      183. Return
      184. 'hier die Fonttabelle einfügen
      Alles anzeigen
      fonttabelle.txt
      Das Programm war jetzt für das Ansichtsfenster zu lang. Die Fonttabelle liegt als 'Fonttabelle.txt' bei, deren Inhalt einfach ans Ende von dem Programm einfügen, oder du machst es mit einem 'include'-Befehl.
      Da ist jetzt noch bisschen mehr ins Programm reingepackt, war für mich nur ein Test. Probier mal, ob du zurecht kommst, wenn was unklar, dann einfach nachfragen.
      Jetzt wird's wieder spannend, werden wir weiße Weihnachten haben?
    • Hallo Meister Hora,
      ich brauche für mein Display, abgesehen von der Spannungsversorgung, drei Signalleitungen.
      1. D(in), 2. clk und 3. CS.
      Die CS-Leitung ist durch Config Portb.3 = Output : Cs Alias Portb.3 definiert.
      Es fehlen noch D(in) und clk.
      Im Hardware SPI- Mode setzt die SPIINIT-Anweisung die SPI-Pins auf:
      SCK = Ouput, MISO = Input, MOSI = Output, womit D(in) = MOSI und clk = SCK wird. Ist das Richtig ?

      Gruß Michael
    • Die sub ist nur vorhanden und wird durch die main nicht aufgerufen, stimmt. Aber man könnte sie aufrufen. Das Programm war für mich ein Test, kein Projekt. Deswegen auch der komplette Zeichensatz im font.
      Auf 4 displays kriegst du Stunde, Doppelpunkt und Minuten unter und hättest noch bisschen Platz. Einfach den string sekunde_st nicht an den Uhrzeit-string dran hängen und dann vielleicht statt auf neue Sekunde auf neue Minute warten, um die neue Zeit ins display zu schreiben.
      Jetzt wird's wieder spannend, werden wir weiße Weihnachten haben?
    • Hallo Meister Tschoeatsch,
      ich habe versucht die Uhr nachzubauen.
      Bei mir werden aber die Zahlen von unten eingeschoben, nicht wie im Video von oben.
      Außerdem wird der „:“ nicht als „:“ dargestellt sondern als kompletter Strich und die Null hat einen Querstrich, also die digitale Null ;)

      Was könnte das sein? Ist der Zeichensatz falsch?

      Danke schon mal
    • Ouh, ich glaub', ich hab' ein falsches Programm zum Film gepostet. Im Filmchen werden ja nur 5 displays gebraucht, weil ich da einen 6x8 font verwende. Bei 6 Zahlen gibt das 36 Spalten. Die Trennungsdoppelpunkte verwenden je 2 Spalten, gibt dann in der Summe genau die 40 Spalten von 5 displays. Ich muss jetzt mal nach dem richtigen Programm suchen, haben tu' ich's auf jeden Fall. Entschuldige bitte erstmal mein Versehen. Programm kommt bald!
      Jetzt wird's wieder spannend, werden wir weiße Weihnachten haben?
    • Hallo! ich wollte gerade mal mein LED modul testen und fand dieses schöne Programm.
      Nun erhalte ich elider eine Fehlermeldung:

      error 26 line 16 as axpected [DISPLAY_ARRAY] , in File::
      error 26 line 16 as axpected [ANZAHL_MODULE)ASBYTE] , in File::

      habe an deinem Programm nichts geändert.