( CMPS03 I2C ( 1 VCC ( 2 SCL PB0 ( 3 SDA PB1 ( 9 GND SCRUB ( COLD DECIMAL LOOPINDEX BITCNT 0 START 8 END EEWORD HEX VARIABLE BITLINE EEWORD ( temp variable for result VARIABLE BITSTATUS EEWORD VARIABLE R/W EEWORD VARIABLE BYTEOUT EEWORD VARIABLE BYTEIN EEWORD : SCL? PB0 ON? ; EEWORD ( test if SCL is allowed high, not down by another : SCL+ SCL? DROP ; EEWORD ( actual usage for I2C to see if line released : SCL- PB0 OFF ; EEWORD ( I/O turned off : SDA? PB1 ON? ; EEWORD : SDA+ SDA? DROP ; EEWORD : SDA- PB1 OFF ; EEWORD : I2CSTART ( sequence to begin i2c comms SDA+ ( bring SDA low while SCL is high then SCL low to begin clocking SCL+ SDA- SCL- SDA+ ( LET GO DATA ; EEWORD : I2CSTOP ( sequence to end i2c comms SDA- ( bring SCL high while SDA is low, then DA high too SCL+ SDA+ ; EEWORD : CLK. SCL+ SCL- ; EEWORD : CLK.? SCL+ ( clock in the ack' bit SDA? SCL- ; EEWORD : ACK.? SDA+ ( MAKE LINE HIGH SO SLAVE CAN ACK WITH LOW CLK.? SDA+ ; EEWORD : ACK.! SDA- CLK. SDA+ ; EEWORD : BITLINE> ( BIT SHIFT OUT BITLINE @ 2* DUP BITLINE ! 100 AND IF SDA+ ELSE SDA- THEN CLK. SDA+ ( LET GO ; EEWORD : >BITLINE ( BIT SHIFT IN CLK.? IF 1 ELSE 0 THEN BITLINE @ 2* + BITLINE ! ; EEWORD : I2COUTBYTE BITLINE ! BITLINE> BITLINE> BITLINE> BITLINE> BITLINE> BITLINE> BITLINE> BITLINE> ACK.? ; EEWORD : I2CINBYTE 0 BITLINE ! >BITLINE >BITLINE >BITLINE >BITLINE >BITLINE >BITLINE >BITLINE >BITLINE BITLINE @ ; EEWORD : READB ( test word to read all I2CSTART C0 I2COUTBYTE . 0 I2COUTBYTE . I2CSTART C1 I2COUTBYTE . I2CINBYTE ACK.! . ( READ AND SHOW ALL 16 REGISTERS I2CINBYTE ACK.! . I2CINBYTE ACK.! . I2CINBYTE ACK.! . I2CINBYTE ACK.! . I2CINBYTE ACK.! . I2CINBYTE ACK.! . I2CINBYTE ACK.! . I2CINBYTE ACK.! . I2CINBYTE ACK.! . I2CINBYTE ACK.! . I2CINBYTE ACK.! . I2CINBYTE ACK.! . I2CINBYTE ACK.! . I2CINBYTE ACK.! . I2CINBYTE I2CSTOP . ; EEWORD : DIR? ( 0-FF value from register 1 I2CSTART C0 I2COUTBYTE DROP 1 I2COUTBYTE DROP I2CSTART C1 I2COUTBYTE DROP I2CINBYTE I2CSTOP . ; EEWORD : DIRW? ( 0-EOF value from registers 2, 3 I2CSTART C0 I2COUTBYTE DROP 2 I2COUTBYTE DROP I2CSTART C1 I2COUTBYTE DROP I2CINBYTE ACK.! >< I2CINBYTE I2CSTOP OR . ; EEWORD