( GENERIC LCD OUTPUT ROUTINES ( ----- HEX 404 DP ! ( LCD DISPLAY ROUTINES ( ----- B5FC CONSTANT DSP-CMD B5FD CONSTANT DSP-DATA : WAIT-NOT-BUSY BEGIN DSP-CMD C@ 80 AND 0= UNTIL ; : DSP-CLEAR WAIT-NOT-BUSY 1 DSP-CMD C! ; : DSP-HOME WAIT-NOT-BUSY 2 DSP-CMD C! ; 28 CONSTANT DC/L ( position cursor on top 00-27 or bottom 28-4F line -- 2x40 DISPLAY : DSP-AT ( n -- ) DUP DC/L MOD 80 OR SWAP DC/L 1- > IF 40 OR THEN WAIT-NOT-BUSY DSP-CMD C! ; ( return cursor position : CURSOR? ( -- n ) WAIT-NOT-BUSY DSP-CMD C@ 7F AND ; ( print a character, move cursor to left : DSP-EMIT ( char -- ) WAIT-NOT-BUSY DSP-DATA C! ; ( print a string on the lcd, writes past end of line....... : DSP-TYPE ( addr n -- ) ?DUP IF 0 DO COUNT DSP-EMIT LOOP THEN DROP ; ( init the display : DSP-ON WAIT-NOT-BUSY 38 DSP-CMD C! ( GET ATTN ) 38 DSP-CMD C! ( SET 2 LINE DISP, 2x40 ) 6 DSP-CMD C! ( CHARACTER ENTRY RIGHT ) C DSP-CMD C! ; ( DISPLAY CONTROL ON, CURSOR OFF ) ( COMPILE NON-PRINTING STRINGS ( ----- : (") R@ 2+ COUNT DUP 1+ R> + >R ; : " COMPILE (") 22 WORD C@ 1+ ALLOT ; IMMEDIATE : DSP-SPACES ( n -- ) ?DUP IF 0 DO BL DSP-EMIT LOOP THEN ; : (D.) ( d -- addr # ) SWAP OVER DABS <# #S SIGN #> ; : DSP-D. ( d -- ) (D.) DSP-TYPE BL DSP-EMIT ; : DSP-D.R ( d n -- ) >R (D.) R> OVER - 0 MAX DSP-SPACES DSP-TYPE ; : DSP-. ( n -- ) S->D DSP-D. ; : DSP-F. ( fp -- ) (F.) DSP-TYPE ; : DSP-E. ( fp -- ) (E.) DSP-TYPE ; : TEST DSP-ON CR ." PRESS ANY KEY TO CONTINUE... " DSP-CLEAR " THIS IS A TEST " DSP-TYPE KEY DROP CR ." PRESS ANY KEY TO CONTINUE... " DSP-CLEAR " PI IS " DSP-TYPE PI DSP-F. KEY DROP CR ." PRESS ANY KEY TO END THE LCD TEST. " DSP-CLEAR " A NUMBER " DSP-TYPE 1234. DSP-D. KEY DROP ; ( **** keypad routine **** ) : PA0? B000 C@ 1 AND ; : GET-KEY B00A C@ 2/ 2/ 2/ ; : DELAY 2000 0 DO LOOP ; : KEYPAD CR ." TO EXIT THE KEYPAD TEST, PRESS 'J' BUTTON ON THE KEYPAD " DSP-ON DSP-CLEAR BEGIN BEGIN PA0? UNTIL GET-KEY 9 > IF 37 ELSE 30 THEN GET-KEY + DSP-EMIT DELAY GET-KEY 37 + 4A = UNTIL ;