1 ADD = 48128 : DAT = 48129 : EA = 7 : PA = 14 : PB=15 2 BIT = 0 : BYTE = 0 : ERR = 0 : FINAL = 0 : DB = 0 3 POKE ADDR,PA : POKE DAT,1 : REM SET CLK HIGH 5 POKE ADDR,EA : POKE DAT,64 : REM SET PA AS O/P PB AS I/P 6 POKE ADDR,PB : POKE DAT,0 : REM SET DATA LINE LOW PB0 7 DIM Q(7) : FOR X=0 TO 7 : Q(X)=2^X : NEXT X : REM PRE-CALCULATE 2^X 8 GOSUB 63000 : REM SETUP WEEK DAYS 10 GOSUB 40000 : REM CLR I2C 15 INPUT "DO YOU WANT TO SET THE TIME? (Y/N)";A$ 16 IF A$ = "Y" THEN GOSUB 50000 17 GOSUB 61000 : REM READ DATE AND TIME 18 GOSUB 62000 : REM READ TEMPERATURE 19 END 1000 REM SET CLK HIGH 1010 POKE ADD,PA 1020 A=PEEK(ADD) 1030 A=A OR 1 1050 POKE DAT,A 1060 RETURN 2000 REM SET CLK LOW 2020 POKE ADD,PA 2030 A=PEEK(ADD) 2040 A=A AND 254 2060 POKE DAT,A 2070 RETURN 3000 REM SET DATA HIGH (SET PB AS I/P) 3010 POKE ADD,EA 3020 A=PEEK(ADD) 3030 A=A AND 127 : REM MSB = 0 3050 POKE DAT,A 3060 RETURN 4000 REM SET DAT LOW (SET PB AS O/P) 4010 POKE ADD,EA 4020 A=PEEK(ADD) 4030 A=A OR 128 : REM MSB = 1 4060 POKE DAT,A 4070 RETURN 5000 REM START 5001 IF DB THEN PRINT "START" 5010 GOSUB 4000 : REM SET DATA LOW 5020 GOSUB 2000 : REM SET CLK LOW 5030 RETURN 6000 REM STOP 6001 IF DB THEN PRINT "STOP" 6010 GOSUB 4000 : REM DATA LOW 6015 GOSUB 1000 : REM CLK HIGH 6020 GOSUB 3000 : REM DATA HIGH 6030 RETURN 7000 REM SEND BIT 7010 IF BIT = 1 THEN GOTO 7030 7020 GOSUB 4000 : GOTO 7040 : REM SET DATA LOW 7030 GOSUB 3000 : REM SET DATA HIGH 7040 GOSUB 1000 : GOSUB 2000 : REM CLOCK OUT 7050 RETURN 8000 REM ACK 8001 IF DB THEN PRINT "ACK" 8010 BIT = 0 : GOSUB 7000 8020 RETURN 9000 REM NACK 9001 IF DB THEN PRINT "NACK" 9010 BIT = 1 : GOSUB 7000 9020 RETURN 10000 REM REC BIT 10010 GOSUB 1000 : REM CLOCK HIGH 10020 POKE ADD,15 : BIT = PEEK(ADD) AND 1 10030 GOSUB 2000 : REM CLOCK LOW 10040 RETURN 20000 REM WRITE 20001 IF DB THEN PRINT "WRITE" 20005 ERR = 0 20010 FOR X=7 TO 0 STEP -1 20020 IF (BYTE AND Q(X)) THEN BIT = 1 : GOSUB 7000 : GOTO 20050 20030 BIT = 0 : GOSUB 7000 20050 NEXT X 20060 GOSUB 3000 : GOSUB 10000 : REM SET DATA HIGH, GET ACK 20070 IF BIT = 0 THEN ERR = 1 20080 RETURN 30000 REM READ 30001 IF DB THEN PRINT "READ" 30002 BYTE = 0 30005 GOSUB 3000 : REM SET DATA HIGH 30010 FOR X=0 TO 7 30020 GOSUB 10000 : REM READ BIT 30030 BYTE = BYTE + (Q(7-X)*BIT) 30040 NEXT X 30045 IF FINAL = 0 THEN GOSUB 8000 : GOTO 30055 : REM ACK 30050 GOSUB 9000 : REM NACK IF FINAL READ 30055 IF DB THEN PRINT "READ BYTE IS = ", BYTE 30060 RETURN 40000 REM CLEAR I2C 40001 IF DB THEN PRINT "CLEAR I2C" 40010 GOSUB 6000 : REM STOP 40020 GOSUB 5000 : REM START 40030 GOSUB 3000 : REM DATA HIGH 40040 FOR Y= 0 TO 8 40050 GOSUB 1000 : REM CLK HIGH 40060 GOSUB 2000 : REM CLK LOW 40065 NEXT Y 40070 GOSUB 5000 : REM START 40080 GOSUB 6000 : REM STOP 40090 RETURN 50000 REM SET TIME / DATE 50001 PRINT "SET TIME AND DATE" 50020 GOSUB 5000 : REM START 50030 BYTE = 208 : REM RTC ADDR 50040 GOSUB 20000 50050 IF ERR = 1 THEN PRINT "SUCCESS, WAIT.." : GOTO 50061 50060 PRINT "ERROR - NO ack" : RETURN 50061 BYTE=0 : REM START AT REG 0 50062 GOSUB 20000 : REM WRITE 50090 BYTE = 0 : REM SECS 50100 GOSUB 20000 50110 BYTE = 48 : REM MINS (30 IN BCD) 50120 GOSUB 20000 50130 BYTE = 21 : REM HOURS (15:00) 50140 GOSUB 20000 50150 BYTE = 6 : REM FRIDAY 50160 GOSUB 20000 50170 BYTE = 16 : REM 10TH IN BCD 50180 GOSUB 20000 50190 BYTE = 16 : REM OCT (10 IN BCD) 50200 GOSUB 20000 50210 BYTE = 32 : REM YEAR = 20 IN BCD 50220 GOSUB 20000 : REM WRITE 50230 GOSUB 9000 : REM NACK 50240 GOSUB 6000 : REM STOP 50250 RETURN 60000 REM BCD TO DECIMAL 60001 IF DB THEN PRINT "BCD TO DECIMAL" 60010 MSB = BYTE AND 240 : REM BYTE & 0xF0 60020 LSB = BYTE AND 15 : REM BYTE & 0x0F 60030 DECIMAL = ((MSB/16) * 10) + LSB 60040 RETURN 61000 REM READ TIME AND DATE 61001 PRINT "READING TIME AND DATE" 61010 GOSUB 5000 : REM START 61020 BYTE = 208 : REM RTC ADDR 61030 GOSUB 20000 61040 IF ERR = 1 THEN PRINT "SUCCESS, WAIT..." : GOTO 61060 61050 PRINT "ERROR - NO ack" : RETURN 61060 BYTE=0 :REM START AT REG 0 61070 GOSUB 20000 : REM WRITE 61080 GOSUB 6000 : REM STOP 61090 GOSUB 5000 : REM START 61100 BYTE = 209 : REM INDICATE READ OPERATION TO RTC 61110 GOSUB 20000 : REM WRITE 61120 FINAL = 0 : MT=0 61130 FOR C=0 TO 6 61140 IF C = 6 THEN FINAL = 1 61150 GOSUB 30000 : REM READ 61160 GOSUB 60000 61170 IF C = 0 THEN SECS = DECIMAL : GOTO 61240 61180 IF C = 1 THEN MINS = DECIMAL : GOTO 61240 61190 IF C = 2 THEN HRS = DECIMAL : GOTO 61240 61200 IF C = 3 THEN DOW = DECIMAL : GOTO 61240 61210 IF C = 4 THEN DTE = DECIMAL : GOTO 61240 61220 IF C = 5 THEN MT = DECIMAL : GOTO 61240 61230 IF C = 6 THEN YEAR = DECIMAL 61240 NEXT C 61250 GOSUB 9000 : REM NACK 61260 GOSUB 6000 : REM STOP 61270 PRINT CHR$(12) : PRINT "THE TIME AND DATE IS:" 61280 PRINT 2000+YEAR;D$(DOW);DTE;"/";MT;" ";HRS;":";MINS;":";SECS : PRINT 61290 RETURN 62000 REM READ TEMPERATURE 62001 PRINT "READING TEMPERATURE" 62010 GOSUB 5000 : REM START 62020 BYTE = 208 : REM RTC ADDR 62030 GOSUB 20000 62040 IF ERR = 1 THEN PRINT "SUCCESS, WAIT..." : PRINT : GOTO 62060 62050 PRINT "ERROR - NO ack" : RETURN 62060 BYTE=17 :REM START AT REG 0x11 62070 GOSUB 20000 : REM WRITE 62080 GOSUB 6000 : REM STOP 62090 GOSUB 5000 : REM START 62100 BYTE = 209 : REM INDICATE READ OPERATION TO RTC 62110 GOSUB 20000 : REM WRITE 62120 FINAL = 0 62130 FOR C=0 TO 1 62140 IF C = 1 THEN FINAL = 1 62150 GOSUB 30000 : REM READ 62160 GOSUB 60000 62170 IF C = 0 THEN TA = BYTE : GOTO 62240 62180 IF C = 1 THEN TB = ((BYTE AND 192) / 64)* 0.25 62240 NEXT C 62245 TA = TA AND 255 62250 IF TA AND 128 THEN TA = TA-1 : TA = NOT TA : TA = TA AND 255 62250 GOSUB 9000 : REM NACK 62260 GOSUB 6000 : REM STOP 62270 PRINT "TEMPERATURE IS:"; TA+TB;"CELSIUS" 62290 RETURN 63000 REM SETUP WEEK DAYS 63010 DIM D$(7) 63020 FOR I=1 TO 7 63030 READ D$(I) 63040 NEXT I 63050 DATA "Sun","Mon","Tue","Wed","Thu","Fri","Sat" 63060 RETURN