4stellige 7 Segment LED Anzeige mit MAX7219

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

    • 4stellige 7 Segment LED Anzeige mit MAX7219

      Hallo,
      Ich brauch nen einfachen Timer, am besten aus der Bastelkiste. LTC4727 und ein MAX7219 ist gefunden und nachdem ich das "MAX7219 Ansteuern "gelesen habe, die IDE angeschmissen und ein bischen Code geschrieben.
      Und das kam dabei heraus. Könnte man das noch ein bissl zusammenfassen, weiß nicht so richtig wie anfangen.
      Ach so, das DCF ist erstmal nur für ne Art "softclock", weil die DS3231 Geschichte noch kommt dazu.

      BASCOM Source Code: anzeige

      1. 'Max7219 Anzeige 7-Segment LTC4272 mit Doppelpunkt und ° zeichen
      2. $regfile = "m8def.dat"
      3. $crystal = 8000000
      4. $hwstack = 32
      5. $swstack = 32
      6. $framesize = 32
      7. $baud = 4800
      8. Config Portb.0 = Input : Sw_4 Alias Pinb.0 : Portb.0 = 1
      9. Config Portb.1 = Input : Sw_3 Alias Pinb.1 : Portb.1 = 1
      10. Config Portb.2 = Input : Sw_2 Alias Pinb.2 : Portb.2 = 1
      11. Config Portd.7 = Input : Sw_1 Alias Pind.7 : Portd.7 = 1
      12. Config Portd.3 = Output : Din_display Alias Portd.3
      13. Config Portd.5 = Output : Clk_display Alias Portd.5
      14. Config Portd.2 = Output : Cs_display Alias Portd.2
      15. Dim W_st(5) As Byte 'anzuzeigende Werte an den einzelnen Stellen
      16. Dim Display_adress As Byte , Display_daten As Byte
      17. Dim N_1 As Byte , N As Byte
      18. Gosub Init_max7219 'Display initialisieren
      19. '----------------- Config DCF77
      20. Config Dcf77 = Pinc.5 , Timer = 1 , Inverted = 0 , Update = 1 , Updatetime = 0 , Gosub = Sectic 'noch nicht fertig
      21. 'Enable Interrupts
      22. Config Date = Dmy , Separator = Dot
      23. Date$ = "16.07.19"
      24. Time$ = "20:24:55" 'deutsches Datumsformat
      25. Dim Neue_sek As Byte
      26. Dim Zehner As Byte , Einer As Byte
      27. const Timer0Reload = 78
      28. config timer0=timer,prescale = 1024
      29. load timer0 , Timer0Reload
      30. on ovf0 Timer0_isr
      31. enable ovf0
      32. Start Timer0
      33. Enable Interrupts
      34. Dim Doppelp As Bit
      35. Dim Zeig_1 As Byte
      36. '#####################################################
      37. Do
      38. '_sec und _min wird erstzt mit _min und _hour
      39. Zehner = _sec Mod 100
      40. Zehner = Zehner / 10
      41. Einer = _sec Mod 10
      42. W_st(4) = Lookup(einer , Segment)
      43. W_st(3) = Lookup(zehner , Segment)
      44. Zehner = _min Mod 100
      45. Zehner = Zehner / 10
      46. Einer = _min Mod 10
      47. W_st(2) = Lookup(einer , Segment)
      48. W_st(1) = Lookup(zehner , Segment)
      49. If Doppelp = 1 Then
      50. W_st(5) = &H60 ' für doppel Punkte
      51. Else
      52. W_st(5) = &H00
      53. End If
      54. Gosub Anzeigen
      55. If Sw_1 = 0 Then Gosub Datum 'Datum anzeigen
      56. If Sw_4 = 0 Then 'Zeit stellen
      57. Bitwait Sw_4 , Set
      58. Do
      59. Zehner = _min Mod 100
      60. Zehner = Zehner / 10
      61. Einer = _min Mod 10
      62. W_st(2) = Lookup(einer , Segment)
      63. W_st(1) = Lookup(zehner , Segment)
      64. W_st(3) = 0
      65. W_st(4) = 0
      66. Gosub Anzeigen
      67. Waitms 100
      68. If Sw_2 = 0 Then
      69. Bitwait Sw_2 , Set
      70. _min = _min + 1
      71. If _min = 60 Then _min = 0
      72. End If
      73. Loop Until Sw_4 = 0
      74. Bitwait Sw_4 , Set
      75. Do
      76. Zehner = _sec Mod 100
      77. Zehner = Zehner / 10
      78. Einer = _sec Mod 10
      79. W_st(4) = Lookup(einer , Segment)
      80. W_st(3) = Lookup(zehner , Segment)
      81. W_st(2) = 0
      82. W_st(1) = 0
      83. Gosub Anzeigen
      84. Waitms 100
      85. If Sw_2 = 0 Then
      86. Bitwait Sw_2 , Set
      87. _sec = _sec + 1
      88. If _sec = 60 Then _sec = 0
      89. End If
      90. Loop Until Sw_4 = 0
      91. Bitwait Sw_4 , Set
      92. End If
      93. Loop
      94. End
      95. '#####################################################
      96. Timer0_isr:
      97. Load Timer0 , Timer0reload
      98. Zeig_1 = Zeig_1 + 1
      99. If Zeig_1 = 50 Then
      100. Toggle Doppelp
      101. Zeig_1 = 0
      102. End If
      103. Return
      104. Anzeigen:
      105. For N_1 = 1 To 5
      106. Display_adress = N_1 : Display_daten = W_st(n_1)
      107. Cs_display = 0
      108. Shiftout Din_display , Clk_display , Display_adress , 1
      109. Shiftout Din_display , Clk_display , Display_daten , 1
      110. Cs_display = 1
      111. Next N_1
      112. Return
      113. Sectic:
      114. Neue_sek = 1
      115. Return
      116. Segment:
      117. ' hex für neue Codierung
      118. Data &H7E , &H30 , &H6D , &H79 , &H33 , &H5B , &H5F , &H70 , &H7F , &H7B
      119. Datum:
      120. Bitwait Sw_1 , Set
      121. Do
      122. Zehner = _day Mod 100
      123. Zehner = Zehner / 10
      124. Einer = _day Mod 10
      125. W_st(2) = Lookup(einer , Segment)
      126. W_st(2) = W_st(2) + &H80 'dp anzeige
      127. W_st(1) = Lookup(zehner , Segment)
      128. Zehner = _month Mod 100
      129. Zehner = Zehner / 10
      130. Einer = _month Mod 10
      131. W_st(4) = Lookup(einer , Segment)
      132. W_st(4) = W_st(4) + &H80 'dp Anzeige
      133. W_st(3) = Lookup(zehner , Segment)
      134. W_st(5) = &H00
      135. Gosub Anzeigen
      136. Loop Until Sw_1 = 0
      137. Bitwait Sw_1 , Set
      138. Do
      139. W_st(1) = &H6D '2
      140. W_st(2) = &H7E '0
      141. Zehner = _year Mod 100
      142. Zehner = Zehner / 10
      143. Einer = _year Mod 10 'Jahr Zehner
      144. W_st(4) = Lookup(einer , Segment) 'jahr Einer
      145. W_st(4) = W_st(4)
      146. W_st(3) = Lookup(zehner , Segment)
      147. W_st(5) = &H00
      148. Gosub Anzeigen
      149. Loop Until Sw_1 = 0
      150. Bitwait Sw_1 , Set
      151. Return
      152. '#################################
      153. 'Initialisieren des MAX7219
      154. Init_max7219:
      155. Display_adress = &H0C : Display_daten = &H00 ' Shutdown On
      156. Cs_display = 0
      157. Shiftout Din_display , Clk_display , Display_adress , 1
      158. Shiftout Din_display , Clk_display , Display_daten , 1
      159. Cs_display = 1
      160. Display_adress = &H09 : Display_daten = &H00 ' bei FF decode "B" für alle Digits,
      161. Cs_display = 0
      162. Shiftout Din_display , Clk_display , display_adress , 1
      163. Shiftout Din_display , Clk_display , Display_daten , 1
      164. Cs_display = 1
      165. Display_adress = &H0A : Display_daten = &H06 ' Helligkeit 0-F
      166. Cs_display = 0
      167. Shiftout Din_display , Clk_display , display_adress , 1
      168. Shiftout Din_display , Clk_display , Display_daten , 1
      169. Cs_display = 1
      170. Display_adress = &H0B : Display_daten = 4 ' Anzahl Digits 6, Zählung startet mit 0
      171. Cs_display = 0
      172. Shiftout Din_display , Clk_display , display_adress , 1
      173. Shiftout Din_display , Clk_display , Display_daten , 1
      174. Cs_display = 1
      175. Display_adress = &H0F : Display_daten = 0 ' Test Off
      176. Cs_display = 0
      177. Shiftout Din_display , Clk_display , display_adress , 1
      178. Shiftout Din_display , Clk_display , Display_daten , 1
      179. Cs_display = 1
      180. Display_adress = &H0C : Display_daten = 1 ' Shutdown Off
      181. Cs_display = 0
      182. Shiftout Din_display , Clk_display , Display_adress , 1
      183. Shiftout Din_display , Clk_display , Display_daten , 1
      184. Cs_display = 1
      185. Return
      Display All
      und noch ein Bild DSCF0656.JPG

      Die Anzeige ist schon auf einer fertigen Platine, die muß ich nur noch modifizieren damit sie ins Gehäuse passt.
    • Hallo daja,

      daja wrote:

      nachdem ich das "MAX7219 Ansteuern "gelesen habe, die IDE angeschmissen und ein bischen Code geschrieben.

      Inzwischen hat Tscho da bestimmt was Neueres Programmiert.
      Beispiel für Initialisieren des MAX7219

      BASCOM Source Code

      1. Dout Alias Portd.7
      2. Max7219_cs Alias Portd.6
      3. Clk Alias Portd.5
      4. Declare Sub Max7219_out(byval Adress As Byte , Byval Cmd As Byte)
      5. Call Max7219_out(&H0c , 0)
      6. Call Max7219_out(&H09 , &H00)
      7. Call Max7219_out(&H0a , &H0F)
      8. Call Max7219_out(&H0b , 7)
      9. Call Max7219_out(&H0f , 0)
      10. Call Max7219_out(&H0c , 1)
      11. Sub Max7219_out(byval Adress As Byte , Byval Cmd As Byte)
      12. Local Z_sub As Byte
      13. Reset Max7219_cs
      14. For Z_sub = 1 To Sum_max7219
      15. Shiftout Dout , Clk , Adress , 1
      16. Shiftout Dout , Clk , Cmd , 1
      17. Next
      18. Set Max7219_cs
      19. End Sub
      Display All

      Für dieses

      BASCOM Source Code

      1. Zehner = _sec Mod 100
      2. Zehner = Zehner / 10
      3. Einer = _sec Mod 10
      4. W_st(4) = Lookup(einer , Segment)
      5. W_st(3) = Lookup(zehner , Segment)


      Kann man auch eine sub verwenden.

      z.B.

      BASCOM Source Code

      1. Declare Sub zerlegen(byval zeit As Byte, , Byval as wert1, , Byval as wert2)
      2. Call zerlegen(_sec,4,3)
      3. Call zerlegen(_min,2,1)
      4. Sub zerlegen(byval zeit As Byte, , Byval as wert1, , Byval as wert2)
      5. Zehner = zeit Mod 100
      6. Zehner = Zehner / 10
      7. Einer = zeit Mod 10
      8. W_st(wert1) = Lookup(einer , Segment)
      9. W_st(wert2) = Lookup(zehner , Segment)
      10. end sub
      Display All
      Gruß
      Businski

      The post was edited 2 times, last by businski ().