;LCD CLOCK ; Requirements: PCB v0.94c, ATMEGA32 FW v0.94c ; VIA Base Address = $2000 (8192 DECIMAL) ; REQUIRES FOLLOWING ASM ROUTINES: ; - SINGLE REGISTER READ ; - LCD SETCURSOR ; - LCD INITIALIZE ; - SHIFT REGISTER DATA OUT ; HARDWARE CONNECTIONS: ; - LCD'S REGISTER SELECT "RS" CONNECTED TO DIGITAL OUTPUT 1 ; - LCD'S DATA LINES "DB0" TO "DB8" CONNECTED TO DIGITAL OUTPUT 9 TO 16 ; - LCD'S ENABLE "E" CONNECTED TO CS2 LINE ON THE OUTPUT CONNECTOR. ; - "CS2" LINE THROUGH-HOLE CONNECTED TO THROUGH-HOLE "B" (ADDR $B000=45056 --> 45056-65536=-20480 IN BASIC) ; - LCD'S "R/W" TO GND, POWER AND CONTRAST BY THE BOOK 10 CALL 1616 :REM INIT LCD 20 POKE 644,1: POKE 645,0: CALL 1792 :REM SET ROW=1, COL=0 30 GOSUB 21000 :REM PRINT "+" IN LEFT UPPER CORNER 40 GOSUB 22000 :REM PRINT A ROW OF "-" ON THE TOP LINE 45 GOSUB 21000 :REM PRINT "+" IN RIGHT UPPER CORNER 50 POKE 644,80: POKE 645,0: CALL 1792 :REM SET ROW=4, COL=0 60 GOSUB 21000 :REM PRINT "+" IN LEFT LOWER CORNER 70 GOSUB 22000 :REM PRINT A ROW OF "-" ON THE LOWER LINE 80 GOSUB 21000 :REM PRINT "+" IN THE RIGHT LOWER CORNER 90 POKE 644,64: POKE 645,0: CALL 1792 :REM SET ROW=2, COL=0 100 POKE 643,33:GOSUB 10000 :REM PRINT "!" 110 POKE 644,64:POKE 645,15: CALL 1792 :REM SET ROW=2, COL=15 120 POKE 643,33:GOSUB 10000 :REM PRINT "!" 130 POKE 644,16:POKE 645:0: CALL 1792 :REM SET ROW=3, COL=0 140 POKE 643,33:GOSUB 10000 :REM PRINT "!" 150 POKE 644,16;POKE 645,15: CALL 1792 :REM SET ROW=3, COL=15 160 POKE 643,33:GOSUB 10000 :REM PRINT "!" 170 GOTO 23000 :REM GO TO CLOCK ROUTINE 10000 POKE 642,1 :REM SET BIT 1 OF SR LO-BYTE TO 1 (INSTRUCTION MODE) 10010 CALL 1584 :REM SHIFT OUT 10020 D=PEEK(-20480) :REM SEND ENABLE COMMAND TO LCD 10030 POKE 642,0 :REM SET BIT 1 OF SR LO-BYTE TO 0 (DATA MODE) 10035 RETURN 22000 POKE 643,45 :REM LOAD "-" CHAR IN SR HI-BYTE 22010 FOR I=1 TO 14 :REM CYCLE TO PRINT 14x "-" 22020 GOSUB 10000 :REM OUT CHAR 22030 NEXT I 22040 RETURN 23000 POKE 644,64: POKE 645:4: CALL 1792:REM SET ROW=2, COL=4 23003 FOR I=0 TO 5 :REM CYCLE TO READ ALL CLOCK REGISTERS 23005 POKE 640,I: CALL 1536 :REM SET REQUIRED REGISTER AND CALL SUB TO READ IT 23010 V=PEEK(641) :REM GET REGISTER'S VALUE 23030 D=V/10:U=V-(D-10) :REM SPLIT IN TENS AND UNITS 23050 GOSUB 24000 :REM OUT SINGLE DIGITS OF CURRENT VALUT 23060 IF (I=0 OR I=1) THEN GOSUB 25000 :REM PLACE ":" BETWEEN HOURS/MINUTES AND MINUTES/SECONDS 23070 IF I=2 THEN GOSUB 26000 :REM IF WE'RE ABOUT TO READ THE DATE, MOVE CURSOR TO NEW ROW/COL 23080 IF (I=3 OR I=4) THEN GOSUB 27000 :REM PLACE "/" BEWEEEN DAY/MONTH AND MONTH/YEAR 23090 IF I=4 THEN GOSUB 28000 :REM JUST BEFORE PRINTING THE 2-DIGIT YEAR PRINT "2""0" 23100 NEXT I 23999 GOTO 23000 24000 POKE 643,D+48: GOSUB 10000 :REM ADD 48 TO VALUE TENS, TO GET THE RIGHT ASCII CODE, AND OUTPUT IT 24010 POKE 643,U+48: GOSUB 10000 :REM ADD 48 TO VALUE UNITS, TO GET THE RIGHT ASCII CODE, AND OUTPUT IT 24020 RETURN 25000 POKE 643,58:GOSUB 10000:RETURN :REM OUTPUT ":" 26000 POKE 644,16: POKE 645,3: CALL 1792:REM SET ROW=3, COL=3 26010 RETURN 27000 POKE 543,47: GOSUB 10000: RETURN :REM OUTPUT "/" 28000 POKE 643,50: GOSUB 10000 :REM OUTPUT "2" 28010 POKE 643,48: GOSUB 10000 :REM OUTPUT "0" 20020 RETURN