fl { PropForth 5.5 2023/10/10 22:12:31 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 \ 4pcs of 8x8Matrix \ 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 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@ alignl 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]] in position[0] \ ( 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 ; \ 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 ; \ Display characters \ ( -- ) : demo1 clrMatrix 4 c" Prop" setString \ bufferWrite buffer W@ din num a_bufferWrite d2000 delms h20 begin dup dispChar 1+ d20 delms h80 over < if 1 else 0 then until drop ; : demo2 clrMatrix wave 0 d5000 0 do 2dup + C@ getCharBit \ bufferWrite buffer W@ din num a_bufferWrite shift1bitLeft 1+ dup d12 = if drop 0 then loop 2drop ; : demo3 clrMatrix 4 c" Prop" setString \ bufferWrite buffer W@ din num a_bufferWrite 8 c" Prop" setString \ bufferWrite buffer W@ din num a_bufferWrite d10 c" Prop" setString \ bufferWrite buffer W@ din num a_bufferWrite ; { \ ( 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 }