fl { Adafruit 16X32 Matrix PropForth 5.5 2014/06/25 22:44:19 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 Dot buffer 32Long X 16 = 512Long(2048bytes) ------------------------- 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 for section wvariable n \ variable for demo 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 \ d62 constant array31 \ 31Word \ =========================================================================== \ 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 ; \ Shift upper section(8x32) or lower section (8x32) of matrix_array(16x32) to right(1Word) \ ( n1 -- ) n1:0=upper section d512=lower section : shift_bit_rev matrix_array + d62 + \ b0 position 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 characters(8x8) from right to left on upper section \ ( -- ) : demo1 prepare_array c" scan" 0 cogx 1 color W! Font begin 8 0 do \ upper section 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* + d62 + \ b0 position dup \ ( addr value 1 row/0 [address of b0] [address of b0] ) W@ upper_m and rot \ ( addr value 1 [address of b0] [masked value of b0] 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 ) 0 shift_bit \ Shift b30-b0 of upper section to 1bit left 2drop \ ( addr ) 1+ dup Font_end = if drop Font then loop color W@ 1+ dup 8 = if drop 1 then color W! fkey? swap drop until drop 0 cogreset ; \ Display characters(8x8) from left to right on lower section \ ( -- ) : demo2 prepare_array c" scan" 0 cogx 1 color W! Font_end 1- begin 8 0 do \ lower section 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 d512 + i d64 u* + dup \ ( addr value 1 row/0 [address of b0] [address of b0] ) \ dup . W@ lower_m and rot \ ( addr value 1 [address of b0] [masked value of b0] row/0 ) R2 lshift or swap \ ( addr value 1 [value of b0] [address of b0] ) W! \ ( addr value 1 ) 1 lshift 4 delms loop \ ( addr value h100 ) d512 shift_bit_rev \ Shift b31-b1 of lower section to 1bit right 2drop \ ( addr ) 1- dup Font < if drop Font_end 1- then loop color W@ 1+ dup 8 = if drop 1 then color W! fkey? swap drop until drop 0 cogreset ; \ Display characters(8x8) on upper section and lower section \ characters(8x8) from right to left on upper section \ characters(8x8) from left to right on lower section \ ( -- ) : demo3 prepare_array c" scan" 0 cogx 1 color W! Font_end 1- Font begin 8 0 do \ upper section 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* + d62 + \ b0 position dup \ ( addr value 1 row/0 [address of b0] [address of b0] ) W@ upper_m and rot \ ( addr value 1 [address of b0] [masked value of b0] row/0 ) or swap \ ( addr value 1 [value of b0] [address of b0] ) W! \ ( addr value 1 ) 1 lshift \ 1 delms loop \ ( addr value h100 ) 0 shift_bit \ Shift b30-b0 of upper section to 1bit left 2drop \ ( addr ) 1+ dup Font_end = if drop Font then loop color W@ 1+ dup 8 = if drop 1 then color W! \ lower section swap 8 0 do \ lower section 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 d512 + i d64 u* + dup \ ( addr value 1 row/0 [address of b0] [address of b0] ) \ dup . W@ lower_m and rot \ ( addr value 1 [address of b0] [masked value of b0] row/0 ) R2 lshift or swap \ ( addr value 1 [value of b0] [address of b0] ) W! \ ( addr value 1 ) 1 lshift \ 1 delms loop \ ( addr value h100 ) d512 shift_bit_rev \ Shift b31-b1 of lower section to 1bit right 2drop \ ( addr ) 1- dup Font < if drop Font_end 1- then loop swap fkey? swap drop until drop 0 cogreset ; { fl \ ( n1 -- n2 ) n1:address of buffer build_BootOpt :rasm rdword outa , $C_stTOS or outa , __clk add $C_stTOS , # 2 jexit __clk h200 ;asm a_matrix_16x32_2 } { matrix_array d512 + dup W@ h38 or swap W! matrix_array d1024 dump }