PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 10x10 Charlieplexed LED anzeige ansteuern



Boromir
13.04.2013, 11:58
Guten tag, ich habe eine 10x10 Charlieplexed LED anzeige gebaut mit dieser Zeichnung:
25116

Meine microcontroller ist eine ATmega88 und es gibt 11 Tri-State-Pin verwendet:
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

Tri-state ist X, 0, 1
X = nichts
0 = 0 volt
1 = 5 volt

Problem:
Mein Programm ist zu groß und nicht optimal. Mijn Ziel ist um text auf anzeige von rechts nach links.

Kennt ihr vielleicht eine Möglichkeit das Programm effektiver zu schreiben?

Vielen Dank für eure Hilfe

(Dieser Code-Anzeige, den Buchstaben 'B' von rechts nach links)



$regfile = "m88def.dat"
$crystal = 8000000
$baud = 19200
Dim A As Byte , B As Word , C As Word
Config Portd = Input
Config Portc = Input

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

Statepin1 Alias Ddrd.2
Statepin2 Alias Ddrd.3
Statepin3 Alias Ddrd.4
Statepin4 Alias Ddrd.5
Statepin5 Alias Ddrd.6
Statepin6 Alias Ddrc.0
Statepin7 Alias Ddrc.1
Statepin8 Alias Ddrc.2
Statepin9 Alias Ddrc.3
Statepin10 Alias Ddrc.4
Statepin11 Alias Ddrc.5

A = 0.5
B = 0
C = 750

'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Do
For B = 0 To C Step 1
Gosub Led92
Gosub Led93
Gosub Led94
Gosub Led95
Gosub Led96
Gosub Led97
Gosub Led98
Next

For B = 0 To C Step 1
Gosub Led82
Gosub Led83
Gosub Led84
Gosub Led85
Gosub Led86
Gosub Led87
Gosub Led88
Gosub Led92
Gosub Led95
Gosub Led98
Next

For B = 0 To C Step 1
Gosub Led72
Gosub Led73
Gosub Led74
Gosub Led75
Gosub Led76
Gosub Led77
Gosub Led78
Gosub Led82
Gosub Led85
Gosub Led88
Gosub Led92
Gosub Led95
Gosub Led98
Next

For B = 0 To C Step 1
Gosub Led62
Gosub Led63
Gosub Led64
Gosub Led65
Gosub Led66
Gosub Led67
Gosub Led68
Gosub Led72
Gosub Led75
Gosub Led78
Gosub Led82
Gosub Led85
Gosub Led88
Gosub Led93
Gosub Led94
Gosub Led96
Gosub Led97
Next

For B = 0 To C Step 1
Gosub Led52
Gosub Led53
Gosub Led54
Gosub Led55
Gosub Led56
Gosub Led57
Gosub Led58
Gosub Led62
Gosub Led65
Gosub Led68
Gosub Led72
Gosub Led75
Gosub Led78
Gosub Led83
Gosub Led84
Gosub Led86
Gosub Led87
Next

For B = 0 To C Step 1
Gosub Led42
Gosub Led43
Gosub Led44
Gosub Led45
Gosub Led46
Gosub Led47
Gosub Led48
Gosub Led52
Gosub Led55
Gosub Led58
Gosub Led62
Gosub Led65
Gosub Led68
Gosub Led73
Gosub Led74
Gosub Led76
Gosub Led77
Next

For B = 0 To C Step 1
Gosub Led32
Gosub Led33
Gosub Led34
Gosub Led35
Gosub Led36
Gosub Led37
Gosub Led38
Gosub Led42
Gosub Led45
Gosub Led48
Gosub Led52
Gosub Led55
Gosub Led58
Gosub Led63
Gosub Led64
Gosub Led66
Gosub Led67
Next

For B = 0 To C Step 1
Gosub Led22
Gosub Led23
Gosub Led24
Gosub Led25
Gosub Led26
Gosub Led27
Gosub Led28
Gosub Led32
Gosub Led35
Gosub Led38
Gosub Led42
Gosub Led45
Gosub Led48
Gosub Led53
Gosub Led54
Gosub Led56
Gosub Led57
Next

For B = 0 To C Step 1
Gosub Led12
Gosub Led13
Gosub Led14
Gosub Led15
Gosub Led16
Gosub Led17
Gosub Led18
Gosub Led22
Gosub Led25
Gosub Led28
Gosub Led32
Gosub Led35
Gosub Led38
Gosub Led43
Gosub Led44
Gosub Led46
Gosub Led47
Next

For B = 0 To C Step 1
Gosub Led2
Gosub Led3
Gosub Led4
Gosub Led5
Gosub Led6
Gosub Led7
Gosub Led8
Gosub Led12
Gosub Led15
Gosub Led18
Gosub Led22
Gosub Led25
Gosub Led28
Gosub Led33
Gosub Led34
Gosub Led36
Gosub Led37
Next

For B = 0 To C Step 1
Gosub Led2
Gosub Led5
Gosub Led8
Gosub Led12
Gosub Led15
Gosub Led18
Gosub Led23
Gosub Led24
Gosub Led26
Gosub Led27
Next

For B = 0 To C Step 1
Gosub Led2
Gosub Led5
Gosub Led8
Gosub Led13
Gosub Led14
Gosub Led16
Gosub Led17
Next

For B = 0 To C Step 1
Gosub Led3
Gosub Led4
Gosub Led6
Gosub Led7
Next
Loop
End

'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


Restart:
Waitms A
Portd.2 = 0
Portd.3 = 0
Portd.4 = 0
Portd.5 = 0
Portd.6 = 0
Portc.0 = 0
Portc.1 = 0
Portc.2 = 0
Portc.3 = 0
Portc.4 = 0
Portc.5 = 0
Ddrd.2 = 0
Ddrd.3 = 0
Ddrd.4 = 0
Ddrd.5 = 0
Ddrd.6 = 0
Ddrc.0 = 0
Ddrc.1 = 0
Ddrc.2 = 0
Ddrc.3 = 0
Ddrc.4 = 0
Ddrc.5 = 0
Return

Led0:
gosub restart
Return

Led1:
Statepin1 = 1
Statepin2 = 1
Pin1 = 1
gosub restart
Return

Led2:
Statepin1 = 1
Statepin3 = 1
Pin1 = 1
gosub restart
Return

Led3:
Statepin1 = 1
Statepin4 = 1
Pin1 = 1
gosub restart
Return

Led4:
Statepin1 = 1
Statepin5 = 1
Pin1 = 1
gosub restart
Return

Led5:
Statepin1 = 1
Statepin6 = 1
Pin1 = 1
gosub restart
Return

Led6:
Statepin1 = 1
Statepin7 = 1
Pin1 = 1
gosub restart
Return

Led7:
Statepin1 = 1
Statepin8 = 1
Pin1 = 1
gosub restart
Return

Led8:
Statepin1 = 1
Statepin9 = 1
Pin1 = 1
gosub restart
Return

Led9:
Statepin1 = 1
Statepin10 = 1
Pin1 = 1
gosub restart
Return

Led10:
Statepin1 = 1
Statepin11 = 1
Pin1 = 1
gosub restart
Return

Led11:
Statepin1 = 1
Statepin2 = 1
Pin2 = 1
gosub restart
Return

Led12:
Statepin3 = 1
Statepin2 = 1
Pin2 = 1
gosub restart
Return

Led13:
Statepin4 = 1
Statepin2 = 1
Pin2 = 1
gosub restart
Return

