\ 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)