-
Hallo Xeus,
Ich denke der Code hilft dir. Ist allerdings auf die max. Anzahl von 8 Segmenten zugeschnitten, die allerdings gruppenweise zu je 4 gesteuert werden. Der wichtigste Teil ist die sub Send_bytes...Daraus kannst Du erkennen, wie der angesteuert wird. Ansonsten müsste es einfach sein - ganz gut kommentiert, hoffe ich - sich das rauszusuchen, was man braucht.
Man benötigt das Datenblatt, um die vielen Befehle zu erfahren. Man kann damit sogar quasi dimmen: Gleitend von Dunkel nach Hell die Helligkeit hochfahren. Find ich ganz lustig. Daran ist irgendein Widerstand beteiligt. Welchen, weiß ich momentan nicht mehr. Man kann aber erst einmal den vorgeschlagenen Wert nehmen. Ansonsten liebe ich dieses Teil. Einfacher kann man hardwaremäßig eine 8-stellige Anzeige kaum aufbauen, außer vielleicht mit dem saa 1064, aber der kann nur 4.
Code:
$regfile = "m32def.dat"
$baud = 19200
$crystal = 16000000
Const Displays = 4
Const Dezpunkt = 3
Declare Sub Send_bytes(byval Bytes As Word)
Declare Sub Alle_aus
Declare Sub Display_zeichen_bilden
Declare Sub Ausgabe
Dim I As Byte , Z As Byte , Wert As Word
Dim Temp As Byte
Dim Display_zeichen(displays)as Byte
Dim Grad As Single
Dim Temp_anzeige As String * Displays1
Dim Zähler As Byte
'***** für MAX-Init-Befehle
Dim A(5) As Word
Config Portc = Output
Clock_max Alias Portc.5 ' clock
Data_out_max Alias Portc.7 ' din
Load_max Alias Portc.6 ' load
'***** es werden immer 2 Bytes auf einmal abgeschickt
'***** deshalb Dimensionierung mit word
'*** erst alle aus
Alle_aus
'**** wichtig, falls vorher im Shutdown-Modus!!!
'**** geht beim Ausschalten da manchmal rein
'**** Befehle werden ausgeführt, aber man sieht nichts!!!!
'*** also zuerst in den Normalmodus
A(1) = &H0C01 '**** Normalmodus
A(2) = &H0B04 '**** Anzahl 4 Digits
A(3) = &H090F '**** Dekodiermodus für die ersten 4
A(4) = &H0A0F '**** Helligkeit, volle Kanne bei ISEG=10K
A(5) = &H0F00 '***** in den Displaymode
'**** Init Bargraf
For I = 1 To 5
Send_bytes A(i)
Next
'**** Versuch mit Grad-Anzeige
Grad = -5.4756
Temp_anzeige = Fusing(grad , "##.#" ) '**** um aufzurunden!
'**** Decodieren nicht nötig
Display_zeichen_bilden
Do
Wait 2
Alle_aus
'***** Testweise alle Zeichen zeigen
For Z = 1 To Displays
For I = 0 To 14
'Wert = Z * 256
'Wert = Wert + I
Wert = Makeint(i , Z)
Send_bytes Wert
Waitms 500
Next
Next
Alle_aus
'**** Gradzahl ausgeben
Ausgabe
Loop
End
Sub Send_bytes(byval Bytes As Word)
Reset Load_max
'**** masb first, clock goes high
Shiftout Data_out_max , Clock_max , Bytes , 1 , 16 , 5
Set Load_max
'Waitms 200
End Sub
Sub Alle_aus
For Z = 1 To 8
'**** 2. Byte immer 0
'Wert = Z * 256
'Wert = Wert + 15
Wert = Makeint(15 , Z) '**** geht schneller!!!
Send_bytes Wert
'Waitms 500
Next
End Sub
Sub Display_zeichen_bilden
Local Temp_zeichen As String * 1
'**** erst Array löschen
For Z = 1 To Displays
Display_zeichen(z) = ""
Next
'***** rückwärts den TempWert durchgehen
Zähler = Displays
For Z = Len(temp_anzeige) To 1 Step -1
Temp_zeichen = Mid(temp_anzeige , Z , 1)
'*** nur wenn kein Dez.Punkt, übernehmen
If Temp_zeichen <> "." Then
Display_zeichen(zähler) = Temp_zeichen
Decr Zähler
End If
Next
'**** fehlende Zeichen sind nun leere Strings!!!
End Sub
Sub Ausgabe
Local Zeichen As Byte
For Z = 1 To Displays
Zeichen = Display_zeichen(z)
If Zeichen = "" Then
'**** Blank
Temp = 15
Elseif Zeichen = "-" Then
Temp = 10
Else
Temp = Val(zeichen)
End If
'**** Dez.Punkt
If Z = Dezpunkt Then
Temp = Temp Or 128
End If
'Wert = Z * 256
'Wert = Wert + Temp
Wert = Makeint(temp , Z) '**** geht wesentlich schneller!!!
Send_bytes Wert
Waitms 200
Next
End Sub
Wolfgang
-
Danke, entlich jemand, der versteht was ich mein.
Ich werd mir den code mal anschauen, und versuchen ihn nachzuvollziehen.
nochmal vielen dank
-
beim dimmern ist kein widerstand vorhanden. die leuchtbalken werden gepulst. es fliesst nicht immer ein strom voller strom. wenn nämlich alle leuchtbalken an sind (dauerstrom) würden die bauteile zu warm und kaputt ghen.