Led14:
Statepin5 = 1
Statepin2 = 1
Pin2 = 1
gosub restart
Return

Led15:
Statepin6 = 1
Statepin2 = 1
Pin2 = 1
gosub restart
Return

Led16:
Statepin7 = 1
Statepin2 = 1
Pin2 = 1
gosub restart
Return

Led17:
Statepin8 = 1
Statepin2 = 1
Pin2 = 1
gosub restart
Return

Led18:
Statepin9 = 1
Statepin2 = 1
Pin2 = 1
gosub restart
Return

Led19:
Statepin10 = 1
Statepin2 = 1
Pin2 = 1
gosub restart
Return

Led20:
Statepin11 = 1
Statepin2 = 1
Pin2 = 1
gosub restart
Return

Led21:
Statepin1 = 1
Statepin3 = 1
Pin3 = 1
gosub restart
Return

Led22:
Statepin2 = 1
Statepin3 = 1
Pin3 = 1
gosub restart
Return

Led23:
Statepin4 = 1
Statepin3 = 1
Pin3 = 1
gosub restart
Return

Led24:
Statepin5 = 1
Statepin3 = 1
Pin3 = 1
gosub restart
Return

Led25:
Statepin6 = 1
Statepin3 = 1
Pin3 = 1
gosub restart
Return

Led26:
Statepin7 = 1
Statepin3 = 1
Pin3 = 1
gosub restart
Return

Led27:
Statepin8 = 1
Statepin3 = 1
Pin3 = 1
gosub restart
Return

Led28:
Statepin9 = 1
Statepin3 = 1
Pin3 = 1
gosub restart
Return

Led29:
Statepin10 = 1
Statepin3 = 1
Pin3 = 1
gosub restart
Return

Led30:
Statepin11 = 1
Statepin3 = 1
Pin3 = 1
gosub restart
Return

Led31:
Statepin1 = 1
Statepin4 = 1
Pin4 = 1
gosub restart
Return

Led32:
Statepin2 = 1
Statepin4 = 1
Pin4 = 1
gosub restart
Return

Led33:
Statepin3 = 1
Statepin4 = 1
Pin4 = 1
gosub restart
Return

Led34:
Statepin5 = 1
Statepin4 = 1
Pin4 = 1
gosub restart
Return

Led35:
Statepin6 = 1
Statepin4 = 1
Pin4 = 1
gosub restart
Return

Led36:
Statepin7 = 1
Statepin4 = 1
Pin4 = 1
gosub restart
Return

Led37:
Statepin8 = 1
Statepin4 = 1
Pin4 = 1
gosub restart
Return

Led38:
Statepin9 = 1
Statepin4 = 1
Pin4 = 1
gosub restart
Return

Led39:
Statepin10 = 1
Statepin4 = 1
Pin4 = 1
gosub restart
Return

Led40:
Statepin11 = 1
Statepin4 = 1
Pin4 = 1
gosub restart
Return

Led41:
Statepin1 = 1
Statepin5 = 1
Pin5 = 1
gosub restart
Return

Led42:
Statepin2 = 1
Statepin5 = 1
Pin5 = 1
gosub restart
Return

Led43:
Statepin3 = 1
Statepin5 = 1
Pin5 = 1
gosub restart
Return

Led44:
Statepin4 = 1
Statepin5 = 1
Pin5 = 1
gosub restart
Return

Led45:
Statepin6 = 1
Statepin5 = 1
Pin5 = 1
gosub restart
Return

Led46:
Statepin7 = 1
Statepin5 = 1
Pin5 = 1
gosub restart
Return

Led47:
Statepin8 = 1
Statepin5 = 1
Pin5 = 1
gosub restart
Return

Led48:
Statepin9 = 1
Statepin5 = 1
Pin5 = 1
gosub restart
Return

Led49:
Statepin10 = 1
Statepin5 = 1
Pin5 = 1
gosub restart
Return

Led50:
Statepin11 = 1
Statepin5 = 1
Pin5 = 1
gosub restart
Return

Led51:
Statepin1 = 1
Statepin6 = 1
Pin6 = 1
gosub restart
Return

Led52:
Statepin2 = 1
Statepin6 = 1
Pin6 = 1
gosub restart
Return

Led53:
Statepin3 = 1
Statepin6 = 1
Pin6 = 1
gosub restart
Return

Led54:
Statepin4 = 1
Statepin6 = 1
Pin6 = 1
gosub restart
Return

Led55:
Statepin5 = 1
Statepin6 = 1
Pin6 = 1
gosub restart
Return

Led56:
Statepin7 = 1
Statepin6 = 1
Pin6 = 1
gosub restart
Return

Led57:
Statepin8 = 1
Statepin6 = 1
Pin6 = 1
gosub restart
Return

Led58:
Statepin9 = 1
Statepin6 = 1
Pin6 = 1
gosub restart
Return

Led59:
Statepin10 = 1
Statepin6 = 1
Pin6 = 1
gosub restart
Return

Led60:
Statepin11 = 1
Statepin6 = 1
Pin6 = 1
gosub restart
Return

Led61:
Statepin1 = 1
Statepin7 = 1
Pin7 = 1
gosub restart
Return

Led62:
Statepin2 = 1
Statepin7 = 1
Pin7 = 1
gosub restart
Return

Led63:
Statepin3 = 1
Statepin7 = 1
Pin7 = 1
gosub restart
Return

Led64:
Statepin4 = 1
Statepin7 = 1
Pin7 = 1
gosub restart
Return

Led65:
Statepin5 = 1
Statepin7 = 1
Pin7 = 1
gosub restart
Return

Led66:
Statepin6 = 1
Statepin7 = 1
Pin7 = 1
gosub restart
Return

Led67:
Statepin8 = 1
Statepin7 = 1
Pin7 = 1
gosub restart
Return

Led68:
Statepin9 = 1
Statepin7 = 1
Pin7 = 1
gosub restart
Return

Led69:
Statepin10 = 1
Statepin7 = 1
Pin7 = 1
gosub restart
Return

Led70:
Statepin11 = 1
Statepin7 = 1
Pin7 = 1
gosub restart
Return

Led71:
Statepin1 = 1
Statepin8 = 1
Pin8 = 1
gosub restart
Return

Led72:
Statepin2 = 1
Statepin8 = 1
Pin8 = 1
gosub restart
Return

Led73:
Statepin3 = 1
Statepin8 = 1
Pin8 = 1
gosub restart
Return

Led74:
Statepin4 = 1
Statepin8 = 1
Pin8 = 1
gosub restart
Return

Led75:
Statepin5 = 1
Statepin8 = 1
Pin8 = 1
gosub restart
Return

Led76:
Statepin6 = 1
Statepin8 = 1
Pin8 = 1
gosub restart
Return

Led77:
Statepin7 = 1
Statepin8 = 1
Pin8 = 1
gosub restart
Return

Led78:
Statepin9 = 1
Statepin8 = 1
Pin8 = 1
gosub restart
Return

Led79:
Statepin10 = 1
Statepin8 = 1
Pin8 = 1
gosub restart
Return

Led80:
Statepin11 = 1
Statepin8 = 1
Pin8 = 1
gosub restart
Return

Led81:
Statepin1 = 1
Statepin9 = 1
Pin9 = 1
gosub restart
Return

Led82:
Statepin2 = 1
Statepin9 = 1
Pin9 = 1
gosub restart
Return

