fl { PropForth 5.5 2023/10/15 18:49:44 4pcs of 8x8Matrix-module on Max7219 b7....b0 b7....b0 b7....b0 b7....b0 ----------------- .... ------------------ | Digit1 | Digit1 | | Digit1 | Digit1 | | Digit2 | Digit2 | | Digit2 | Digit2 | | Digit3 | Digit3 | | Digit3 | Digit3 |- <----5V | Digit4 | Digit4 | .... | Digit4 | Digit4 |- GND | Digit5 | Digit5 | | Digit5 | Digit5 |- DIN | Digit6 | Digit6 | | Digit6 | Digit6 |- CS | Digit7 | Digit7 | | Digit7 | Digit7 |- CLK | Digit8 | Digit8 | | Digit8 | Digit8 | ----------------- .... ----------------- num num-1 2 1 position } \ =========================================================================== \ Constants \ =========================================================================== 0 wconstant din 1 wconstant cs 2 wconstant clk \ register h900 constant decode hA00 constant intensity hB00 constant scan hC00 constant shutdown hF00 constant test d16 wconstant num \ num pcs of 8x8Matrix num 8 * wconstant column \ character h31 "1" \ b7 b6 b5 b4 b3 b2 b1 b0 address \ Low \ 1 | \ 1 1 | \ 1 1 1 1 1 1 1 1 | \ 1 1 1 1 1 1 1 1 | \ 1 | \ 1 V \ High 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, h3F c, h7F c, h40 c, h40 c, h7F c, h3F 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 + d760 h03 c, h03 c, h1C c, h3E c, h41 c, h41 c, h63 c, h22 c, \ Font + d768 variable wave -4 allot h80 c, h80 c, h40 c, h20 c, 8 c, 2 c, 1 c, 1 c, 2 c, 8 c, h20 c, h40 c, \ =========================================================================== \ Variables \ =========================================================================== wvariable buffer wvariable bufferSize wvariable +Digit wvariable posAddr \ shift1bitLeft 1charSave HalfLen1bitLeftShift HalfLen1bitRightShift wvariable tmp \ =========================================================================== \ Main \ =========================================================================== \ ( n1 n2 n3 -- ) n1:buffer W@ n2:din n3:num lockdict create a_bufferWrite forthentry $C_a_lxasm w, h13F h113 1- tuck - h9 lshift or here W@ alignl h10 lshift or l, z2WiaBB l, z1SyLI[ l, z2WyaG1 l, zfiaJB l, z20yPO1 l, z2WyaO1 l, zfiaRB l, z20yPO1 l, z2WyaW1 l, zfiaZB l, z1SyLI[ l, z2WiaeB l, z1SyLI[ l, z2WyP[0 l, z2WyPb8 l, z20iafs l, z2WiPns l, z1[ix[u l, z24yab1 l, zianw l, z1biamC l, z1Sya4i l, z3[yPn\ l, z1bix[u l, z20yP[0 l, z20iafs l, z3[yPfY l, z1SV01X l, zfyajG l, z2WyPrG l, zgyaj1 l, z1bfx[t l, z1[Zx[t l, z1bix[v l, 0 l, z1[ix[v l, z3[yPvk l, z1SV000 l, 0 l, 0 l, 0 l, 0 l, 0 l, 0 l, freedict : cs_l cs pinlo ; : cs_h cs pinhi ; : clk_l clk pinlo ; : clk_h clk pinhi ; : din_l din pinlo ; : din_h din pinhi ; \ Shift out data with MSBfirst \ ( n1 -- ) : spiWrite h8000 d16 0 do 2dup and 0= if din_l else din_h then clk_h clk_l 1 rshift loop 2drop ; \ Clear 8x8matrix and buffere \ ( -- ) : clrMatrix 9 1 do cs_l num 0 do j 8 lshift spiWrite loop cs_h loop buffer W@ num 8 * 0 fill ; \ Initialize MAX7219 \ ( -- ) : init cs pinout clk pinout din pinout cs_h here W@ buffer W! num 8 * bufferSize W! cs_l num 0 do decode spiWrite loop cs_h cs_l num 0 do intensity 1+ spiWrite loop cs_h cs_l num 0 do scan 7 + spiWrite loop cs_h cs_l num 0 do shutdown 1+ spiWrite loop cs_h cs_l num 0 do test spiWrite loop cs_h clrMatrix ; \ Set brightness of 8x8Matrix \ ( n1 -- ) n1:0..15 : brightness dup 0 d15 between if cs_l num 0 do dup intensity or spiWrite loop drop cs_h else ." Brightness out of range" drop then ; \ Write all buffer to all MAX7219 \ ( -- ) : bufferWrite h100 +Digit W! \ Write data from Digit1 to Digit8 8 0 do \ Get buffer's addr of Digit*' matrix(right end) buffer W@ num i * + \ Write data of Digit* to MAX7219 cs_l num 1+ 1 do dup num i - + C@ +Digit W@ or spiWrite loop cs_h drop h100 +Digit W+! loop ; \ Save bit data from Font character[1byte] to buffer[Digit1[b0]..Digit8[b0]] to right end \ ( n1 -- ) n1:byte : getCharBit buffer W@ \ ( byte buffer ) 8 0 do over 1 i lshift and if dup C@ 1+ over C! then num + loop 2drop ; \ Save bit data from Font character[1byte] to buffer[Digit1[b0]..Digit8[b0]] to left end \ ( n1 -- ) n1:byte : getCharBitLeft buffer W@ num + 1- \ ( byte buffer ) \ Digit1...Digit8 8 0 do over \ ( byte buffer byte ) 1 i lshift and \ Check if specfied bit is 1 if dup C@ h80 or over C! then \ If bit is 1, b7 is 1 num + \ next Digit line loop 2drop ; \ Shift to left 1bit from Digit1...Digit8 \ \ ( n1 -- ) : shift1bitLeft buffer W@ \ ( fontAddr buffer ) 8 0 do \ Digit1...Digit8 0 tmp W! dup num i * + \ ( fontAddr buffer buffer+Digit* ) \ matrix from 1 to num num 0 do dup C@ 1 lshift dup \ ( fontAddr buffer buffer+Digit* 1byte 1byte ) tmp W@ + 2 ST@ C! \ ( fontAddr buffer buffer+Digit* 1byte ) h100 and if 1 else 0 then tmp W! \ next byte's b0 1+ \ ( fontAddr buffer buffer+Digit*+1 ) loop drop loop drop \ ( fontAddr ) ; \ Display character \ ( n1 -- ) n1:ascii code : dispChar h20 - 8 * Font + \ Display 1-character row by row 8 0 do shift1bitLeft dup C@ getCharBit 1+ \ bufferWrite buffer W@ din num a_bufferWrite loop drop ; \ Display string \ ( cstr -- ) cstr:string addr : dispStr C@++ \ ( c-addr+1 c1 ) c-addr+1: string's first char addr c1:string length dup if bounds do i C@ dispChar loop \ Print string else 2drop then ; \ Save 1-character data in buffer \ ( n1 -- ) n1:character code : 1charSave h20 - 8 * Font + \ ( FontAddr ) posAddr W@ swap \ ( posAddr FontAddr ) \ Save 8-line of Font in buffere[Digit1...Digit8] 8 0 do \ Collect only 1bit[b0,b1,b2,b3,b4,b5,b6,b7] 8 0 do tmp W@ 1 lshift tmp W! dup C@ 1 j lshift and if 1 tmp W+! then 1+ loop 8 - tmp W@ 2 ST@ C! \ Save 1line of chae-Font to buffer[Digit*] swap num + swap \ next address of Digit* loop 2drop ; \ Set string to specified position matrix \ ( n1 n2 -- ) n1:position[left end:num right end:1] n2:cstr : setString C@++ \ ( n1 c-addr c1 ) rot \ ( c-addr c1 n1 ) 2dup > if nip dup then \ ( c-addr n3 n1 ) str-length=n3:c1 or n1 buffer W@ + 1- posAddr W! \ ( c-addr str-length ) \ Save string in buffer 0 do dup C@ 1charSave \ Save 1line of Font-char in buffer 1+ \ ( c-addr+1 ) posAddr W@ 1- posAddr W! \ Update posAddr loop drop ; \ Right half of matrixs shift 1bit to left \ ( -- ) : HalfLen1bitLeftShift \ Digit1...Digit8 8 0 do 0 tmp W! column 2 / 8 u/mod \ ( bit byte ) buffer W@ i num * + swap \ ( bit bufferAddr byte ) \ Shift 1bit Digit* to left 0 do dup C@ 1 lshift tmp W@ if 1 or then \ ( bit bufferAddr data+b0 ) dup h100 and if 1 else 0 then tmp W! \ Make tmp for next byte's b0 over C! 1+ \ ( bit bufferAddr+1 ) loop swap \ ( bufferAddr bit ) 0> \ If not 0, next byte's lower4bit shift 1bit to left if dup C@ dup 1 lshift tmp W@ if 1 or then \ ( bufferAddr data data+b0 ) hF and swap hF0 and or swap C! else drop then \ ( -- ) loop ; \ Left half of matrixs shift 1bit to right \ ( -- ) : HalfLen1bitRightShift \ Digit1...Digit8 8 0 do 0 tmp W! column 2 / 8 u/mod \ ( bit byte ) buffer W@ num + 1- i num * + swap \ ( bit bufferAddr byte ) \ Shift 1bit Digit* to right 0 do dup C@ 1 rshift tmp W@ if h80 or then \ ( bit bufferAddr b7+data ) over C@ 1 and if 1 else 0 then tmp W! \ Make tmp for next byte's b7 over C! 1- \ ( bit bufferAddr-1 ) loop swap \ ( bufferAddr bit ) 0> \ If not 0, next byte's upper4bit shift 1bit to right if dup C@ dup 1 rshift tmp W@ if h80 or then \ ( bufferAddr data b7+data ) hF0 and swap hF and or swap C! else drop then \ ( -- ) loop ; \ Display all characters \ ( -- ) : demo1 clrMatrix 4 c" Prop" setString \ bufferWrite buffer W@ din num a_bufferWrite d2000 delms h20 begin dup dispChar 1+ d30 delms h80 over < if 1 else 0 then until drop ; \ wave \ ( -- ) : demo2 clrMatrix wave 0 d150 0 do 2dup + C@ getCharBit \ bufferWrite buffer W@ din num a_bufferWrite shift1bitLeft 1+ dup d12 = if drop 0 then d40 delms loop 2drop ; \ arrow < \ ( -- ) : demo3 clrMatrix h3C h20 - 8 * Font + 0 d150 0 do 2dup + C@ getCharBit buffer W@ din num a_bufferWrite shift1bitLeft 1+ dup 8 = if drop 0 then d50 delms loop 2drop ; \ arrow L-->R L<--R : demo4 clrMatrix \ begin d30 0 do 6 0 do HalfLen1bitRightShift h3E h20 - 8 * Font + 5 i - + C@ getCharBitLeft HalfLen1bitLeftShift h3C h20 - 8 * Font + i + C@ getCharBit buffer W@ din num a_bufferWrite d30 delms loop \ fkey? swap drop \ until loop ; \ random matrix-on : demo5 clrMatrix d10 brightness \ begin d50 0 do rnd num 2dup < if 2drop 0 else / then buffer W@ + dup \ matrix on 8 0 do dup hFF swap C! num + loop drop buffer W@ din num a_bufferWrite d30 delms \ matrix off 8 0 do dup 0 swap C! num + loop drop buffer W@ din num a_bufferWrite \ fkey? swap drop \ until loop 2 brightness ; \ random bit-on : demo6 clrMatrix d10 brightness \ begin d50 0 do 8 0 do buffer W@ num i * + num 0 do dup 0 d30 0 do rnd + loop d10 / swap C! 1+ loop drop loop buffer W@ din num a_bufferWrite \ 100 delms \ fkey? swap drop \ until loop clrMatrix 2 brightness ; : test init d100 delms demo1 demo2 demo3 demo4 demo5 demo6 ; { \ ( n1 n2 n3 -- ) n1:buffer W@ n2:din n3:num \ $C_treg1 -- Digit addr countup number \ $C_treg2 -- matrix counter \ $C_treg3 -- num \ $C_treg4 -- spi bit counter fl build_BootOpt :rasm mov __num , $C_stTOS spop mov __din , # 1 shl __din , $C_stTOS add $C_stTOS , # 1 mov __cs , # 1 shl __cs , $C_stTOS add $C_stTOS , # 1 mov __clk , # 1 shl __clk , $C_stTOS spop mov __buffer , $C_stTOS spop \ loop of Digit1..Digit8 mov $C_treg1 , # h100 mov $C_treg2 , # 8 __1 add __buffer , __num mov $C_treg3 , __num \ Set cs to Lo andn outa , __cs __2 sub __buffer , # 1 rdbyte __data , __buffer \ 16bit data or __data , $C_treg1 jmpret __shiftOut_ret , # __shiftOut djnz $C_treg3 , # __2 \ Set cs to Hi or outa , __cs add $C_treg1 , # h100 add __buffer , __num djnz $C_treg2 , # __1 jexit __shiftOut shl __data , # d16 mov $C_treg4 , # d16 __3 shl __data , # 1 wc if_c or outa , __din if_nc andn outa , __din \ Set clk to Hi or outa , __clk nop \ Set clk to Lo andn outa , __clk djnz $C_treg4 , # __3 __shiftOut_ret ret __num 0 __din 0 __cs 0 __clk 0 __buffer 0 __data 0 ;asm a_bufferWrite }