fl { PropForth 5.5 2023/10/01 18:00:40 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 | ----------------------------------- 3 2 1 0 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 4 wconstant num \ 4pcs 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 \ =========================================================================== \ Main \ =========================================================================== : 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 decode spiWrite cs_h cs_l intensity 1+ spiWrite cs_h cs_l scan 7 + spiWrite cs_h cs_l shutdown 1+ spiWrite cs_h cs_l 0 spiWrite cs_h cs_l 0 spiWrite cs_h cs_l 0 spiWrite cs_h { cs_l 4 0 do decode spiWrite loop cs_h cs_l 4 0 do intensity 1+ spiWrite loop cs_h cs_l 4 0 do scan 7 + spiWrite loop cs_h cs_l 4 0 do shutdown 1+ 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! buffer W@ 8 0 do dup i 4* + cs_l dup 3 + C@ +Digit W@ or spiWrite dup 2+ C@ +Digit W@ or spiWrite dup 1+ C@ +Digit W@ or spiWrite C@ +Digit W@ or spiWrite cs_h h100 +Digit W+! loop drop ; \ 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 \ st? if dup L@ 1+ over L! then 4+ loop 2drop ; \ Display character \ ( n1 -- ) n1:ascii code : dispChar h20 - 8 * Font + 8 0 do \ case of 4pcs 8x8Matrix buffer W@ 8 0 do dup L@ 1 lshift over L! 4+ loop drop dup C@ getCharBit bufferWrite 1+ 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 ; \ Display 4 char \ ( cstr -- ) cstr:string addr : dispStr4char C@++ \ ( c-addr+1 c1 ) c-addr+1: string's first char addr c1:string length drop 4 bounds do i C@ dispChar loop ; \ Add change in chara-data[byte] of buffer \ ( n1 -- n2 ) : glitch rnd d200 > if rnd d112 > if 1 lshift else 1 rshift then hFF and then ; \ Write all buffer's value with glitch to all MAX7219 \ ( -- ) : bufferWriteGlitch h100 +Digit W! buffer W@ 8 0 do dup i 4* + cs_l dup 3 + C@ glitch +Digit W@ or spiWrite dup 2+ C@ glitch +Digit W@ or spiWrite dup 1+ C@ glitch +Digit W@ or spiWrite C@ glitch +Digit W@ or spiWrite cs_h h100 +Digit W+! loop drop ; \ Display character with glitch \ ( n1 -- ) n1:ascii code : dispCharGlitch h20 - 8 * Font + 8 0 do dup C@ getCharBit bufferWriteGlitch d50 delms buffer W@ 8 0 do dup L@ 1 lshift over L! 4+ loop drop 1+ loop drop ; \ Display string with glitch \ ( cstr -- ) cstr:string addr : dispStrGritch C@++ \ ( c-addr+1 c1 ) c-addr+1: string's first char addr c1:string length dup if bounds do i C@ dispCharGlitch loop \ Print string else 2drop then ; \ Display characters \ ( -- ) : demo1 clrMatrix c" Prop" dispStr4char d1000 delms h20 begin dup dispChar 1+ d20 delms h80 over < if 1 else 0 then until drop wave 0 d100 0 do 2dup + C@ getCharBit bufferWrite \ case of 4pcs 8x8Matrix buffer W@ 8 0 do dup L@ 1 lshift over L! 4+ loop drop 1+ dup d12 = if drop 0 then loop 2drop ; \ Display characters \ ( -- ) : demo2 clrMatrix c" Prop" dispStr4char d1000 delms begin bufferWriteGlitch d50 delms fkey? swap drop until bufferWrite ; \ Display string \ ( -- ) : demo3 clrMatrix c" May the Forth be with you " dispStr begin c" May the Forth be with you " dispStrGritch fkey? swap drop until clrMatrix ;