fl { Adafruit 16X32 Matrix PropForth 5.5 2014/06/27 15:51:21 Adafruit 16X32 Matrix [ C B A ] ------------------------- | b31 ...... b0 | [ 0 0 0 ] | upper matrix(8x32) | ... upper matrix(8x32) color[ B1 G1 R1 ] | | [ 1 1 1 ] |-------------------------| | b31 ...... b0 | [ 0 0 0 ] | lower matrix(8x32) | ... lower matrix(8x32) color[ B2 G2 R2 ] | | [ 0 0 0 ] ------------------------- ^ ^ output signal side Input signal side matrix_array 32Word X 16 = 512Word(1024bytes) ------------------------- 0 | b31 ...... b0 | <-- 32Word .. | upper matrix(8x32) | 7 | | |-------------------------| 8 | b31 ...... b0 | .. | lower matrix(8x32) | 15 | | ------------------------- } \ =========================================================================== \ Variables \ =========================================================================== \ buffer for Adafrui matrix16X32 { Input before loading this code --------------------------------------------------------------------- reboot .. Prop0 Cog6 ok variable matrix_array Prop0 Cog6 ok matrix_array . 17616 Prop0 Cog6 ok <-- If Dev-kernel, it should be 17616. d17616 d1024 + here W! Prop0 Cog6 ok ---------------------------------------------------------------------- Loading this code variable matrix_array d17616 d1024 + here W! } \ variable for section wvariable n \ variable for demo wvariable offset wvariable color \ =========================================================================== \ Constants \ =========================================================================== \ Pin 0 wconstant R1 \ 1 wconstant G1 \ 2 wconstant B1 3 wconstant R2 \ 4 wconstant G2 \ 5 wconstant B2 6 wconstant LnA \ 7 wconstant LnB \ 8 wconstant LnC \ 9 wconstant CLK d10 wconstant LE d11 wconstant EN 7 R1 lshift invert constant upper_m \ mask bit for upper-matrix RGB 7 R2 lshift invert constant lower_m \ mask bit for lower-matrix RGB 7 LnA lshift invert constant line_m \ mask bit for line 1 EN lshift constant en_m \ EN mask \ =========================================================================== \ 8X8 Font Characters \ =========================================================================== wvariable Font -2 allot h00 c, h00 c, h00 c, h00 c, h00 c, h00 c, h00 c, h00 c, h00 c, h06 c, h5F c, h5F c, h06 c, h00 c, h00 c, h00 c, h00 c, h03 c, h07 c, h00 c, h07 c, h03 c, h00 c, h00 c, h14 c, h7F c, h7F c, h14 c, h7F c, h7F c, h14 c, h00 c, h24 c, h2E c, h2A c, h6B c, h6B c, h3A c, h12 c, h00 c, h46 c, h66 c, h30 c, h18 c, h0C c, h66 c, h62 c, h00 c, h30 c, h7A c, h4F c, h5D c, h37 c, h7A c, h48 c, h00 c, h00 c, h04 c, h07 c, h03 c, h00 c, h00 c, h00 c, h00 c, h00 c, h1C c, h3E c, h63 c, h41 c, h00 c, h00 c, h00 c, h00 c, h41 c, h63 c, h3E c, h1C c, h00 c, h00 c, h00 c, h08 c, h2A c, h3E c, h1C c, h1C c, h3E c, h2A c, h08 c, h08 c, h08 c, h3E c, h3E c, h08 c, h08 c, h00 c, h00 c, h00 c, h80 c, hE0 c, h60 c, h00 c, h00 c, h00 c, h00 c, h08 c, h08 c, h08 c, h08 c, h08 c, h08 c, h00 c, h00 c, h00 c, h00 c, h60 c, h60 c, h00 c, h00 c, h00 c, h00 c, h60 c, h30 c, h18 c, h0C c, h06 c, h03 c, h01 c, h00 c, h3E c, h7F c, h41 c, h49 c, h41 c, h7F c, h3E c, h00 c, h40 c, h42 c, h7F c, h7F c, h40 c, h40 c, h00 c, h00 c, h62 c, h73 c, h59 c, h49 c, h6F c, h66 c, h00 c, h00 c, h22 c, h63 c, h49 c, h49 c, h7F c, h36 c, h00 c, h00 c, h18 c, h1C c, h16 c, h53 c, h7F c, h7F c, h50 c, h00 c, h27 c, h67 c, h45 c, h45 c, h7D c, h39 c, h00 c, h00 c, h3C c, h7E c, h4B c, h49 c, h79 c, h30 c, h00 c, h00 c, h03 c, h03 c, h71 c, h79 c, h0F c, h07 c, h00 c, h00 c, h36 c, h7F c, h49 c, h49 c, h7F c, h36 c, h00 c, h00 c, h06 c, h4F c, h49 c, h69 c, h3F c, h1E c, h00 c, h00 c, h00 c, h00 c, h66 c, h66 c, h00 c, h00 c, h00 c, h00 c, h00 c, h80 c, hE6 c, h66 c, h00 c, h00 c, h00 c, h00 c, h08 c, h1C c, h36 c, h63 c, h41 c, h00 c, h00 c, h00 c, h24 c, h24 c, h24 c, h24 c, h24 c, h24 c, h00 c, h00 c, h00 c, h41 c, h63 c, h36 c, h1C c, h08 c, h00 c, h00 c, h02 c, h03 c, h51 c, h59 c, h0F c, h06 c, h00 c, h00 c, h3E c, h7F c, h41 c, h5D c, h5D c, h1F c, h0E c, h00 c, h7C c, h7E c, h13 c, h13 c, h7E c, h7C c, h00 c, h00 c, h41 c, h7F c, h7F c, h49 c, h49 c, h7F c, h36 c, h00 c, h1C c, h3E c, h63 c, h41 c, h41 c, h63 c, h22 c, h00 c, h41 c, h7F c, h7F c, h41 c, h63 c, h3E c, h1C c, h00 c, h41 c, h7F c, h7F c, h49 c, h5D c, h41 c, h63 c, h00 c, h41 c, h7F c, h7F c, h49 c, h1D c, h01 c, h03 c, h00 c, h1C c, h3E c, h63 c, h41 c, h51 c, h73 c, h72 c, h00 c, h7F c, h7F c, h08 c, h08 c, h7F c, h7F c, h00 c, h00 c, h00 c, h41 c, h7F c, h7F c, h41 c, h00 c, h00 c, h00 c, h30 c, h70 c, h40 c, h41 c, h7F c, h3F c, h01 c, h00 c, h41 c, h7F c, h7F c, h08 c, h1C c, h77 c, h63 c, h00 c, h41 c, h7F c, h7F c, h41 c, h40 c, h60 c, h70 c, h00 c, h7F c, h7F c, h0E c, h1C c, h0E c, h7F c, h7F c, h00 c, h7F c, h7F c, h06 c, h0C c, h18 c, h7F c, h7F c, h00 c, h1C c, h3E c, h63 c, h41 c, h63 c, h3E c, h1C c, h00 c, h41 c, h7F c, h7F c, h49 c, h09 c, h0F c, h06 c, h00 c, h1E c, h3F c, h21 c, h71 c, h7F c, h5E c, h00 c, h00 c, h41 c, h7F c, h7F c, h09 c, h19 c, h7F c, h66 c, h00 c, h26 c, h6F c, h49 c, h49 c, h7B c, h32 c, h00 c, h00 c, h03 c, h41 c, h7F c, h7F c, h41 c, h03 c, h00 c, h00 c, h7F c, h7F c, h40 c, h40 c, h7F c, h7F c, h00 c, h00 c, h1F c, h3F c, h60 c, h60 c, h3F c, h1F c, h00 c, h00 c, h7F c, h7F c, h30 c, h18 c, h30 c, h7F c, h7F c, h00 c, h61 c, h73 c, h1E c, h0C c, h1E c, h73 c, h61 c, h00 c, h07 c, h4F c, h78 c, h78 c, h4F c, h07 c, h00 c, h00 c, h47 c, h63 c, h71 c, h59 c, h4D c, h67 c, h73 c, h00 c, h00 c, h7F c, h7F c, h41 c, h41 c, h00 c, h00 c, h00 c, h01 c, h03 c, h06 c, h0C c, h18 c, h30 c, h60 c, h00 c, h00 c, h41 c, h41 c, h7F c, h7F c, h00 c, h00 c, h00 c, h08 c, h0C c, h06 c, h03 c, h06 c, h0C c, h08 c, h00 c, h80 c, h80 c, h80 c, h80 c, h80 c, h80 c, h80 c, h80 c, h00 c, h00 c, h01 c, h03 c, h06 c, h04 c, h00 c, h00 c, h20 c, h74 c, h54 c, h54 c, h3C c, h78 c, h40 c, h00 c, h41 c, h7F c, h3F c, h48 c, h48 c, h78 c, h30 c, h00 c, h38 c, h7C c, h44 c, h44 c, h6C c, h28 c, h00 c, h00 c, h30 c, h78 c, h48 c, h49 c, h3F c, h7F c, h40 c, h00 c, h38 c, h7C c, h54 c, h54 c, h5C c, h18 c, h00 c, h00 c, h48 c, h7E c, h7F c, h49 c, h03 c, h02 c, h00 c, h00 c, h98 c, hBC c, hA4 c, hA4 c, hF8 c, h7C c, h04 c, h00 c, h41 c, h7F c, h7F c, h08 c, h04 c, h7C c, h78 c, h00 c, h00 c, h44 c, h7D c, h7D c, h40 c, h00 c, h00 c, h00 c, h60 c, hE0 c, h80 c, h80 c, hFD c, h7D c, h00 c, h00 c, h41 c, h7F c, h7F c, h10 c, h38 c, h6C c, h44 c, h00 c, h00 c, h41 c, h7F c, h7F c, h40 c, h00 c, h00 c, h00 c, h7C c, h7C c, h08 c, h38 c, h0C c, h7C c, h78 c, h00 c, h7C c, h7C c, h04 c, h04 c, h7C c, h78 c, h00 c, h00 c, h38 c, h7C c, h44 c, h44 c, h7C c, h38 c, h00 c, h00 c, h84 c, hFC c, hF8 c, hA4 c, h24 c, h3C c, h18 c, h00 c, h18 c, h3C c, h24 c, hA4 c, hF8 c, hFC c, h84 c, h00 c, h44 c, h7C c, h78 c, h4C c, h04 c, h1C c, h18 c, h00 c, h48 c, h5C c, h54 c, h54 c, h74 c, h24 c, h00 c, h00 c, h00 c, h04 c, h3E c, h7F c, h44 c, h24 c, h00 c, h00 c, h3C c, h7C c, h40 c, h40 c, h3C c, h7C c, h40 c, h00 c, h1C c, h3C c, h60 c, h60 c, h3C c, h1C c, h00 c, h00 c, h3C c, h7C c, h60 c, h38 c, h60 c, h7C c, h3C c, h00 c, h44 c, h6C c, h38 c, h10 c, h38 c, h6C c, h44 c, h00 c, h9C c, hBC c, hA0 c, hA0 c, hFC c, h7C c, h00 c, h00 c, h4C c, h64 c, h74 c, h5C c, h4C c, h64 c, h00 c, h00 c, h08 c, h08 c, h3E c, h77 c, h41 c, h41 c, h00 c, h00 c, h00 c, h00 c, h7F c, h7F c, h00 c, h00 c, h00 c, h00 c, h41 c, h41 c, h77 c, h3E c, h08 c, h08 c, h00 c, h00 c, h02 c, h03 c, h01 c, h03 c, h02 c, h03 c, h01 c, h00 c, h4C c, h5E c, h73 c, h01 c, h73 c, h5E c, h4C c, h00 c, Font d768 + wconstant Font_end \ =========================================================================== \ Main \ =========================================================================== \ Set [C B A] to matrix_array \ ( -- ) : prepare_array \ upper section and lower section 2 0 do i n W! \ from line0 to line7 8 0 do \ from b0 to b31 d32 0 do j LnA lshift \ Get line number en_m or \ Add EN \ Calculate matrix-dot's position d32 8 u* n W@ u* \ section Word d32 j u* + \ Add line Word i + \ Add bit Word 2 u* \ bytes matrix_array + \ ( line line address ) W! \ Save line number to each dot loop loop loop ; \ Set each Long data of matrix_array to outa \ ( n1 -- n2 ) n1:address of matrix_array n2:n1+4 lockdict create a_matrix_16x32_2 forthentry $C_a_lxasm w, h118 h113 1- tuck - h9 lshift or here W@ alignl h10 lshift or l, z4ixZB l, z1bix[N l, z20yPO2 l, z1SV01X l, z80 l, freedict \ Scan matrix_array to display \ ( -- ) : scan hFFF dira COG! \ Set ports to output matrix_array begin dup d16 0 do d32 0 do a_matrix_16x32_2 \ Set loop LE pinhi LE pinlo EN pinlo loop drop fkey? swap drop until drop ; \ Shift upper section(8x32) or lower section (8x32) of matrix_array(16x32) to left(1Word) \ ( n1 -- ) n1:0=upper section d512=lower section : shift_bit matrix_array + 8 0 do dup dup \ ( addr addr addr ) d31 0 do dup 2+ \ ( addr addr addr addr+2 ) W@ swap W! \ ( addr addr ) 2+ dup \ ( addr addr+2 addr+2 ) loop 2drop \ ( addr ) d64 + \ next line loop drop ; \ Display 8x8character to upper/lower on adafruit matrix16x32 \ 'adafruit'_char is used by 'adafruit_str' \ character move from right to left \ ( n1 -- ) n1:character code : adafruit_char h20 - 8 u* Font + \ Get Font address ( addr ) 8 0 do dup \ ( addr addr ) C@ \ ( addr value ) 1 \ ( addr value 1 ) 8 0 do \ Save b0 value of each line 2dup and \ ( addr value 1 1/0 ) if color W@ else 0 then \ ( addr value 1 row/0 ) matrix_array i d64 u* + offset W@ + d62 + \ b0 position dup \ ( addr value 1 row/0 [address of b0] [address of b0] ) W@ \ ( addr value 1 row/0 [address of b0] [value of b0] ) offset W@ 0= \ upper or lower? if upper_m \ upper section else lower_m \ lower section then and rot \ ( addr value 1 [address of b0] [masked value of b0] row/0 ) \ upper or lower? offset W@ 0= if R1 \ upper section else R2 \ lower section then lshift \ ( addr value 1 [address of b0] [masked value of b0] [shifted row/0] ) or swap \ ( addr value 1 [value of b0] [address of b0] ) W! \ ( addr value 1 ) 1 lshift 4 delms loop \ ( addr value h100 ) offset W@ shift_bit \ Shift b30-b0 of upper section to 1bit left 2drop \ ( addr ) 1+ loop drop ; \ \ ( n1 n2 n3 -- ) n1:cstr n2:color n3:0=upper 1=lower : adafruit_str if d512 else 0 then \ ( n1 n2 d512/0 ) offset W! \ ( n1 n2 ) color W! \ ( n1 ) C@++ \ ( c-addr+1 c1 ) c-addr+1: string's first char addr c1:string length dup if bounds do i C@ adafruit_char loop \ Print string else 2drop then ; : demo1 prepare_array c" scan" 0 cogx begin c" May the Forth be with you. " 2 0 adafruit_str c" PropForth5.5 " 4 1 adafruit_str fkey? swap drop until 0 cogreset ;