\ 5x5 LED Matrix am LauchPad MSP430G2335
\ Bilderfolgen für die LED Matrix kreieren.
\ Datenstruktur einer Bildfolge
\ 1 Zeile mit 5 Bitmustern ergibt 1 Bild.
\ n Bilder sind eine Bildfolge.
\ Die Bildfolge ist durch ihre Startadresse adr
\ und die Anzahl n der Bilder repräsentiert. ( -- adr n )
bin
\ Einige Bitmuster Tabellen ins flash compilieren
: | ic, ;
IHERE
1 00000 | 00000 | 00100 | 00000 | 00000 |
1+ 00000 | 00100 | 01110 | 00100 | 00000 |
1+ 00100 | 00100 | 11111 | 00100 | 00100 |
1+ 01110 | 10101 | 11111 | 10101 | 01110 |
1+ 11111 | 10101 | 11111 | 10101 | 11111 |
1+ 11111 | 10101 | 11011 | 10101 | 11111 |
1+ 11111 | 10001 | 10001 | 10001 | 11111 |
1+ 11011 | 11011 | 00000 | 11011 | 11011 |
1+ 10001 | 01010 | 00100 | 01010 | 10001 |
1+ 00000 | 01010 | 00100 | 01010 | 00000 |
ALIGN 2CONSTANT (OMANN)
IHERE
1 10000 | 01000 | 00100 | 00010 | 00001 |
1+ 00000 | 00000 | 11111 | 00000 | 00000 |
1+ 00001 | 00010 | 00100 | 01000 | 10000 |
1+ 00100 | 00100 | 00100 | 00100 | 00100 |
ALIGN 2CONSTANT (PROPELLER)
IHERE
1 00100 | 00100 | 00100 | 00100 | 00100 |
1+ 01000 | 01000 | 00100 | 00010 | 00010 |
1+ 10000 | 01000 | 00100 | 00010 | 00001 |
1+ 00000 | 11000 | 00100 | 00011 | 00000 |
1+ 00000 | 00000 | 11111 | 00000 | 00000 |
1+ 00000 | 00011 | 00100 | 11000 | 00000 |
1+ 00001 | 00010 | 00100 | 01000 | 10000 |
1+ 00010 | 00010 | 00100 | 01000 | 01000 |
ALIGN 2CONSTANT (WINDMUHLE)
IHERE
1 00100 | 00100 | 00100 | 00100 | 00100 |
1+ 01000 | 01000 | 01000 | 01000 | 01000 |
1+ 10000 | 10000 | 10000 | 10000 | 10000 |
1+ 01000 | 01000 | 01000 | 01000 | 01000 |
1+ 00100 | 00100 | 00100 | 00100 | 00100 |
1+ 00010 | 00010 | 00010 | 00010 | 00010 |
1+ 00001 | 00001 | 00001 | 00001 | 00001 |
1+ 00010 | 00010 | 00010 | 00010 | 00010 |
ALIGN 2CONSTANT (WISCHER)
IHERE
1 11111 | 00000 | 00000 | 00000 | 00000 |
1+ 00000 | 11111 | 00000 | 00000 | 00000 |
1+ 00000 | 00000 | 11111 | 00000 | 00000 |
1+ 00000 | 00000 | 00000 | 11111 | 00000 |
1+ 00000 | 00000 | 00000 | 00000 | 11111 |
ALIGN 2CONSTANT (SCHABER)
IHERE
1 00000 | 00000 | 00100 | 00000 | 00000 |
1+ 00000 | 01110 | 01010 | 01110 | 00000 |
1+ 11111 | 10001 | 10001 | 10001 | 11111 |
1+ 00000 | 01110 | 01010 | 01110 | 00000 |
ALIGN 2CONSTANT (KREISE)
IHERE
1 11111 | 00000 | 00000 | 00000 | 00000 |
1+ 11110 | 10000 | 00000 | 00000 | 00000 |
1+ 11100 | 10000 | 10000 | 00000 | 00000 |
1+ 11000 | 10000 | 10000 | 10000 | 00000 |
1+ 10000 | 10000 | 10000 | 10000 | 10000 |
1+ 00000 | 10000 | 10000 | 10000 | 11000 |
1+ 00000 | 00000 | 10000 | 10000 | 11100 |
1+ 00000 | 00000 | 00000 | 10000 | 11110 |
1+ 00000 | 00000 | 00000 | 00000 | 11111 |
1+ 00000 | 00000 | 00000 | 00001 | 01111 |
1+ 00000 | 00000 | 00001 | 00001 | 00111 |
1+ 00000 | 00001 | 00001 | 00001 | 00011 |
1+ 00001 | 00001 | 00001 | 00001 | 00001 |
1+ 00011 | 00001 | 00001 | 00001 | 00000 |
1+ 00111 | 00001 | 00001 | 00000 | 00000 |
1+ 01111 | 00001 | 00000 | 00000 | 00000 |
1+ 11111 | 00000 | 00000 | 00000 | 00000 |
1+ 11110 | 01000 | 00000 | 00000 | 00000 |
1+ 11100 | 01000 | 00100 | 00000 | 00000 |
1+ 11000 | 01000 | 00100 | 00010 | 00000 |
1+ 10000 | 01000 | 00100 | 00010 | 00001 |
ALIGN 2CONSTANT (SCHLANGE)
\ Treiber für die LED Matrix
\ Pinbelegung:
\ bit 0 1 2 3 4
\ 5 Zeilen == P1.4, P1.5, P2.0, P2.1, P2.2
\ 5 Spalten == P2.3, P2.4, P2.5, P1.6, P1.7
bin
\ Modus der Portpins für die 5x5 Matrix auf 'out' setzen.
: INIT5x5 11110000 p1 1+ cset 00111111 p2 1+ cset ;
: BLANK 00111000 p2 cclr 11000000 p1 cclr
00110000 p1 cset 00000111 p2 cset ;
hex
\ Ein LED in der Matrix einzeln an und aus machen
\ Zeile x Spalte y LED
\ L H an
\ H L aus
: ZEILE ( x -- mask adr )
dup 0 = IF drop 10 P1 EXIT THEN
dup 1 = IF drop 20 P1 EXIT THEN
dup 2 = IF drop 01 P2 EXIT THEN
dup 3 = IF drop 02 P2 EXIT THEN
dup 4 = IF drop 04 P2 EXIT THEN drop ;
: SPALTE ( y -- mask adr )
dup 0 = IF drop 08 P2 EXIT THEN
dup 1 = IF drop 10 P2 EXIT THEN
dup 2 = IF drop 20 P2 EXIT THEN
dup 3 = IF drop 40 P1 EXIT THEN
dup 4 = IF drop 80 P1 EXIT THEN drop ;
: +X ( x -- ) zeile cclr ;
: +Y ( y -- ) spalte cset ;
: -X ( x -- ) zeile cset ;
: -Y ( y -- ) spalte cclr ;
: AN ( x y -- ) +Y +X ;
: AUS ( x y -- ) -Y -X ; \ mk
decimal
\ Bilderfolgen in der LED Matrix abspielen.
\ Prozess jederzeit abbrechen können
: ?ABORT ( -- ) key? IF blank ABORT THEN ;
\ Bitmuster für eine Zeile abspielen
\ Die LED muss etwas länger leuchten damit man sie gut sehen kann.
\ 1 ms genügt.
: test if ." ja" else ." nein" then ;
: LSB?+ ( c -- c' f ) >r r@ 1 rshift r> 1 and ; \ mk
: ?x ( x f -- ) IF +x ELSE -x THEN ;
: XAB ( c -- ) 5 0 DO LSB?+ i swap ?x 1ms i -x ?abort LOOP drop ;
\ Ein Bild zeigen
: (BILD) ( c0 c1 c2 c3 c4 -- ) 5 0 DO I +y xab i -y LOOP ;
: TESTBILD1 ( -- )
begin [ bin ] 10001 01010 00100 01010 10001 [ decimal ]
(bild) again ;
: TESTBILD2 ( -- )
begin [ bin ] 00100 00100 11111 00100 00100 [ decimal ]
(bild) again ;
: BILD@ ( adr -- c0 c1 c2 c3 c4 ) 5 0 DO dup c@ swap 1+ loop drop ;
variable dauer 10 dauer !
: BILD ( adr -- )
dauer @ 0 do dup bild@ (bild) loop drop blank ;
\ Bildfolge zeigen
: FOLGE ( adr n -- ) 0 DO dup bild 5 + LOOP drop ;
: OMANN ( n -- ) 0 DO (omann) folge LOOP ; \
: PROPELLER ( n -- ) 0 DO (propeller) folge LOOP ; \
: WINDMUHLE ( n -- ) 0 DO (windmuhle) folge LOOP ; \
: WISCHER ( n -- ) 0 DO (wischer) folge LOOP ; \
: SCHABER ( n -- ) 0 DO (schaber) folge LOOP ; \
: KREISE ( n -- ) 0 DO (kreise) folge LOOP ; \
: SCHLANGE ( n -- ) 0 DO (schlange) folge LOOP ; \
\ Abläufe erstellen
: (show) ( xt n -- ) dauer ! init5x5 blank begin dup execute again ;
: ABLAUF1 ( -- )
1 wischer 1 schaber 1 schlange
2 propeller 4 windmuhle
2 kreise 2 omann ;
: show1 ( -- ) ['] ablauf1 5 (show) ;
( finis)