fl { 0 _crf W! : .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 ; } { LCD(SC1602A) Propeller RS P14 0xe E P15 0xf DB4 P16 0x10 DB5 P17 0x11 DB6 P18 0x12 DB7 P19 0x13 } e constant _rs f constant _enable 10 constant _db4 1 _rs lshift constant _rsm 1 _enable lshift constant _em : _rs_out_l _rsm _maskoutlo ; : _rs_out_h _rsm _maskouthi ; : _e_out_l _em _maskoutlo ; : _e_out_h _em _maskouthi ; : set_data _db4 lshift ; : mask f set_data invert ; : LCD_com \ _rs_out_l dup 4 rshift set_data outa COG@ mask and or outa COG! _e_out_h _e_out_l f and set_data outa COG@ mask and or outa COG! _e_out_h _e_out_l 5 delms ; : LCD_init \ 8bit mode \ set from P14 to P19 to output _rs 6 0 do dup pinout 1+ loop drop \ set from P14 to P19 to low _rs 6 0 do dup 1 swap lshift _maskoutlo 1+ loop drop 32 delms \ wait 50msec outa COG@ 3 set_data or outa COG! _e_out_h _e_out_l 5 delms _e_out_h _e_out_l 1 delms _e_out_h _e_out_l 5 delms outa COG@ mask and 2 set_data or outa COG! _e_out_h _e_out_l \ 4bit mode 0 1 c 6 1 c 28 7 0 do LCD_com loop ; \ display character ( char -- ) : char _rs_out_h LCD_com ; \ display string ( cstr -- ) : LCD_str C@++ dup if bounds do i C@ char loop else 2drop then ; \ clear LCD : LCD_clear _rs_out_l 1 LCD_com ; { x -- horizontal pos : 1 to 16 y -- line number : 1 or 2 ( x y -- ) } : pos_move _rs_out_l 1- 40 u* swap 1- 80 + + LCD_com ; : LCD_demo LCD_init \ display char-code [0x20 - 0x7f] & [0xa0 - 0xff] 20 7 0 do i 3 = if 4 seti drop a0 then 2 0 do 1 i 1+ pos_move 10 0 do dup char 100 delms 1+ loop loop loop drop LCD_clear 1 1 pos_move c" May the FORTH be" LCD_str 1 2 pos_move c" with you." LCD_str ;