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