( lcd driver for MinPod ) SCRUB COLD ( **************************************************************** ( I/O PORTS ( ( I/O Ports Assign Function ( ~~~ ~~~~~ ~~~~~~~~~~~~~~~ ( I/O PA0 LCD, DB0 ( I/O PA1 LCD, DB1 ( I/O PA2 LCD, DB2 ( I/O PA3 LCD, DB3 ( I/O PA4 LCD, DB4 ( I/O PA5 LCD, DB5 ( I/O PA6 LCD, DB6 ( I/O PA7 LCD, DB7 ( O PE6 LCD, RS (register select. LOW: command, HIGH: data) ( O PE5 LCD, R/W (READ: signal high, WRITE: signal low) ( O PE4 LCD, E (chip enable, active high) ( **************************************************************** HEX ( ==== Tools ==== ) : LCD8@ ( -- d ) 00 FB2 ! ( data in ) PE5 ON ( RD high PE4 ON ( E high enable chip FB1 @ ( read data bus ) PE4 OFF ( E low disable chip ; EEWORD : LCD8! ( d -- ) FF FB2 ! ( data out ) PE5 OFF ( WR low FB1 ! ( output data ) PE4 ON ( E high enable chip PE4 OFF ( E low disable chip ; EEWORD : CMD> ( -- d ) PE6 OFF LCD8@ ; EEWORD : LCD> ( -- d ) PE6 ON LCD8@ ; EEWORD : WNB ( -- ) BEGIN CMD> 80 AND 0= ?TERMINAL OR UNTIL ; EEWORD : >CMD ( d -- ) PE6 OFF LCD8! WNB ; EEWORD : >LCD ( d -- ) PE6 ON LCD8! WNB ; EEWORD : LCD-INIT ( -- ) EF FF1 ! ( outputs high for R/W.E5 RS.E6, low for E.E4 ) 7F FF2 ! ( DDR outputs for E.A6 R/W.A5 RS.A4 ) 0F FF3 ! ( release all PE4-7 lines from PER ) FF FB1 ! ( outputs all port A high FF FB2 ! ( DDR outputs 0 FB3 ! ( release all port A lines from PER ) 38 >CMD ( reset sequence for 38 >CMD ( EIGHT bit interface 6 >CMD ( entry mode set: increment; no shift ( F >CMD ( display on; cursor on; blink on C >CMD ( display on; cursor off; blink off 1 >CMD ( display clear 80 >CMD ( cursor in top left position ; EEWORD : CLEAR WNB 1 >CMD ; EEWORD : AT8C WNB 8C >CMD ; EEWORD : HOME WNB 2 >CMD ; EEWORD : CRLF WNB C0 >CMD ; EEWORD : MOVE-CURSOR WNB 80 OR >CMD ; EEWORD : RIGHT-UPPER-CORNER 27 MOVE-CURSOR ; EEWORD : CURSOR? WNB CMD> 7F AND ; EEWORD : LCD>L WNB 10 >CMD CURSOR? 27 > IF RIGHT-UPPER-CORNER THEN ; EEWORD : LCD>R WNB 14 >CMD CURSOR? 27 > IF HOME THEN ; EEWORD : LCD-EMIT WNB >LCD ; EEWORD : LCD-SPACE BL LCD-EMIT ; EEWORD : LCD-SPACES 0 MAX BEGIN ?DUP WHILE 1- LCD-SPACE REPEAT ; EEWORD : LCD-TYPE BEGIN DUP 0= NOT WHILE 1- SWAP DUP @ LCD-EMIT 1+ SWAP REPEAT 2DROP ; EEWORD : LCD-PTYPE BEGIN DUP 0= NOT WHILE 1- SWAP DUP P@ LCD-EMIT 1+ SWAP REPEAT 2DROP ; EEWORD : D.RLCD ( d \ n -- ) >R SWAP OVER DABS <# #S SIGN #> R> OVER - LCD-SPACES LCD-TYPE ; EEWORD : .LCD ( n -- ) DUP ABS 0 <# #S SIGN #> LCD-TYPE ; EEWORD : $>P ; EEWORD $>P S1$ IsoMax Time: EEWORD VARIABLE SECOND EEWORD DECIMAL ( display tick on lcd ) : LCD-TICK 50000 PERIOD ( With DECIMAL 50000 PERIOD, ( the variable TCFTICKS will be incremented ( 100 times per second. 0 SECOND ! ISOMAX-START SECOND @ .LCD TCFTICKS @ BEGIN TCFTICKS @ OVER - 100 > IF SECOND 1+! ( tick++ AT8C ( move cursor at SECOND @ .LCD ( display tick on lcd DROP TCFTICKS @ THEN ?TERMINAL UNTIL DROP ( stop if any key is hit ; EEWORD : TEST1 LCD-INIT S1$ PCOUNT LCD-PTYPE CR ." Now displaying tick on LCD " CR ." To stop, hit any key... " LCD-TICK ; EEWORD TEST1