Hallo
Wirklich hübsch.
Da ich immer dachte, Charlieplexing mit 100 LED ist zu dunkel, habe ich das nie richtig überdacht. Weil du aber nur ein paar LED für einen Buchstaben anzeigen willst, sieht das ganz anders aus.
Nachdem die Tabellen eine Sackgasse waren (meine Demoversion 1.11.9.8 konnte deine Version mit "Flash used: 50%" übersetzen) nun mein nächster Ansatz, die Charliepins werden in Echtzeit (hoffentlich richtig) berechnet:
Code:
$regfile = "m88def.dat"
$crystal = 8000000
$baud = 19200
Config Portd = Input ' alle Pins auf Z-State setzen
Config Portc = Input ' (Eingang ohne PullUp)
Portc = 0
Portd = 0
'( Pinbelegung
Pin1 Alias Portd.2
Pin2 Alias Portd.3
Pin3 Alias Portd.4
Pin4 Alias Portd.5
Pin5 Alias Portd.6
Pin6 Alias Portc.0
Pin7 Alias Portc.1
Pin8 Alias Portc.2
Pin9 Alias Portc.3
Pin10 Alias Portc.4
Pin11 Alias Portc.5
')
'( Aufteilung der Datenbits
DDRD DDRC PORTD PORTC
Led(001) = &B11000 000000 10000 000000
Led(002) = &B10100 000000 10000 000000
Led(003) = &B10010 000000 10000 000000
Led(004) = &B10001 000000 10000 000000
Led(005) = &B10000 100000 10000 000000
Led(006) = &B10000 010000 10000 000000
Led(007) = &B10000 001000 10000 000000
Led(008) = &B10000 000100 10000 000000
Led(009) = &B10000 000010 10000 000000
Led(010) = &B10000 000001 10000 000000
Led(011) = &B11000 000000 01000 000000
Led(012) = &B01100 000000 01000 000000
Led(013) = &B01010 000000 01000 000000
Led(014) = &B01001 000000 01000 000000
Led(015) = &B01000 100000 01000 000000
Led(016) = &B01000 010000 01000 000000
Led(017) = &B01000 001000 01000 000000
Led(018) = &B01000 000100 01000 000000
Led(019) = &B01000 000010 01000 000000
Led(020) = &B01000 000001 01000 000000
Led(021) = &B10100 000000 00100 000000
Led(022) = &B01100 000000 00100 000000
Led(023) = &B00110 000000 00100 000000
Led(024) = &B00101 000000 00100 000000
Led(025) = &B00100 100000 00100 000000
Led(026) = &B00100 010000 00100 000000
Led(027) = &B00100 001000 00100 000000
Led(028) = &B00100 000100 00100 000000
Led(029) = &B00100 000010 00100 000000
Led(030) = &B00100 000001 00100 000000
Led(031) = &B10010 000000 00010 000000
Led(032) = &B01010 000000 00010 000000
Led(033) = &B00110 000000 00010 000000
Led(034) = &B00011 000000 00010 000000
Led(035) = &B00010 100000 00010 000000
Led(036) = &B00010 010000 00010 000000
Led(037) = &B00010 001000 00010 000000
Led(038) = &B00010 000100 00010 000000
Led(039) = &B00010 000010 00010 000000
Led(040) = &B00010 000001 00010 000000
Led(041) = &B10001 000000 00001 000000
Led(042) = &B01001 000000 00001 000000
Led(043) = &B00101 000000 00001 000000
Led(044) = &B00011 000000 00001 000000
Led(045) = &B00001 100000 00001 000000
Led(046) = &B00001 010000 00001 000000
Led(047) = &B00001 001000 00001 000000
Led(048) = &B00001 000100 00001 000000
Led(049) = &B00001 000010 00001 000000
Led(050) = &B00001 000001 00001 000000
Led(051) = &B10000 100000 00000 100000
Led(052) = &B01000 100000 00000 100000
Led(053) = &B00100 100000 00000 100000
Led(054) = &B00010 100000 00000 100000
Led(055) = &B00001 100000 00000 100000
Led(056) = &B00000 110000 00000 100000
Led(057) = &B00000 101000 00000 100000
Led(058) = &B00000 100100 00000 100000
Led(059) = &B00000 100010 00000 100000
Led(060) = &B00000 100001 00000 100000
Led(061) = &B10000 010000 00000 010000
Led(062) = &B01000 010000 00000 010000
Led(063) = &B00100 010000 00000 010000
Led(064) = &B00010 010000 00000 010000
Led(065) = &B00001 010000 00000 010000
Led(066) = &B00000 110000 00000 010000
Led(067) = &B00000 011000 00000 010000
Led(068) = &B00000 010100 00000 010000
Led(069) = &B00000 010010 00000 010000
Led(070) = &B00000 010001 00000 010000
Led(071) = &B10000 001000 00000 001000
Led(072) = &B01000 001000 00000 001000
Led(073) = &B00100 001000 00000 001000
Led(074) = &B00010 001000 00000 001000
Led(075) = &B00001 001000 00000 001000
Led(076) = &B00000 101000 00000 001000
Led(077) = &B00000 011000 00000 001000
Led(078) = &B00000 001100 00000 001000
Led(079) = &B00000 001010 00000 001000
Led(080) = &B00000 001001 00000 001000
Led(081) = &B10000 000100 00000 000100
Led(082) = &B01000 000100 00000 000100
Led(083) = &B00100 000100 00000 000100
Led(084) = &B00010 000100 00000 000100
Led(085) = &B00001 000100 00000 000100
Led(086) = &B00000 100100 00000 000100
Led(087) = &B00000 010100 00000 000100
Led(088) = &B00000 001100 00000 000100
Led(089) = &B00000 000110 00000 000100
Led(090) = &B00000 000101 00000 000100
Led(091) = &B10000 000010 00000 000010
Led(092) = &B01000 000010 00000 000010
Led(093) = &B00100 000010 00000 000010
Led(094) = &B00010 000010 00000 000010
Led(095) = &B00001 000010 00000 000010
Led(096) = &B00000 100010 00000 000010
Led(097) = &B00000 010010 00000 000010
Led(098) = &B00000 001010 00000 000010
Led(099) = &B00000 000110 00000 000010
Led(100) = &B00000 000011 00000 000010
')
'( Inhalt der Databytes
Data_ddrd(LED_Nr) &Bx65432xx ' x wird durch 0 ersetzt!
Data_ddrc(LED-Nr) &Bxx543210
Data_portd(LED_Nr) &Bx65432xx
Data_portc(LED_Nr) &Bxx543210
')
Dim Data_ddrd As Byte , Data_ddrc As Byte , Data_portd As Byte , Data_portc As Byte
Dim Temp_ddrd As Byte , Temp_ddrc As Byte , Temp_portd As Byte , Temp_portc As Byte
Dim Bildspeicher(12) As Word
Dim Bytenr As Byte , Bitnr As Byte , Lednr As Byte
Dim Zaehler_anzeigen As Word , Zaehler_scrollen As Byte
Dim Temp As Byte , N As Byte
Declare Sub Set_led(byval Lednr As Byte)
Declare Sub Berechne_charliedata(byval Lednr As Byte)
Declare Sub Set_bildspeicher
Declare Sub Anzeigen
Declare Sub Scrollen_links(byval Wiederholen As Byte)
Declare Sub Scrollen_runter(byval Wiederholen As Byte)
Sub Set_bildspeicher ' Bildbereich: y=Word 2-11 x=Bit 10-1 (+ Rand zum Scrollen)
'Bildspeicher(0) = &B109876543210
Bildspeicher(01) = &B000000000000
Bildspeicher(02) = &B011111111110
Bildspeicher(03) = &B010000000010
Bildspeicher(04) = &B010111000010
Bildspeicher(05) = &B010100100010
Bildspeicher(06) = &B010111000010
Bildspeicher(07) = &B010100100010
Bildspeicher(08) = &B010100100010
Bildspeicher(09) = &B010111000010
Bildspeicher(10) = &B010000000010
Bildspeicher(11) = &B011111111110
Bildspeicher(12) = &B000000000000
End Sub
Do
For N = 1 To 100 ' LED nacheinander setzen
Set_led N ' (erstmal klein anfangen ;)
Waitms 500
Next N
'( Set_bildspeicher ' B anzeigen
For Zaehler_anzeigen = 0 To 10000
Anzeigen
Next Zaehler_anzeigen
Set_bildspeicher 'nach links scrollen mit Umlauf
For Zaehler_scrollen = 0 To 55
For Zaehler_anzeigen = 0 To 1000
Anzeigen
Next Zaehler_anzeigen
Scrollen_links 1
Next Zaehler_scrollen
Set_bildspeicher ' nach links rausschieben
For Zaehler_scrollen = 0 To 10
For Zaehler_anzeigen = 0 To 2000
Anzeigen
Next Zaehler_anzeigen
Scrollen_links 0
Next Zaehler_scrollen
Set_bildspeicher 'runterscrollen mit Umlauf
For Zaehler_scrollen = 0 To 55
For Zaehler_anzeigen = 0 To 1000
Anzeigen
Next Zaehler_anzeigen
Scrollen_runter 1
Next Zaehler_scrollen
Set_bildspeicher ' nach unten rausschieben
For Zaehler_scrollen = 0 To 10
For Zaehler_anzeigen = 0 To 2000
Anzeigen
Next Zaehler_anzeigen
Scrollen_runter 0
Next Zaehler_scrollen
')
Loop
End
Sub Anzeigen
For Bytenr = 2 To 11 ' sichtbare Bytes im Bildspeicher von oben nach unten
For Bitnr = 1 To 10 ' sichtbare Bits im Bildspeicher von rechts nach links
If Bildspeicher(bytenr).bitnr = 1 Then ' wenn Bit im Bildspeicher gesetzt dann ausgeben
'LED Nummer berechnen: LED1 oben rechts, LED10 unten rechts, LED91 oben links, LED100 unten links
Temp = Bitnr - 1 ' LED1 ist in Spalte 0
Temp = Temp * 10 ' 10 Leds pro Spalte,
Lednr = Bytenr - 1 ' LED1 befindet sich in Bildspeicher(2), LED2 in Bildspeicher(3) usw.
Lednr = Lednr + Temp ' Spalten + Zeilen
Set_led Lednr ' Ausgelagert
End If
Next Bitnr
Next Bytenr
End Sub
Sub Set_led(byval Lednr As Byte)
If Lednr > 0 Then
If Lednr < 101 Then
' Charlieplexing Daten für gewünschte LED berechen
Berechne_charliedata Lednr ' ??? Ob das so klappt?
Temp_ddrc = Ddrd And &B11000000 ' die nicht verwendeten Bits merken
Temp_ddrd = Ddrc And &B10000011
Temp_portc = Portd And &B11000000
Temp_portd = Portc And &B10000011
Ddrd = Temp_ddrd ' vorsichtshalber alle Charliepins auf Z-State setzen
Ddrc = Temp_ddrc ' die nicht verwendeten Pins bleiben unberührt
Portd = Temp_portd ' (könnte man aus Zeitgründen eventuell weglassen)
Portc = Temp_portc
Ddrd = Temp_ddrd Or Data_ddrd ' Charliepins der LED setzen
Ddrc = Temp_ddrc Or Data_ddrc ' die nicht verwendeten Pins bleiben unberührt
Portd = Temp_portd Or Data_portd
Portc = Temp_portc Or Data_portc
End If
End If
End Sub
Sub Berechne_charliedata(byval Lednr As Byte)
Data_ddrc = 0
Data_ddrd = 0
Data_portc = 0
Data_portd = 0
Incr Lednr ' Achtung, die LED-Zählung beginnt nun bei null
Temp = Lednr / 10 ' Pin für Port Ausgang High berechnen
If Temp < 5 Then ' Led 0-49 verwenden Portd
Data_portd.6 = 1
Shift Data_portd , Right , Temp
Else
Temp = Temp - 5 ' Led 50-99 verwenden Portc
Data_portc.5 = 1
Shift Data_portc , Right , Temp
End If
Temp = Lednr Mod 10 ' DDR-Pin für Low-Ausgang suchen
If Temp < 5 Then ' Led 0-49 verwenden DDRD
Data_ddrd.6 = 1
Shift Data_ddrd , Right , Temp
If Data_ddrd = Data_portd Then 'wenn High-Pin und Low-Pin derselbe sind
If Temp = 4 Then 'wenn rechtes Bit in ddrd dann Übertrag nach ddrc
Data_ddrd = 0
Data_ddrc.5 = 1 ' der High-Pin wird trotzdem in DDRD eingetragen!
Else
Shift Data_ddrd , Right , 1 ' sonst Low-Ausgang noch eins weiterschieben
End If
Data_ddrd = Data_ddrd Or Data_portd ' Den High-Pin auch ins DDRD eintragen
Else
Temp = Temp - 5 ' Led 50-99 verwenden DDRC
Data_portc.5 = 1
Shift Data_ddrc , Right , Temp
If Data_ddrc = Data_portc Then 'wenn High-Pin und Low-Pin derselbe sind
Shift Data_ddrc , Right , 1 ' Low-Ausgang weiterschieben
End If
Data_ddrc = Data_ddrc Or Data_portc ' Den High-Pin auch ins DDRC eintragen
End If
End If
End Sub
Sub Scrollen_links(byval Wiederholen As Byte)
For N = 2 To 11
If Wiederholen = 1 Then
Bildspeicher(n).0 = Bildspeicher(n).11
Else
Bildspeicher(n).0 = 0
End If
Bildspeicher(n) = Bildspeicher(n) * 2
Next N
End Sub
Sub Scrollen_runter(byval Wiederholen As Byte)
If Wiederholen = 1 Then
Bildspeicher(1) = Bildspeicher(12)
Else
Bildspeicher(1) = 0
End If
For N = 12 To 2 Step -1
Bildspeicher(n) = Bildspeicher(n - 1)
Next N
End Sub
(Ungetestet und ohne Gewähr!)
Die Ausgabe wird für
LED1 oben rechts
LED10 unten rechts
LED91 oben links
LED100 unten links
berechnet. Flush used: 19%
Gruß
mic
Lesezeichen