fl { Displaying characters on DotMatrix(16x16) X 2 2010/5/1 propforth4.0a column - P0 - P4 row clock - P5 data - P6 latch - P7 } : .long dup 10 rshift .word .word ; : _sttop 2e _cv ; : _stptr 5 _cv ; : st? ." ST: " _stptr COG@ 2+ dup _sttop < if _sttop swap - 0 do _sttop 2- i - COG@ .long space loop else drop then cr ; : variable lockdict create $C_a_dovarl w, 0 l, forthentry freedict ; wvariable LED_data 3e allot \ 64byte 8000 wconstant char_start bfff wconstant char_end wvariable char_addr variable mask 0 wconstant _addr 5 wconstant _clk 6 wconstant _data 7 wconstant _latch 1 _clk lshift constant _clkm 1 _data lshift constant _datam 1 _latch lshift constant _latchm : _clk_out_l _clkm _maskoutlo ; : _clk_out_h _clkm _maskouthi ; : _data_out_l _datam _maskoutlo ; : _data_out_h _datam _maskouthi ; : _latch_out_l _latchm _maskoutlo ; : _latch_out_h _latchm _maskouthi ; : clock_out _clk_out_h _clk_out_l ; : latch_out _latch_out_h _latch_out_l ; : 16x32_matrix _addr 8 0 do dup pinout 1+ loop drop _data_out_l 10 0 do clock_out loop latch_out \ reset shift-register 0 \ set start address begin dup 2 u* LED_data + W@ 10 0 do dup 1 i lshift and 0> if _data_out_h else _data_out_l then clock_out loop drop latch_out \ set row (16bit data) dup outa COG@ ffffffe0 and or outa COG! \ set column (0x0 - 0x1f) 1+ dup 20 = if drop 0 then 0 until ; : get_line \ ( n1 n2 -- n3 ) n1:even/odd n2:character address n3:char-data(16bit) 0 rot2 swap 1+ mask L! 10 0 do dup L@ mask L@ and 0<> if swap 1+ swap then mask dup L@ 2 lshift swap L! i f < if swap 1 lshift swap then \ st? loop drop ; : demo \ 16x16 LED_data 20 0 do dup 0 swap W! 2+ loop drop \ clear LED_data[0] - LED_data[31] c" 16x32_matrix" 5 cogx char_start char_addr W! begin 2 0 do i \ 0:even char 1:odd char char_addr W@ 10 0 do 2dup get_line \ get 1-line for charcter LED_data 20 0 do dup dup 2+ W@ swap W! 2+ loop \ LED_data[n] <- LED_data[n+1] drop LED_data 3e + W! 8 + \ st? 10 delms \ wait loop 2drop loop char_addr dup W@ 80 + swap W! \ next charcter char_addr W@ char_end > if char_start char_addr W! then \ final charcter? 0 until ; : demo1 \ 16x32 LED_data 20 0 do dup 0 swap W! 2+ loop drop \ clear LED_data[0] - LED_data[31] c" 16x32_matrix" 5 cogx char_start char_addr W! begin 2 0 do i \ 0:even char 1:odd char char_addr W@ 20 0 do 2dup get_line \ get 1-line for charcter LED_data 20 0 do dup dup 2+ W@ swap W! 2+ loop \ LED_data[n] <- LED_data[n+1] drop LED_data 3e + W! 4+ 50 delms \ wait loop 2drop loop char_addr dup W@ 80 + swap W! \ next charcter char_addr W@ char_end > if char_start char_addr W! then \ final charcter? 0 until ;