Led83:
Statepin3 = 1
Statepin9 = 1
Pin9 = 1
gosub restart
Return

Led84:
Statepin4 = 1
Statepin9 = 1
Pin9 = 1
gosub restart
Return

Led85:
Statepin5 = 1
Statepin9 = 1
Pin9 = 1
gosub restart
Return

Led86:
Statepin6 = 1
Statepin9 = 1
Pin9 = 1
gosub restart
Return

Led87:
Statepin7 = 1
Statepin9 = 1
Pin9 = 1
gosub restart
Return

Led88:
Statepin8 = 1
Statepin9 = 1
Pin9 = 1
gosub restart
Return

Led89:
Statepin10 = 1
Statepin9 = 1
Pin9 = 1
gosub restart
Return

Led90:
Statepin11 = 1
Statepin9 = 1
Pin9 = 1
gosub restart
Return

Led91:
Statepin1 = 1
Statepin10 = 1
Pin10 = 1
gosub restart
Return

Led92:
Statepin2 = 1
Statepin10 = 1
Pin10 = 1
gosub restart
Return

Led93:
Statepin3 = 1
Statepin10 = 1
Pin10 = 1
gosub restart
Return

Led94:
Statepin4 = 1
Statepin10 = 1
Pin10 = 1
gosub restart
Return

Led95:
Statepin5 = 1
Statepin10 = 1
Pin10 = 1
gosub restart
Return

Led96:
Statepin6 = 1
Statepin10 = 1
Pin10 = 1
gosub restart
Return

Led97:
Statepin7 = 1
Statepin10 = 1
Pin10 = 1
gosub restart
Return

Led98:
Statepin8 = 1
Statepin10 = 1
Pin10 = 1
gosub restart
Return

Led99:
Statepin9 = 1
Statepin10 = 1
Pin10 = 1
gosub restart
Return

Led100:
Statepin11 = 1
Statepin10 = 1
Pin10 = 1
gosub restart
Return

radbruch
13.04.2013, 12:22
Hallo

Das wichtigste zuerst: Das ist kein Charliplexing! Das ist eine ganz normale Matrix.

Leider kann ich dir kein Beispiel in Bascom anbieten.

Der Trick ist die Verwendung eines Bildspeichers. Darin werden die einzelnen LED durch Bits repräsentiert. Um etwas anzuzeigen setzt du die entsprechenden Bits und kopierst dann den Inhalt des Bildspeichers in einem Rutsch auf die LED-Matrix. Hier kannst du dich mal ins Thema einlesen:

https://www.roboternetz.de/community/threads/55286-LED-Matrix-m%C3%B6glichst-effizient-ansteuern?p=528611&viewfull=1#post528611

Gruß

mic

P.S.: Hoppla, mein Beispiel ist ja doch in Bascom geschrieben (weitere Beiträge beachten!), allerdings für eine Matrix mit 11 Zeilen in 9 Spalten...

Boromir
13.04.2013, 12:56
Das wichtigste zuerst: Das ist kein Charliplexing! Das ist eine ganz normale Matrix.


Eine normale 10x10 LED Matrix hat 20 pins notig:
(Dies ist ein 8x8, weil ich nicht finden konnte 10x10)
https://www.roboternetz.de/community/attachment.php?attachmentid=25117


Mein Charlieplexed 10x10 LED Matrix hat aber 11 pins notig:
https://www.roboternetz.de/community/attachment.php?attachmentid=25116

radbruch
13.04.2013, 13:25
Hallo

Hier wird Charlieplexing erklärt:

http://www.josepino.com/?how_control_leds

Meine Umsetzungen mit 12 LED an 4 Pins:

http://www.youtube.com/watch?v=ZPYhrQl-d4M
http://www.youtube.com/watch?v=r54xOzr0VDA
http://www.youtube.com/watch?v=uwCx0GrFykU

(Alle Links aus https://www.roboternetz.de/community/threads/46211-LED-Matrix-am-RP6?p=443747&viewfull=1#post443747)

Gruß

mic

P.S.: Oh, sorry. Du hast recht! Es ist charlieplexing!

Das ändert aber nur die Art, wie man die Daten aus dem Bildspeicher in die LEDs kopiert. Anstelle der Spaltenausgabe muss man dann alle LEDs einzeln ansteuern. Bei 100 LED dauert das etwas und wird vermutlich nicht sehr hell werden.

- - - Aktualisiert - - -

Hallo

Da ich mich hier mal wieder als schlechten Durchleser geoutet habe, möchte ich versuchen, das wieder auszugleichen. Mein Ansatz für eine optimierte Ausgabe (allerdings nur mit 4 Pins/12 Leds):


' Charlieplexing
Declare Sub Charlie(byval Bitnr As Byte)
Dim Charliedata(12) As Byte ' Bitmuster fürs Charlieplexing an PC0 bis PC3
Charliedata(01) = &B11001000 ' Highnipple ist DDR, Lownipple ist Port
Charliedata(02) = &B10101000
Charliedata(03) = &B10011000
Charliedata(04) = &B11000100
Charliedata(05) = &B01100100
Charliedata(06) = &B01010100
Charliedata(07) = &B10100010
Charliedata(08) = &B01100010
Charliedata(09) = &B00110010
Charliedata(10) = &B10010001
Charliedata(11) = &B01010001
Charliedata(12) = &B00110001

Sub Charlie(byval Bitnr As Byte) ' Bitnummer 0-11
Incr Bitnr ' Startindex bei Arrays ist 1!
Ddrc = 0
Portc = 0
If Bitnr > 0 Then
If Bitnr < 13 Then
Ddrc = Charliedata(bitnr) / 16
Portc = Charliedata(bitnr) And 15
End If
End If
End Sub

(Code aus https://www.roboternetz.de/community/threads/43885-ProBot-mit-asuro-Mega8?p=519240&viewfull=1#post519240)

Der "Trick": Für jede LED wird der Status des DDR- und des PORT-Registers gespeichert. Bei der Ausgabe ist der übergebene Parameter gleich der Nummer der angesprochenen LED. Da ich vier Pins verwende kann ich die Daten in einem Byte speichern und verwende deshalb nur ein Bytearray.

Für 11 Pins könnte man das Array in ein PORT- und ein DDR-Array mit jeweils 16 Bit (von denen man nur 11 verwendet) aufteilen. Das Belegen der Arrays könnte man dann automatisch per Programm machen. Wenn man das geschafft hat, könnte man auch die Kombinationen in Echtzeit berechnen und ausgeben ohne sie zuvor in den Arrays abzulegen.

Noch eine kleine Zugabe: Da pro Port einmal 5 und einmal 6 aufeinanderfolgende Pins verwendet werden, würde sich die Verwendung von zwei 16-Bit Arrays anbieten: Je ein Array pro Port, im Highbyte der Wert fürs DDR, im Lowbyte der Wert für den PORT. Bei 100 LED wären das 400 Byte plus die 20 Byte für einen 10*16Bit Bildspeicher.

Gruß

mic

Boromir
13.04.2013, 14:39
Dies ist meine LED Data aber das ist nicht alles auf PORTC es gibt auch LEDs PORTC und PORTD die benötigt. Wie kann ich dieses Problem beheben? vielleicht mit einem Alias​​?



Dim Led(100) As long
Led(001) = &B1100000000010000000000
Led(002) = &B1010000000010000000000
Led(003) = &B1001000000010000000000
Led(004) = &B1000100000010000000000
Led(005) = &B1000010000010000000000
Led(006) = &B1000001000010000000000
Led(007) = &B1000000100010000000000
Led(008) = &B1000000010010000000000
Led(009) = &B1000000001010000000000
Led(010) = &B1000000000110000000000
Led(011) = &B1100000000001000000000
Led(012) = &B0110000000001000000000
Led(013) = &B0101000000001000000000
Led(014) = &B0100100000001000000000
Led(015) = &B0100010000001000000000
Led(016) = &B0100001000001000000000
Led(017) = &B0100000100001000000000
Led(018) = &B0100000010001000000000
Led(019) = &B0100000001001000000000
Led(020) = &B0100000000101000000000
Led(021) = &B1010000000000100000000
Led(022) = &B0110000000000100000000
Led(023) = &B0011000000000100000000
Led(024) = &B0010100000000100000000
Led(025) = &B0010010000000100000000
Led(026) = &B0010001000000100000000
Led(027) = &B0010000100000100000000
Led(028) = &B0010000010000100000000
Led(029) = &B0010000001000100000000
Led(030) = &B0010000000100100000000
Led(031) = &B1001000000000010000000
Led(032) = &B0101000000000010000000
Led(033) = &B0011000000000010000000
Led(034) = &B0001100000000010000000
Led(035) = &B0001010000000010000000
Led(036) = &B0001001000000010000000
Led(037) = &B0001000100000010000000
Led(038) = &B0001000010000010000000
Led(039) = &B0001000001000010000000
Led(040) = &B0001000000100010000000
Led(041) = &B1000100000000001000000
Led(042) = &B0100100000000001000000
Led(043) = &B0010100000000001000000
Led(044) = &B0001100000000001000000
Led(045) = &B0000110000000001000000
Led(046) = &B0000101000000001000000
Led(047) = &B0000100100000001000000
Led(048) = &B0000100010000001000000
Led(049) = &B0000100001000001000000
Led(050) = &B0000100000100001000000
Led(051) = &B1000010000000000100000
Led(052) = &B0100010000000000100000
Led(053) = &B0010010000000000100000
Led(054) = &B0001010000000000100000
Led(055) = &B0000110000000000100000
Led(056) = &B0000011000000000100000
Led(057) = &B0000010100000000100000
Led(058) = &B0000010010000000100000
Led(059) = &B0000010001000000100000
Led(060) = &B0000010000100000100000
Led(061) = &B1000001000000000010000
Led(062) = &B0100001000000000010000
Led(063) = &B0010001000000000010000
Led(064) = &B0001001000000000010000
Led(065) = &B0000101000000000010000
Led(066) = &B0000011000000000010000
Led(067) = &B0000001100000000010000
Led(068) = &B0000001010000000010000
Led(069) = &B0000001001000000010000
Led(070) = &B0000001000100000010000
Led(071) = &B1000000100000000001000
Led(072) = &B0100000100000000001000
Led(073) = &B0010000100000000001000
Led(074) = &B0001000100000000001000
Led(075) = &B0000100100000000001000
Led(076) = &B0000010100000000001000
Led(077) = &B0000001100000000001000
Led(078) = &B0000000110000000001000
Led(079) = &B0000000101000000001000
Led(080) = &B0000000100100000001000
Led(081) = &B1000000010000000000100
Led(082) = &B0100000010000000000100
Led(083) = &B0010000010000000000100
Led(084) = &B0001000010000000000100
Led(085) = &B0000100010000000000100
Led(086) = &B0000010010000000000100
Led(087) = &B0000001010000000000100
Led(088) = &B0000000110000000000100
Led(089) = &B0000000011000000000100
Led(090) = &B0000000010100000000100
Led(091) = &B1000000001000000000010
Led(092) = &B0100000001000000000010
Led(093) = &B0010000001000000000010
Led(094) = &B0001000001000000000010
Led(095) = &B0000100001000000000010
Led(096) = &B0000010001000000000010
Led(097) = &B0000001001000000000010
Led(098) = &B0000000101000000000010
Led(099) = &B0000000011000000000010
Led(100) = &B0000000001100000000010

radbruch
13.04.2013, 23:31
Hallo

Klasse! Ich hoffe, deine Bitmuster stimmen. Nun könnte man mit den Bits jonglieren und sie passgerecht für die Ausgabe an die DDR- und Portregister zurechtstutzen. Aber ich würde das anders angehen.

Zuerst mal ein paar Gedanken: Bei 100 LED leuchtet jede LED nur 1/100stel der gesamten Bildaufbauzeit. Das wird nicht sehr hell werden. Um das maximale Nachleuchten der LED auszunutzen sollte der Stromimpuls möglichst hoch sein. Die beim Mega88 möglichen 40mA pro Pin sollte man ausnutzen. Möglicherweise wirken sich Bauteilestreuungen bei den LED oder den Widerständen als unterschiedliche Helligkeit aus. Dieser Effekt wäre vermutlich bei Low-Current-Typen noch stärker.

Um ein flackerfreies Bild zu erhalten sollte es mindestens ca. 15 mal pro Sekunde aufgebaut werden. Mal 100 LED macht das eine LED-Setzrate von ca. 1500Hz. Wichtig ist, dass die Berechnung und das Setzen der DDR- und Portwerte möglichst schnell geht (=wenig Takte dauert) um den Leuchtanteil zu erhöhen.


$regfile = "m88def.dat"
$crystal = 8000000
$baud = 19200

Config Portd = Input ' alle Pins auf Z-State setzen
Config Portc = Input
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

DDRC DDRD PORTC PORTD
Led(001) = &B110000 00000 100000 00000
Led(002) = &B101000 00000 100000 00000
Led(003) = &B100100 00000 100000 00000
Led(004) = &B100010 00000 100000 00000
Led(005) = &B100001 00000 100000 00000
Led(006) = &B100000 10000 100000 00000
Led(007) = &B100000 01000 100000 00000
Led(008) = &B100000 00100 100000 00000
Led(009) = &B100000 00010 100000 00000
Led(010) = &B100000 00001 100000 00000
...

Led(091) = &B100000 00010 000000 00010
Led(092) = &B010000 00010 000000 00010
Led(093) = &B001000 00010 000000 00010
Led(094) = &B000100 00010 000000 00010
Led(095) = &B000010 00010 000000 00010
Led(096) = &B000001 00010 000000 00010
Led(097) = &B000000 10010 000000 00010
Led(098) = &B000000 01010 000000 00010
Led(099) = &B000000 00110 000000 00010
Led(100) = &B000000 00011 000000 00010
')

'( Inhalt der Databytes

Data_ddrc(LED-Nr) &Bxx543210 ' x wird durch 0 ersetzt!
Data_ddrd(LED_Nr) &Bx65432xx
Data_portc(LED_Nr) &Bxx543210
Data_portd(LED_Nr) &Bx65432xx
')

Dim Data_ddrc(100) As Byte
Dim Data_ddrd(100) As Byte
Dim Data_portc(100) As Byte
Dim Data_portd(100) As Byte

Dim Temp_ddrc As Byte
Dim Temp_ddrd As Byte
Dim Temp_portc As Byte
Dim Temp_portd As Byte

Dim N As Byte

Gosub Set_data

Do
For N = 1 To 10
Temp_ddrc = Ddrc And &B11000000 ' die nicht verwendeten Bits merken
Temp_ddrd = Ddrd And &B10000011
Temp_portc = Portc And &B11000000
Temp_portd = Portd And &B10000011

Ddrc = Temp_ddrc ' vorsichtshalber alle Charliepins auf Z-State setzen
Ddrd = Temp_ddrd ' die nicht verwendeten Pins bleiben unberührt
Portc = Temp_portc ' (könnte man aus Zeitgründen eventuell weglassen)
Portd = Temp_portd

Ddrc = Temp_ddrc Or Data_ddrc(n) ' Charliepins der LED setzen
Ddrd = Temp_ddrd Or Data_ddrd(n) ' die nicht verwendeten Pins bleiben unberührt
Portc = Temp_portc Or Data_portc(n)
Portd = Temp_portd Or Data_portd(n)

Waitms 500
Next N

For N = 91 To 100
Temp_ddrc = Ddrc And &B11000000 ' die nicht verwendeten Bits merken
Temp_ddrd = Ddrd And &B10000011
Temp_portc = Portc And &B11000000
Temp_portd = Portd And &B10000011

Ddrc = Temp_ddrc ' vorsichtshalber alle Charliepins auf Z-State setzen
Ddrd = Temp_ddrd ' die nicht verwendeten Pins bleiben unberührt
Portc = Temp_portc ' (könnte man aus Zeitgründen eventuell weglassen)
Portd = Temp_portd

Ddrc = Temp_ddrc Or Data_ddrc(n) ' Charliepins der LED setzen
Ddrd = Temp_ddrd Or Data_ddrd(n) ' die nicht verwendeten Pins bleiben unberührt
Portc = Temp_portc Or Data_portc(n)
Portd = Temp_portd Or Data_portd(n)

Waitms 500
Next N

Wait 1
Loop
End

Set_data:

Data_ddrc(001) = &B00110000
Data_ddrd(001) = &B00000000
Data_portc(001) = &B00100000
Data_portd(001) = &B00000000

Data_ddrc(002) = &B00101000
Data_ddrd(002) = &B00000000
Data_portc(002) = &B00100000
Data_portd(002) = &B00000000

Data_ddrc(003) = &B00100100
Data_ddrd(003) = &B00000000
Data_portc(003) = &B00100000
Data_portd(003) = &B00000000

Data_ddrc(004) = &B00100010
Data_ddrd(004) = &B00000000
Data_portc(004) = &B00100000
Data_portd(004) = &B00000000

Data_ddrc(005) = &B00100001
Data_ddrd(005) = &B00000000
Data_portc(005) = &B00100000
Data_portd(005) = &B00000000

Data_ddrc(006) = &B00100000
Data_ddrd(006) = &B01000000
Data_portc(006) = &B00100000
Data_portd(006) = &B00000000

Data_ddrc(007) = &B00100000
Data_ddrd(007) = &B00100000
Data_portc(007) = &B00100000
Data_portd(007) = &B00000000

Data_ddrc(008) = &B00100000
Data_ddrd(008) = &B00010000
Data_portc(008) = &B00100000
Data_portd(008) = &B00000000

Data_ddrc(009) = &B00100000
Data_ddrd(009) = &B00001000
Data_portc(009) = &B00100000
Data_portd(009) = &B00000000

Data_ddrc(010) = &B00100000
Data_ddrd(010) = &B00000100
Data_portc(010) = &B00100000
Data_portd(010) = &B00000000

'...

Data_ddrc(091) = &B00100000
Data_ddrd(091) = &B00001000
Data_portc(091) = &B00000000
Data_portd(091) = &B00001000

Data_ddrc(092) = &B00010000
Data_ddrd(092) = &B00001000
Data_portc(092) = &B00000000
Data_portd(092) = &B00001000

Data_ddrc(093) = &B00001000
Data_ddrd(093) = &B00001000
Data_portc(093) = &B00000000
Data_portd(093) = &B00001000

Data_ddrc(094) = &B00000100
Data_ddrd(094) = &B00001000
Data_portc(094) = &B00000000
Data_portd(094) = &B00001000

Data_ddrc(095) = &B00000010
Data_ddrd(095) = &B00001000
Data_portc(095) = &B00000000
Data_portd(095) = &B00001000

Data_ddrc(096) = &B00000001
Data_ddrd(096) = &B00001000
Data_portc(096) = &B00000000
Data_portd(096) = &B00001000

Data_ddrc(097) = &B00000000
Data_ddrd(097) = &B01001000
Data_portc(097) = &B00000000
Data_portd(097) = &B00001000

Data_ddrc(098) = &B00000000
Data_ddrd(098) = &B00101000
Data_portc(098) = &B00000000
Data_portd(098) = &B00001000

Data_ddrc(099) = &B00000000
Data_ddrd(099) = &B00011000
Data_portc(099) = &B00000000
Data_portd(099) = &B00001000

Data_ddrc(100) = &B00000000
Data_ddrd(100) = &B00001100
Data_portc(100) = &B00000000
Data_portd(100) = &B00001000

Return(ungetestet und ohne Gewähr)

Wie sieht denn dein Aufbau aus?

Gruß

mic

radbruch
14.04.2013, 09:47
Hallo

Mit Bildspeicher und Scrollen:

$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

DDRC DDRD PORTC PORTD
Led(001) = &B110000 00000 100000 00000
Led(002) = &B101000 00000 100000 00000
Led(003) = &B100100 00000 100000 00000
Led(004) = &B100010 00000 100000 00000
Led(005) = &B100001 00000 100000 00000
Led(006) = &B100000 10000 100000 00000
Led(007) = &B100000 01000 100000 00000
Led(008) = &B100000 00100 100000 00000
Led(009) = &B100000 00010 100000 00000
Led(010) = &B100000 00001 100000 00000
...

Led(091) = &B100000 00010 000000 00010
Led(092) = &B010000 00010 000000 00010
Led(093) = &B001000 00010 000000 00010
Led(094) = &B000100 00010 000000 00010
Led(095) = &B000010 00010 000000 00010
Led(096) = &B000001 00010 000000 00010
Led(097) = &B000000 10010 000000 00010
Led(098) = &B000000 01010 000000 00010
Led(099) = &B000000 00110 000000 00010
Led(100) = &B000000 00011 000000 00010
')

'( Inhalt der Databytes

Data_ddrc(LED-Nr) &Bxx543210 ' x wird durch 0 ersetzt!
Data_ddrd(LED_Nr) &Bx65432xx
Data_portc(LED_Nr) &Bxx543210
Data_portd(LED_Nr) &Bx65432xx
')

Dim Data_ddrc(100) As Byte
Dim Data_ddrd(100) As Byte
Dim Data_portc(100) As Byte
Dim Data_portd(100) As Byte

Dim Temp_ddrc As Byte
Dim Temp_ddrd As Byte
Dim Temp_portc As Byte
Dim Temp_portd 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_charliedata
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: x=Word 2-11 y=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
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 = 10 To 1 Step -1 ' sichtbare Bits im Bildspeicher von links nach rechts

If Bildspeicher(bytenr).bitnr = 1 Then ' wenn Bit im Bildspeicher gesetzt dann ausgeben

'LED berechnen: LED1 oben links, LED10 unten links, LED91 oben rechts, LED100 unten rechts
Temp = 10 - Bitnr ' Spalte ist Bit10 - bitnr
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

'LED einschalten
Temp_ddrc = Ddrc And &B11000000 ' die nicht verwendeten Bits merken
Temp_ddrd = Ddrd And &B10000011
Temp_portc = Portc And &B11000000
Temp_portd = Portd And &B10000011

Ddrc = Temp_ddrc ' vorsichtshalber alle Charliepins auf Z-State setzen
Ddrd = Temp_ddrd ' die nicht verwendeten Pins bleiben unberührt
Portc = Temp_portc ' (könnte man aus Zeitgründen eventuell weglassen)
Portd = Temp_portd

Ddrc = Temp_ddrc Or Data_ddrc(lednr) ' Charliepins der LED setzen
Ddrd = Temp_ddrd Or Data_ddrd(lednr) ' die nicht verwendeten Pins bleiben unberührt
Portc = Temp_portc Or Data_portc(lednr)
Portd = Temp_portd Or Data_portd(lednr)
End If
Next Bitnr
Next Bytenr
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

Sub Set_charliedata

For N = 1 To 100
Data_ddrc(n) = 0 ' Dummywerte setzen
Data_ddrd(n) = 0
Data_portc(n) = 0
Data_portd(n) = 0
Next N

Data_ddrc(001) = &B00110000 ' echte Werte
Data_ddrd(001) = &B00000000
Data_portc(001) = &B00100000
Data_portd(001) = &B00000000

Data_ddrc(002) = &B00101000
Data_ddrd(002) = &B00000000
Data_portc(002) = &B00100000
Data_portd(002) = &B00000000

Data_ddrc(003) = &B00100100
Data_ddrd(003) = &B00000000
Data_portc(003) = &B00100000
Data_portd(003) = &B00000000

Data_ddrc(004) = &B00100010
Data_ddrd(004) = &B00000000
Data_portc(004) = &B00100000
Data_portd(004) = &B00000000

Data_ddrc(005) = &B00100001
Data_ddrd(005) = &B00000000
Data_portc(005) = &B00100000
Data_portd(005) = &B00000000

Data_ddrc(006) = &B00100000
Data_ddrd(006) = &B01000000
Data_portc(006) = &B00100000
Data_portd(006) = &B00000000

Data_ddrc(007) = &B00100000
Data_ddrd(007) = &B00100000
Data_portc(007) = &B00100000
Data_portd(007) = &B00000000

Data_ddrc(008) = &B00100000
Data_ddrd(008) = &B00010000
Data_portc(008) = &B00100000
Data_portd(008) = &B00000000

Data_ddrc(009) = &B00100000
Data_ddrd(009) = &B00001000
Data_portc(009) = &B00100000
Data_portd(009) = &B00000000

Data_ddrc(010) = &B00100000
Data_ddrd(010) = &B00000100
Data_portc(010) = &B00100000
Data_portd(010) = &B00000000

'...

Data_ddrc(091) = &B00100000
Data_ddrd(091) = &B00001000
Data_portc(091) = &B00000000
Data_portd(091) = &B00001000

Data_ddrc(092) = &B00010000
Data_ddrd(092) = &B00001000
Data_portc(092) = &B00000000
Data_portd(092) = &B00001000

Data_ddrc(093) = &B00001000
Data_ddrd(093) = &B00001000
Data_portc(093) = &B00000000
Data_portd(093) = &B00001000

Data_ddrc(094) = &B00000100
Data_ddrd(094) = &B00001000
Data_portc(094) = &B00000000
Data_portd(094) = &B00001000

Data_ddrc(095) = &B00000010
Data_ddrd(095) = &B00001000
Data_portc(095) = &B00000000
Data_portd(095) = &B00001000

Data_ddrc(096) = &B00000001
Data_ddrd(096) = &B00001000
Data_portc(096) = &B00000000
Data_portd(096) = &B00001000

Data_ddrc(097) = &B00000000
Data_ddrd(097) = &B01001000
Data_portc(097) = &B00000000
Data_portd(097) = &B00001000

Data_ddrc(098) = &B00000000
Data_ddrd(098) = &B00101000
Data_portc(098) = &B00000000
Data_portd(098) = &B00001000

Data_ddrc(099) = &B00000000
Data_ddrd(099) = &B00011000
Data_portc(099) = &B00000000
Data_portd(099) = &B00001000

Data_ddrc(100) = &B00000000
Data_ddrd(100) = &B00001100
Data_portc(100) = &B00000000
Data_portd(100) = &B00001000

End SubKeine Ahnung, ob das funktioniert. Es sind nur die Charliemuster für Led1 bis 10 und Led91 bis 100 eingetragen. Die LEDS habe ich mal so angenommen:

LED1 oben links
LED10 unten links
LED91 oben rechts
LED100 unten rechts

Das Timing ist Bauchgefühl. Es werden nur LED ausgegeben die gesetzt sind!

Gruß

mic

Boromir
14.04.2013, 12:48
Wie sieht denn dein Aufbau aus?


https://www.roboternetz.de/community/attachment.php?attachmentid=25127



Die LEDS habe ich mal so angenommen:
LED1 oben links
LED10 unten links
LED91 oben rechts
LED100 unten rechts


LED1 oben rechts
LED10 unten rechts
LED91 oben links
LED100 unten links

Vielen dank fur die code aber er ist zu groß:
https://www.roboternetz.de/community/attachment.php?attachmentid=25126



$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(100) As Byte
Dim Data_ddrc(100) As Byte
Dim Data_portd(100) As Byte
Dim Data_portc(100) As Byte

Dim Temp_ddrd As Byte
Dim Temp_ddrc As Byte
Dim Temp_portd As Byte
Dim 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_charliedata
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: x=Word 2-11 y=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
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 = 10 To 1 Step -1 ' sichtbare Bits im Bildspeicher von links nach rechts

If Bildspeicher(bytenr).bitnr = 1 Then ' wenn Bit im Bildspeicher gesetzt dann ausgeben

'LED berechnen: LED1 oben links, LED10 unten links, LED91 oben rechts, LED100 unten rechts
Temp = 10 - Bitnr ' Spalte ist Bit10 - bitnr
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

'LED einschalten
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(lednr) ' Charliepins der LED setzen
Ddrc = Temp_ddrc Or Data_ddrc(lednr) ' die nicht verwendeten Pins bleiben unberührt
Portd = Temp_portd Or Data_portd(lednr)
Portc = Temp_portc Or Data_portc(lednr)
End If
Next Bitnr
Next Bytenr
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

Sub Set_charliedata

For N = 1 To 100
Data_ddrd(n) = 0 ' Dummywerte setzen
Data_ddrc(n) = 0
Data_portd(n) = 0
Data_portc(n) = 0
Next N

Data_ddrd(001) = &B00110000
Data_ddrc(001) = &B00000000
Data_portd(001) = &B00100000
Data_portc(001) = &B00000000

Data_ddrd(002) = &B00101000
Data_ddrc(002) = &B00000000
Data_portd(002) = &B00100000
Data_portc(002) = &B00000000

Data_ddrd(003) = &B00100100
Data_ddrc(003) = &B00000000
Data_portd(003) = &B00100000
Data_portc(003) = &B00000000

Data_ddrd(004) = &B00100010
Data_ddrc(004) = &B00000000
Data_portd(004) = &B00100000
Data_portc(004) = &B00000000

Data_ddrd(005) = &B00100001
Data_ddrc(005) = &B10000000
Data_portd(005) = &B00100000
Data_portc(005) = &B00000000

Data_ddrd(006) = &B00100000
Data_ddrc(006) = &B01000000
Data_portd(006) = &B00100000
Data_portc(006) = &B00000000

Data_ddrd(007) = &B00100000
Data_ddrc(007) = &B00100000
Data_portd(007) = &B00100000
Data_portc(007) = &B00000000

Data_ddrd(008) = &B00100000
Data_ddrc(008) = &B00010000
Data_portd(008) = &B00100000
Data_portc(008) = &B00000000

Data_ddrd(009) = &B00100000
Data_ddrc(009) = &B00001000
Data_portd(009) = &B00100000
Data_portc(009) = &B00000000

Data_ddrd(010) = &B00100000
Data_ddrc(010) = &B00000100
Data_portd(010) = &B00100000
Data_portc(010) = &B00000000

Data_ddrd(011) = &B00110000
Data_ddrc(011) = &B00000000
Data_portd(011) = &B00010000
Data_portc(011) = &B00000000

Data_ddrd(012) = &B00011000
Data_ddrc(012) = &B00000000
Data_portd(012) = &B00010000
Data_portc(012) = &B00000000

Data_ddrd(013) = &B00010100
Data_ddrc(013) = &B00000000
Data_portd(013) = &B00010000
Data_portc(013) = &B00000000

Data_ddrd(014) = &B00010010
Data_ddrc(014) = &B00000000
Data_portd(014) = &B00010000
Data_portc(014) = &B00000000

Data_ddrd(015) = &B00010000
Data_ddrc(015) = &B10000000
Data_portd(015) = &B00010000
Data_portc(015) = &B00000000

Data_ddrd(016) = &B00010000
Data_ddrc(016) = &B01000000
Data_portd(016) = &B00010000
Data_portc(016) = &B00000000

Data_ddrd(017) = &B00010000
Data_ddrc(017) = &B00100000
Data_portd(017) = &B00010000
Data_portc(017) = &B00000000

Data_ddrd(018) = &B00010000
Data_ddrc(018) = &B00010000
Data_portd(018) = &B00010000
Data_portc(018) = &B00000000

Data_ddrd(019) = &B00010000
Data_ddrc(019) = &B00001000
Data_portd(019) = &B00010000
Data_portc(019) = &B00000000

Data_ddrd(020) = &B00010000
Data_ddrc(020) = &B00000100
Data_portd(020) = &B00010000
Data_portc(020) = &B00000000

Data_ddrd(021) = &B00101000
Data_ddrc(021) = &B00000000
Data_portd(021) = &B00001000
Data_portc(021) = &B00000000

Data_ddrd(022) = &B00011000
Data_ddrc(022) = &B00000000
Data_portd(022) = &B00001000
Data_portc(022) = &B00000000

Data_ddrd(023) = &B00001100
Data_ddrc(023) = &B00000000
Data_portd(023) = &B00001000
Data_portc(023) = &B00000000

Data_ddrd(024) = &B00001010
Data_ddrc(024) = &B00000000
Data_portd(024) = &B00001000
Data_portc(024) = &B00000000

Data_ddrd(025) = &B00001000
Data_ddrc(025) = &B10000000
Data_portd(025) = &B00001000
Data_portc(025) = &B00000000

Data_ddrd(026) = &B00001000
Data_ddrc(026) = &B01000000
Data_portd(026) = &B00001000
Data_portc(026) = &B00000000

Data_ddrd(027) = &B00001000
Data_ddrc(027) = &B00100000
Data_portd(027) = &B00001000
Data_portc(027) = &B00000000

Data_ddrd(028) = &B00001000
Data_ddrc(028) = &B00010000
Data_portd(028) = &B00001000
Data_portc(028) = &B00000000

Data_ddrd(029) = &B00001000
Data_ddrc(029) = &B00001000
Data_portd(029) = &B00001000
Data_portc(029) = &B00000000

Data_ddrd(030) = &B00001000
Data_ddrc(030) = &B00000100
Data_portd(030) = &B00001000
Data_portc(030) = &B00000000

Data_ddrd(031) = &B00100100
Data_ddrc(031) = &B00000000
Data_portd(031) = &B00000100
Data_portc(031) = &B00000000

Data_ddrd(032) = &B00010100
Data_ddrc(032) = &B00000000
Data_portd(032) = &B00000100
Data_portc(032) = &B00000000

Data_ddrd(033) = &B00001100
Data_ddrc(033) = &B00000000
Data_portd(033) = &B00000100
Data_portc(033) = &B00000000

Data_ddrd(034) = &B00000110
Data_ddrc(034) = &B00000000
Data_portd(034) = &B00000100
Data_portc(034) = &B00000000

Data_ddrd(035) = &B00000100
Data_ddrc(035) = &B10000000
Data_portd(035) = &B00000100
Data_portc(035) = &B00000000

Data_ddrd(036) = &B00000100
Data_ddrc(036) = &B01000000
Data_portd(036) = &B00000100
Data_portc(036) = &B00000000

Data_ddrd(037) = &B00000100
Data_ddrc(037) = &B00100000
Data_portd(037) = &B00000100
Data_portc(037) = &B00000000

Data_ddrd(038) = &B00000100
Data_ddrc(038) = &B00010000
Data_portd(038) = &B00000100
Data_portc(038) = &B00000000

Data_ddrd(039) = &B00000100
Data_ddrc(039) = &B00001000
Data_portd(039) = &B00000100
Data_portc(039) = &B00000000

Data_ddrd(040) = &B00000100
Data_ddrc(040) = &B00000100
Data_portd(040) = &B00000100
Data_portc(040) = &B00000000

Data_ddrd(041) = &B00100010
Data_ddrc(041) = &B00000000
Data_portd(041) = &B00000010
Data_portc(041) = &B00000000

Data_ddrd(042) = &B00010010
Data_ddrc(042) = &B00000000
Data_portd(042) = &B00000010
Data_portc(042) = &B00000000

Data_ddrd(043) = &B00001010
Data_ddrc(043) = &B00000000
Data_portd(043) = &B00000010
Data_portc(043) = &B00000000

Data_ddrd(044) = &B00000110
Data_ddrc(044) = &B00000000
Data_portd(044) = &B00000010
Data_portc(044) = &B00000000

Data_ddrd(045) = &B00000010
Data_ddrc(045) = &B10000000
Data_portd(045) = &B00000010
Data_portc(045) = &B00000000

Data_ddrd(046) = &B00000010
Data_ddrc(046) = &B01000000
Data_portd(046) = &B00000010
Data_portc(046) = &B00000000

Data_ddrd(047) = &B00000010
Data_ddrc(047) = &B00100000
Data_portd(047) = &B00000010
Data_portc(047) = &B00000000

Data_ddrd(048) = &B00000010
Data_ddrc(048) = &B00010000
Data_portd(048) = &B00000010
Data_portc(048) = &B00000000

Data_ddrd(049) = &B00000010
Data_ddrc(049) = &B00001000
Data_portd(049) = &B00000010
Data_portc(049) = &B00000000

Data_ddrd(050) = &B00000010
Data_ddrc(050) = &B00000100
Data_portd(050) = &B00000010
Data_portc(050) = &B00000000

Data_ddrd(051) = &B00100000
Data_ddrc(051) = &B10000000
Data_portd(051) = &B00000000
Data_portc(051) = &B10000000

Data_ddrd(052) = &B00010000
Data_ddrc(052) = &B10000000
Data_portd(052) = &B00000000
Data_portc(052) = &B10000000

Data_ddrd(053) = &B00001000
Data_ddrc(053) = &B10000000
Data_portd(053) = &B00000000
Data_portc(053) = &B10000000

Data_ddrd(054) = &B00000100
Data_ddrc(054) = &B10000000
Data_portd(054) = &B00000000
Data_portc(054) = &B10000000

Data_ddrd(055) = &B00000010
Data_ddrc(055) = &B10000000
Data_portd(055) = &B00000000
Data_portc(055) = &B10000000

Data_ddrd(056) = &B00000000
Data_ddrc(056) = &B11000000
Data_portd(056) = &B00000000
Data_portc(056) = &B10000000

Data_ddrd(057) = &B00000000
Data_ddrc(057) = &B10100000
Data_portd(057) = &B00000000
Data_portc(057) = &B10000000

Data_ddrd(058) = &B00000000
Data_ddrc(058) = &B10010000
Data_portd(058) = &B00000000
Data_portc(058) = &B10000000

Data_ddrd(059) = &B00000000
Data_ddrc(059) = &B10001000
Data_portd(059) = &B00000000
Data_portc(059) = &B10000000

Data_ddrd(060) = &B00000000
Data_ddrc(060) = &B10000100
Data_portd(060) = &B00000000
Data_portc(060) = &B10000000

Data_ddrd(061) = &B00100000
Data_ddrc(061) = &B01000000
Data_portd(061) = &B00000000
Data_portc(061) = &B01000000

Data_ddrd(062) = &B00010000
Data_ddrc(062) = &B01000000
Data_portd(062) = &B00000000
Data_portc(062) = &B01000000

Data_ddrd(063) = &B00001000
Data_ddrc(063) = &B01000000
Data_portd(063) = &B00000000
Data_portc(063) = &B01000000

Data_ddrd(064) = &B00000100
Data_ddrc(064) = &B01000000
Data_portd(064) = &B00000000
Data_portc(064) = &B01000000

Data_ddrd(065) = &B00000010
Data_ddrc(065) = &B01000000
Data_portd(065) = &B00000000
Data_portc(065) = &B01000000

Data_ddrd(066) = &B00000000
Data_ddrc(066) = &B11000000
Data_portd(066) = &B00000000
Data_portc(066) = &B01000000

Data_ddrd(067) = &B00000000
Data_ddrc(067) = &B01100000
Data_portd(067) = &B00000000
Data_portc(067) = &B01000000

Data_ddrd(068) = &B00000000
Data_ddrc(068) = &B01010000
Data_portd(068) = &B00000000
Data_portc(068) = &B01000000

Data_ddrd(069) = &B00000000
Data_ddrc(069) = &B01001000
Data_portd(069) = &B00000000
Data_portc(069) = &B01000000

Data_ddrd(070) = &B00000000
Data_ddrc(070) = &B01000100
Data_portd(070) = &B00000000
Data_portc(070) = &B01000000

Data_ddrd(071) = &B00100000
Data_ddrc(071) = &B00100000
Data_portd(071) = &B00000000
Data_portc(071) = &B00100000

Data_ddrd(072) = &B00010000
Data_ddrc(072) = &B00100000
Data_portd(072) = &B00000000
Data_portc(072) = &B00100000

Data_ddrd(073) = &B00001000
Data_ddrc(073) = &B00100000
Data_portd(073) = &B00000000
Data_portc(073) = &B00100000

Data_ddrd(074) = &B00000100
Data_ddrc(074) = &B00100000
Data_portd(074) = &B00000000
Data_portc(074) = &B00100000

Data_ddrd(075) = &B00000010
Data_ddrc(075) = &B00100000
Data_portd(075) = &B00000000
Data_portc(075) = &B00100000

Data_ddrd(076) = &B00000000
Data_ddrc(076) = &B10100000
Data_portd(076) = &B00000000
Data_portc(076) = &B00100000

Data_ddrd(077) = &B00000000
Data_ddrc(077) = &B01100000
Data_portd(077) = &B00000000
Data_portc(077) = &B00100000

Data_ddrd(078) = &B00000000
Data_ddrc(078) = &B00110000
Data_portd(078) = &B00000000
Data_portc(078) = &B00100000

Data_ddrd(079) = &B00000000
Data_ddrc(079) = &B00101000
Data_portd(079) = &B00000000
Data_portc(079) = &B00100000

Data_ddrd(080) = &B00000000
Data_ddrc(080) = &B00100100
Data_portd(080) = &B00000000
Data_portc(080) = &B00100000

Data_ddrd(081) = &B00100000
Data_ddrc(081) = &B00010000
Data_portd(081) = &B00000000
Data_portc(081) = &B00010000

Data_ddrd(082) = &B00010000
Data_ddrc(082) = &B00010000
Data_portd(082) = &B00000000
Data_portc(082) = &B00010000

Data_ddrd(083) = &B00001000
Data_ddrc(083) = &B00010000
Data_portd(083) = &B00000000
Data_portc(083) = &B00010000

Data_ddrd(084) = &B00000100
Data_ddrc(084) = &B00010000
Data_portd(084) = &B00000000
Data_portc(084) = &B00010000

Data_ddrd(085) = &B00000010
Data_ddrc(085) = &B00010000
Data_portd(085) = &B00000000
Data_portc(085) = &B00010000

Data_ddrd(086) = &B00000000
Data_ddrc(086) = &B10010000
Data_portd(086) = &B00000000
Data_portc(086) = &B00010000

Data_ddrd(087) = &B00000000
Data_ddrc(087) = &B01010000
Data_portd(087) = &B00000000
Data_portc(087) = &B00010000

Data_ddrd(088) = &B00000000
Data_ddrc(088) = &B00110000
Data_portd(088) = &B00000000
Data_portc(088) = &B00010000

Data_ddrd(089) = &B00000000
Data_ddrc(089) = &B00011000
Data_portd(089) = &B00000000
Data_portc(089) = &B00010000

Data_ddrd(090) = &B00000000
Data_ddrc(090) = &B00010100
Data_portd(090) = &B00000000
Data_portc(090) = &B00010000

Data_ddrd(091) = &B00100000
Data_ddrc(091) = &B00001000
Data_portd(091) = &B00000000
Data_portc(091) = &B00001000

Data_ddrd(092) = &B00010000
Data_ddrc(092) = &B00001000
Data_portd(092) = &B00000000
Data_portc(092) = &B00001000

Data_ddrd(093) = &B00001000
Data_ddrc(093) = &B00001000
Data_portd(093) = &B00000000
Data_portc(093) = &B00001000

Data_ddrd(094) = &B00000100
Data_ddrc(094) = &B00001000
Data_portd(094) = &B00000000
Data_portc(094) = &B00001000

Data_ddrd(095) = &B00000010
Data_ddrc(095) = &B00001000
Data_portd(095) = &B00000000
Data_portc(095) = &B00001000

Data_ddrd(096) = &B00000000
Data_ddrc(096) = &B10001000
Data_portd(096) = &B00000000
Data_portc(096) = &B00001000

Data_ddrd(097) = &B00000000
Data_ddrc(097) = &B01001000
Data_portd(097) = &B00000000
Data_portc(097) = &B00001000

Data_ddrd(098) = &B00000000
Data_ddrc(098) = &B00101000
Data_portd(098) = &B00000000
Data_portc(098) = &B00001000

Data_ddrd(099) = &B00000000
Data_ddrc(099) = &B00011000
Data_portd(099) = &B00000000
Data_portc(099) = &B00001000

Data_ddrd(100) = &B00000000
Data_ddrc(100) = &B00001100
Data_portd(100) = &B00000000
Data_portc(100) = &B00001000

End Sub

radbruch
14.04.2013, 18:24
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:


$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