DS1307 PAGE 1 1 ;* FILENAME: DS1307.ASM 2 ;* DISPLAY: 16X2 LCD 4-BIT OPERATION 3 ;* MICRO: DS89C450 FLASH BASED MICRO 4 ;* PROJECT: ALARM CLOCK 5 ;* DATE: 09/07/20 6 ;* TIMEKEEPER: DS1307 SERIAL TIMEKEEPER I.C. 7 ; 8 ; 9 ; 10 $MOD51 0097 11 SCL BIT P1.7 0096 12 SDA BIT P1.6 00D0 13 DS1307W EQU 0D0H ; SLAVE ADDRESS 1101 000 + 0 TO WRITE 00D1 14 DS1307R EQU 0D1H ; SLAVE ADDRESS 1101 000 + 1 TO READ 0020 15 FLAGS DATA 20H 0000 16 LASTREAD BIT FLAGS.0 0005 17 ACK BIT FLAGS.5 0006 18 BUS_FLT BIT FLAGS.6 0007 19 _2W_BUSY BIT FLAGS.7 0021 20 BITCNT DATA 21H 0022 21 BYTECNT DATA 22H 0024 22 SECS DATA 24H ; ' SECONDS STORAGE RAM 0025 23 MINS DATA 25H ; ' MINUTES ' ' 0026 24 HRS DATA 26H ; ' HOURS ' ' 0027 25 DAY DATA 27H ; ' DAY ' ' 0028 26 DATE DATA 28H ; ' DATE ' ' 0029 27 MONTH DATA 29H ; ' MONTH ' ' 002A 28 YEAR DATA 2AH ; ' YEAR ' ' 002B 29 CONTROL DATA 2BH ; FOR STORAGE OF CONTROL REGISTER WHEN READ. 002C 30 ALM_HOUR DATA 2CH ; INTERNAL (ALARM HOURS) STORAGE. 002D 31 ALM_MIN DATA 2DH ; INTERNAL (ALARM MINUTES) STORAGE. 002E 32 ALM_CNTRL DATA 2EH ; INTERNAL STORAGE FOR ALARM (ON) TIME. 0008 33 ALM_STORE EQU 08H ; DS1307 RAM, ALARM STORAGE, BEGINNING. 34 35 ; ***LCD CONTROL*** 36 0080 37 LCD_DATA EQU 080H 0084 38 LCD_DB4 EQU 084H ; P0.4 HIGH NIBBLE OF PORT 0 IS USED FOR DATA 0085 39 LCD_DB5 EQU 085H ; P0.5 HIGH NIBBLE OF PORT 0 IS USED FOR DATA 0086 40 LCD_DB6 EQU 086H ; P0.6 HIGH NIBBLE OF PORT 0 IS USED FOR DATA 0087 41 LCD_DB7 EQU 087H ; P0.7 HIGH NIBBLE OF PORT 0 IS USED FOR DATA 00B3 42 LCD_RS EQU 0B3H ; P3.3 LCD REGISTER SELECT LINE 00B4 43 LCD_RW EQU 0B4H ; P3.4 LCD READ / WRITE LINE 00B5 44 LCD_E EQU 0B5H ; P3.5 LCD ENABLE LINE 45 46 ; ***USER INPUT KEYS*** 47 0090 48 UP_BTTN BIT 090H ; P1.0 UP 0091 49 DOWN_BTTN BIT 091H ; P1.1 DOWN 0092 50 ENTER BIT 092H ; P1.2 ENTER 0093 51 ALARM_SET BIT 093H ; P1.3 ALARM TIME SET SELECT 52 53 ; ***SYSTEM INSTRUCTIONS*** 54 0028 55 CONFIG EQU 28H ; 4-BIT DATA,2 LINES,5X7 MATRIX LCD 0006 56 ENTRYMODE EQU 6 ; INCREMENT CURSOR DON'T SHIFT DISPLAY 57 58 ; ***CURSOR CONTROL INSTRUCTIONS*** DS1307 PAGE 2 59 000C 60 OFFCUR EQU 0CH 000D 61 BLINKCUR EQU 0DH 62 63 ; ***DISPLAY CONTROL INSTRUCTIONS*** 64 0001 65 CLRDSP EQU 01H 000E 66 ONDSP EQU 0EH 67 68 ; ***MACRO'S*** 69 70 SCL_HIGH MACRO 71 SETB SCL ; SET SCL HIGH 72 JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL 73 ENDM 74 0000 75 CSEG AT 0 ; RESET VECTOR 0000 309202 76 JNB ENTER,INIT_YEAR 0003 010D 77 AJMP START 78 0005 79 INIT_YEAR: 0005 3092FD 80 JNB ENTER,INIT_YEAR 0008 752A97 81 MOV YEAR,#97H; INITIALIZE YEAR IF NEW 1307 TO 1997 000B B17F 82 ACALL SET_CLOCK; ELSE GO ON. 83 84 ; ********************************************************** 85 ; RESET GOES HERE TO START PROGRAM 86 ; ********************************************************** 87 000D 88 START: 000D 752A97 89 MOV YEAR,#97H ; SET YEAR TO 1997 ON BOOT 0010 7175 90 ACALL OFF ; ALARM OFF ON BOOT 0012 75812F 91 MOV SP,#2FH ; POSITION STACK ABOVE BUFFER 0015 75A800 92 MOV IE,#0 ; DISABLE INTERUPTS 0018 D296 93 SETB SDA ; ENSURE SDA HIGH 94 +1 SCL_HIGH ; ENSURE SCL HIGH 001A D297 95 +1 SETB SCL ; SET SCL HIGH 001C 3097FD 96 +1 JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL 001F C205 98 CLR ACK ; CLEAR STATUS FLAGS 0021 C206 99 CLR BUS_FLT 0023 C207 100 CLR _2W_BUSY 101 102 ; ********************************************************** 103 ; SUB SETS THE DS1307 OSCILLATOR 104 ; ********************************************************** 105 0025 106 OSC_CONTROL: 0025 F11E 107 ACALL SEND_START ; GENERATE START CONDITION 0027 74D0 108 MOV A,#DS1307W ; 1101 0000 ADDRESS + WRITE-BIT 0029 F155 109 ACALL SEND_BYTE ; SEND BYTE TO 1307 002B 7400 110 MOV A,#00H ; ADDRESS BYTE TO REGISTER 00H 002D F155 111 ACALL SEND_BYTE ; SECONDS REGISTER, ALWAYS LEAVE 002F D200 112 SETB LASTREAD ; REG 00H-BIT #7 = 0 (LOW) 0031 F13B 113 ACALL SEND_STOP ; IF REG 00H-BIT #7 = 1 CLOCK 0033 F11E 114 ACALL SEND_START ; OSCILLATOR IS OFF. 0035 74D1 115 MOV A,#DS1307R ; 1101 0001 ADDRESS + READ-BIT 0037 F155 116 ACALL SEND_BYTE ; 0039 D1FD 117 ACALL READ_BYTE ; READ A BYTE FROM THE 1307 DS1307 PAGE 3 003B C2E7 118 CLR ACC.7 ; CLEAR REG 00H-BIT #7 TO ENABLE 003D 119 OSC_SET: ; OSCILLATOR. 003D C0E0 120 PUSH ACC ; SAVE ON STACK 003F F13B 121 ACALL SEND_STOP ; 0041 F11E 122 ACALL SEND_START ; 0043 74D0 123 MOV A,#DS1307W ; SETUP TO WRITE 0045 F155 124 ACALL SEND_BYTE ; 0047 7400 125 MOV A,#00H ; REGISTER 00H ADDRESS 0049 F155 126 ACALL SEND_BYTE ; 004B D0E0 127 POP ACC ; GET DATA TO START OSCILLATOR 004D F155 128 ACALL SEND_BYTE ; SEND IT 004F F13B 129 ACALL SEND_STOP 0051 9169 130 ACALL BEGIN 131 132 ; ********************************************************** 133 ; TIME AND DATE ROUTINE, GET & DISPLAY MONTH/DATE/YEAR 134 ; ********************************************************** 135 0053 136 GET_TIME: 0053 F182 137 ACALL READ_CLOCK ; GET TIME,DATE,ALARM DATA 0055 30925B 138 JNB ENTER,SET_TIME ; GOTO SET TIME IF PUSHED 0058 309351 139 JNB ALARM_SET,SET_ALARMS ; GOTO SET ALARMS ELSE SHOW TIME 005B 7401 140 MOV A,#1 ; LINE #1 005D 75F001 141 MOV B,#1 ; COLUMN #1 0060 D183 142 ACALL PLACECUR4 ; PLACE CURSOR FOR DAY 0062 E527 143 MOV A,DAY ; GET DAY 0064 B131 144 ACALL GET_DAY ; SHOW DAY OF WEEK 0066 7401 145 MOV A,#1 0068 75F007 146 MOV B,#7 006B D183 147 ACALL PLACECUR4 ; PLACE CURSOR FOR MONTH 006D E529 148 MOV A,MONTH ; LOAD MONTH DATA 006F 9149 149 ACALL WRITE_BCD 0071 7401 150 MOV A,#1 0073 75F00A 151 MOV B,#10 ; PLACE CURSOR FOR DATE 0076 D183 152 ACALL PLACECUR4 0078 E528 153 MOV A,DATE 007A 9149 154 ACALL WRITE_BCD 007C 7401 155 MOV A,#1 007E 75F00D 156 MOV B,#13 0081 D183 157 ACALL PLACECUR4 0083 E52A 158 MOV A,YEAR 0085 9149 159 ACALL WRITE_BCD 160 161 ; ********************************************************** 162 ; NOW GET & DISPLAY TIME 163 ; ********************************************************** 164 0087 7402 165 MOV A,#2 0089 75F004 166 MOV B,#4 008C D183 167 ACALL PLACECUR4 008E E526 168 MOV A,HRS 0090 9149 169 ACALL WRITE_BCD 0092 7402 170 MOV A,#2 0094 75F007 171 MOV B,#7 0097 D183 172 ACALL PLACECUR4 0099 E525 173 MOV A,MINS 009B 9149 174 ACALL WRITE_BCD 009D 7402 175 MOV A,#2 DS1307 PAGE 4 009F 75F00A 176 MOV B,#10 00A2 D183 177 ACALL PLACECUR4 00A4 E524 178 MOV A,SECS 00A6 9149 179 ACALL WRITE_BCD 00A8 7165 180 ACALL CHECK_ALARM_TIME 00AA 80A7 181 SJMP GET_TIME 182 00AC 183 SET_ALARMS: 00AC 3093FD 184 JNB ALARM_SET,SET_ALARMS 00AF D1A5 185 ACALL MDELAY 00B1 41D0 186 AJMP ALARMS 187 00B3 188 SET_TIME: 00B3 3092FD 189 JNB ENTER,SET_TIME; HOLDS HERE UNTIL BUTTON IS RELEASED 00B6 D1A5 190 ACALL MDELAY 191 00B8 192 SET_DAY: 00B8 7401 193 MOV A,#1 00BA 75F000 194 MOV B,#0 00BD D183 195 ACALL PLACECUR4 00BF D16F 196 ACALL PRTLCD4 00C1 2A00 197 DB '*',0 ; PRINT '*' BY DAY 198 00C3 199 WAIT_DAY: ; WAIT HERE FOR BUTTON PRESS 00C3 30901A 200 JNB UP_BTTN,UP_DAY 00C6 309125 201 JNB DOWN_BTTN,DOWN_DAY 00C9 309230 202 JNB ENTER,ENTER_DAY 00CC 51F4 203 ACALL UPDATE 00CE 80F3 204 SJMP WAIT_DAY 205 00D0 206 REDO_DAY: ; RESETS DAY TO SUN 00D0 7401 207 MOV A,#1 00D2 F527 208 MOV DAY,A 00D4 01C3 209 AJMP WAIT_DAY 210 00D6 211 REDO_DAY_DOWN: ; RESETS DAY TO SAT 00D6 7407 212 MOV A,#7H 00D8 F527 213 MOV DAY,A 00DA 01C3 214 AJMP WAIT_DAY 215 00DC 216 OK_DAY: ; PLACES NEW DAY DATA INTO REGISTER 00DC F527 217 MOV DAY,A 00DE 01C3 218 AJMP WAIT_DAY 219 00E0 220 UP_DAY: ; CHANGES DAY DATA UP BY 1 00E0 3090FD 221 JNB UP_BTTN,UP_DAY 00E3 D1A5 222 ACALL MDELAY 00E5 7927 223 MOV R1,#DAY 00E7 E7 224 MOV A,@R1 00E8 04 225 INC A 00E9 B408F0 226 CJNE A,#8H,OK_DAY 00EC 01D0 227 AJMP REDO_DAY 228 00EE 229 DOWN_DAY: ; CHANGES MONTH DATA DOWN BY 1 00EE 3091FD 230 JNB DOWN_BTTN,DOWN_DAY 00F1 D1A5 231 ACALL MDELAY 00F3 7927 232 MOV R1,#DAY 00F5 E7 233 MOV A,@R1 DS1307 PAGE 5 00F6 14 234 DEC A 00F7 B400E2 235 CJNE A,#0,OK_DAY 00FA 01D6 236 AJMP REDO_DAY_DOWN 237 00FC 238 ENTER_DAY: ; DONE WITH DAY GO ON TO MONTH 00FC 3092FD 239 JNB ENTER,ENTER_DAY 00FF D1A5 240 ACALL MDELAY 241 0101 242 SET_MONTH: 0101 7401 243 MOV A,#1 0103 75F000 244 MOV B,#0 0106 D183 245 ACALL PLACECUR4 0108 D16F 246 ACALL PRTLCD4 010A 2000 247 DB ' ',0 ; PRINT '*' FOR MONTH 010C 7401 248 MOV A,#1 010E 75F006 249 MOV B,#6 0111 D183 250 ACALL PLACECUR4 0113 D16F 251 ACALL PRTLCD4 0115 2A00 252 DB '*',0 253 0117 254 WAIT_MONTH: ; WAIT HERE FOR BUTTON PRESS 0117 30901A 255 JNB UP_BTTN,UP_MONTH 011A 309127 256 JNB DOWN_BTTN,DOWN_MONTH 011D 309235 257 JNB ENTER,ENTER_MONTH 0120 51F4 258 ACALL UPDATE 0122 80F3 259 SJMP WAIT_MONTH 260 0124 261 REDO_MONTH: ; RESETS MONTH TO 1 0124 7401 262 MOV A,#1 0126 F529 263 MOV MONTH,A 0128 2117 264 AJMP WAIT_MONTH 265 012A 266 REDO_MONTH_DOWN: ; RESETS MONTH TO 12 012A 7412 267 MOV A,#12H 012C F529 268 MOV MONTH,A 012E 2117 269 AJMP WAIT_MONTH 270 0130 271 OK_MONTH: ; PLACES NEW MONTH DATA INTO REGISTER 0130 F529 272 MOV MONTH,A 0132 2117 273 AJMP WAIT_MONTH 274 0134 275 UP_MONTH: ; CHANGES MONTH DATA UP BY 1 0134 3090FD 276 JNB UP_BTTN,UP_MONTH 0137 D1A5 277 ACALL MDELAY 0139 7929 278 MOV R1,#MONTH 013B E7 279 MOV A,@R1 013C FC 280 MOV R4,A 013D F1B9 281 ACALL CHECK_BCD 013F B413EE 282 CJNE A,#13H,OK_MONTH 0142 2124 283 AJMP REDO_MONTH 284 0144 285 DOWN_MONTH: ; CHANGES MONTH DATA DOWN BY 1 0144 3091FD 286 JNB DOWN_BTTN,DOWN_MONTH 0147 D1A5 287 ACALL MDELAY 0149 7929 288 MOV R1,#MONTH 014B E7 289 MOV A,@R1 014C FC 290 MOV R4,A 014D F1D4 291 ACALL CHECK_BCD_DOWN DS1307 PAGE 6 014F 14 292 DEC A 0150 B400DD 293 CJNE A,#0,OK_MONTH 0153 212A 294 AJMP REDO_MONTH_DOWN 295 0155 296 ENTER_MONTH: ; DONE WITH MONTH GO ON TO DATE 0155 3092FD 297 JNB ENTER,ENTER_MONTH 0158 D1A5 298 ACALL MDELAY 299 015A 300 SET_DATE: 015A 7401 301 MOV A,#1 015C 75F006 302 MOV B,#6 015F D183 303 ACALL PLACECUR4 0161 D16F 304 ACALL PRTLCD4 0163 2000 305 DB ' ',0 ; ERASE '*' BY MONTH 0165 7401 306 MOV A,#1 0167 75F009 307 MOV B,#9 016A D183 308 ACALL PLACECUR4 016C D16F 309 ACALL PRTLCD4 016E 2A00 310 DB '*',0 ; PRINT '*' BY DATE 311 0170 312 WAIT_DATE: ; WAIT HERE UNTIL BUTTON PRESS 0170 30901A 313 JNB UP_BTTN,UP_DATE 0173 309127 314 JNB DOWN_BTTN,DOWN_DATE 0176 309235 315 JNB ENTER,ENTER_DATE 0179 51F4 316 ACALL UPDATE 017B 80F3 317 SJMP WAIT_DATE 318 017D 319 REDO_DATE: ; RESETS DATE TO 1 017D 7401 320 MOV A,#1 017F F528 321 MOV DATE,A 0181 2170 322 AJMP WAIT_DATE 323 0183 324 REDO_DATE_DOWN: ; RESETS DATE TO 31 0183 7431 325 MOV A,#31H 0185 F528 326 MOV DATE,A 0187 2170 327 AJMP WAIT_DATE 328 0189 329 OK_DATE: ; PLACES NEW DATE DATA INTO REGISTER 0189 F528 330 MOV DATE,A 018B 2170 331 AJMP WAIT_DATE 332 018D 333 UP_DATE: ; CHANGES DATE DATA UP BY 1 018D 3090FD 334 JNB UP_BTTN,UP_DATE 0190 D1A5 335 ACALL MDELAY 0192 7928 336 MOV R1,#DATE 0194 E7 337 MOV A,@R1 0195 FC 338 MOV R4,A 0196 F1B9 339 ACALL CHECK_BCD 0198 B432EE 340 CJNE A,#32H,OK_DATE 019B 217D 341 AJMP REDO_DATE 342 019D 343 DOWN_DATE: ; CHANGES DATE DATA DOWN BY 1 019D 3091FD 344 JNB DOWN_BTTN,DOWN_DATE 01A0 D1A5 345 ACALL MDELAY 01A2 7928 346 MOV R1,#DATE 01A4 E7 347 MOV A,@R1 01A5 FC 348 MOV R4,A 01A6 F1D4 349 ACALL CHECK_BCD_DOWN DS1307 PAGE 7 01A8 14 350 DEC A 01A9 B400DD 351 CJNE A,#0,OK_DATE 01AC 2183 352 AJMP REDO_DATE_DOWN 353 01AE 354 ENTER_DATE: ; DONE WITH DATE GO ON TO YEAR 01AE 3092FD 355 JNB ENTER,ENTER_DATE 01B1 D1A5 356 ACALL MDELAY 357 01B3 358 SET_YEAR: 01B3 7401 359 MOV A,#1 01B5 75F009 360 MOV B,#9 01B8 D183 361 ACALL PLACECUR4 01BA D16F 362 ACALL PRTLCD4 01BC 2D00 363 DB '-',0 ; PRINT '-' BESIDE DATE 01BE 7401 364 MOV A,#1 01C0 75F00C 365 MOV B,#12 01C3 D183 366 ACALL PLACECUR4 01C5 D16F 367 ACALL PRTLCD4 01C7 2A00 368 DB '*',0 ; PRINT '*' BESIDE YEAR 369 01C9 370 WAIT_YEAR: ; WAIT HERE FOR BUTTON PRESS 01C9 30901A 371 JNB UP_BTTN,UP_YEAR 01CC 309125 372 JNB DOWN_BTTN,DOWN_YEAR 01CF 309230 373 JNB ENTER,ENTER_YEAR 01D2 51F4 374 ACALL UPDATE 01D4 80F3 375 SJMP WAIT_YEAR 376 01D6 377 REDO_YEAR: ; RESETS YEAR TO 1 01D6 7497 378 MOV A,#97H 01D8 F52A 379 MOV YEAR,A 01DA 80ED 380 SJMP WAIT_YEAR 381 01DC 382 REDO_YEAR_DOWN: ; RESETS YEAR TO 99 01DC 7499 383 MOV A,#99H 01DE F52A 384 MOV YEAR,A 01E0 21C9 385 AJMP WAIT_YEAR 386 01E2 387 OK_YEAR: ; PLACES NEW YEAR DATA INTO REGISTER 01E2 F52A 388 MOV YEAR,A 01E4 21C9 389 AJMP WAIT_YEAR 390 01E6 391 UP_YEAR: ; CHANGES YEAR DATA UP BY 1 01E6 3090FD 392 JNB UP_BTTN,UP_YEAR 01E9 D1A5 393 ACALL MDELAY 01EB 792A 394 MOV R1,#YEAR 01ED E7 395 MOV A,@R1 01EE 04 396 INC A 01EF B49AF0 397 CJNE A,#9AH,OK_YEAR 01F2 21D6 398 AJMP REDO_YEAR 399 01F4 400 DOWN_YEAR: ; CHANGES YEAR DATA DOWN BY 1 01F4 3091FD 401 JNB DOWN_BTTN,DOWN_YEAR 01F7 D1A5 402 ACALL MDELAY 01F9 792A 403 MOV R1,#YEAR 01FB E7 404 MOV A,@R1 01FC 14 405 DEC A 01FD B496E2 406 CJNE A,#96H,OK_YEAR 0200 21DC 407 AJMP REDO_YEAR_DOWN DS1307 PAGE 8 408 0202 409 ENTER_YEAR: ; DONE WITH YEAR GO ON TO HOUR 0202 3092FD 410 JNB ENTER,ENTER_YEAR 0205 D1A5 411 ACALL MDELAY 412 0207 413 SET_HOUR: 0207 7401 414 MOV A,#1 0209 75F00C 415 MOV B,#12 020C D183 416 ACALL PLACECUR4 020E D16F 417 ACALL PRTLCD4 0210 2D00 418 DB '-',0 ; PRINT '-' BESIDE YEAR 0212 7402 419 MOV A,#2 0214 75F003 420 MOV B,#3 0217 D183 421 ACALL PLACECUR4 0219 D16F 422 ACALL PRTLCD4 021B 2A00 423 DB '*',0 ; PRINT '*' BESIDE HOUR 021D 411F 424 AJMP WAIT_HOUR 425 021F 426 WAIT_HOUR: ; WAIT HERE UNTIL BUTTON PRESS 021F 30901A 427 JNB UP_BTTN,UP_HOUR 0222 309127 428 JNB DOWN_BTTN,DOWN_HOUR 0225 309235 429 JNB ENTER,ENTER_HOUR 0228 51F4 430 ACALL UPDATE 022A 80F3 431 SJMP WAIT_HOUR 432 022C 433 REDO_HOUR: ; RESET HOUR TO 00 022C 7400 434 MOV A,#0 022E F526 435 MOV HRS,A 0230 411F 436 AJMP WAIT_HOUR 437 0232 438 REDO_HOUR_DOWN: ; RESET HOUR TO 23 0232 7423 439 MOV A,#23H 0234 F526 440 MOV HRS,A 0236 411F 441 AJMP WAIT_HOUR 442 0238 443 OK_HOUR: ; PLACE NEW HOUR DATA INTO REGISTER 0238 F526 444 MOV HRS,A 023A 411F 445 AJMP WAIT_HOUR 446 023C 447 UP_HOUR: ; CHANGES HOUR DATA UP BY 1 023C 3090FD 448 JNB UP_BTTN,UP_HOUR 023F D1A5 449 ACALL MDELAY 0241 7926 450 MOV R1,#HRS 0243 E7 451 MOV A,@R1 0244 FC 452 MOV R4,A 0245 F1B9 453 ACALL CHECK_BCD 0247 B424EE 454 CJNE A,#24H,OK_HOUR 024A 412C 455 AJMP REDO_HOUR 456 024C 457 DOWN_HOUR: ; CHANGES HOUR DATA DOWN BY ONE 024C 3091FD 458 JNB DOWN_BTTN,DOWN_HOUR 024F D1A5 459 ACALL MDELAY 0251 7926 460 MOV R1,#HRS 0253 E7 461 MOV A,@R1 0254 FC 462 MOV R4,A 0255 F1D4 463 ACALL CHECK_BCD_DOWN 0257 14 464 DEC A 0258 B4F9DD 465 CJNE A,#0F9H,OK_HOUR DS1307 PAGE 9 025B 4132 466 AJMP REDO_HOUR_DOWN 467 025D 468 ENTER_HOUR: ; DONE WITH HOUR GO ON TO MINUTES 025D 3092FD 469 JNB ENTER,ENTER_HOUR 0260 D1A5 470 ACALL MDELAY 471 0262 472 SET_MIN: 0262 7402 473 MOV A,#2 0264 75F003 474 MOV B,#3 0267 D183 475 ACALL PLACECUR4 0269 D16F 476 ACALL PRTLCD4 026B 2000 477 DB ' ',0 ; ERASE '*' BESIDE HOUR 026D 7402 478 MOV A,#2 026F 75F006 479 MOV B,#6 0272 D183 480 ACALL PLACECUR4 0274 D16F 481 ACALL PRTLCD4 0276 2A00 482 DB '*',0 ; PRINT '*' BESIDE MINUTES 483 0278 484 WAIT_MIN: ; WAIT HERE UNTIL BUTTON PRESS 0278 30901A 485 JNB UP_BTTN,UP_MIN 027B 309127 486 JNB DOWN_BTTN,DOWN_MIN 027E 309235 487 JNB ENTER,ENTER_MIN 0281 51F4 488 ACALL UPDATE 0283 80F3 489 SJMP WAIT_MIN 490 0285 491 REDO_MIN: ; RESET MINUTES TO 00 0285 7400 492 MOV A,#0 0287 F525 493 MOV MINS,A 0289 4178 494 AJMP WAIT_MIN 495 028B 496 REDO_MIN_DOWN: ; RESETS MINUTES TO 59 028B 7459 497 MOV A,#59H 028D F525 498 MOV MINS,A 028F 4178 499 AJMP WAIT_MIN 500 0291 501 OK_MIN: ; PLACE NEW MINUTE DATA INTO REGISTER 0291 F525 502 MOV MINS,A 0293 4178 503 AJMP WAIT_MIN 504 0295 505 UP_MIN: ; CHANGES MINUTES DATA UP BY 1 0295 3090FD 506 JNB UP_BTTN,UP_MIN 0298 D1A5 507 ACALL MDELAY 029A 7925 508 MOV R1,#MINS 029C E7 509 MOV A,@R1 029D FC 510 MOV R4,A 029E F1B9 511 ACALL CHECK_BCD 02A0 B460EE 512 CJNE A,#60H,OK_MIN 02A3 4185 513 AJMP REDO_MIN 514 02A5 515 DOWN_MIN: ; CHANGES MINUTES DATA DOWN BY 1 02A5 3091FD 516 JNB DOWN_BTTN,DOWN_MIN 02A8 D1A5 517 ACALL MDELAY 02AA 7925 518 MOV R1,#MINS 02AC E7 519 MOV A,@R1 02AD FC 520 MOV R4,A 02AE F1D4 521 ACALL CHECK_BCD_DOWN 02B0 14 522 DEC A 02B1 B4F9DD 523 CJNE A,#0F9H,OK_MIN DS1307 PAGE 10 02B4 418B 524 AJMP REDO_MIN_DOWN 525 02B6 526 ENTER_MIN: ; DONE WITH MINUTES GO ON TO SECONDS 02B6 3092FD 527 JNB ENTER,ENTER_MIN 02B9 D1A5 528 ACALL MDELAY 529 02BB 530 SET_SECONDS: 02BB 7402 531 MOV A,#2 02BD 75F006 532 MOV B,#6 02C0 D183 533 ACALL PLACECUR4 02C2 D16F 534 ACALL PRTLCD4 02C4 3A00 535 DB ':',0 ; PRINT ':' BESIDE MINUTES 02C6 D1A5 536 ACALL MDELAY 02C8 7400 537 MOV A,#00000000B ; SECONDS ARE SET TO 00 02CA F524 538 MOV SECS,A 02CC B17F 539 ACALL SET_CLOCK 02CE 0153 540 AJMP GET_TIME ; RETURN TO MAIN LOOP 541 02D0 542 ALARMS: 02D0 B1AC 543 ACALL RESETLCD4 02D2 B195 544 ACALL INITLCD4 02D4 7401 545 MOV A,#1 02D6 75F000 546 MOV B,#0 02D9 D183 547 ACALL PLACECUR4 02DB D16F 548 ACALL PRTLCD4 02DD 2D534554 549 DB '-SET ALARM TIME-',0 02E1 20414C41 02E5 524D2054 02E9 494D452D 02ED 00 02EE 919E 550 ACALL BEGIN3 ; PRINT HOUR & MINUTE SEPERATORS 02F0 7148 551 ACALL UPDATE3 ; DISPLAY ALARM TIME 02F2 617B 552 AJMP ALM_A ; GO TO SET HOURS & MINUTES ROUTINE 553 ; FOR ALARM TIME. 02F4 554 UPDATE: 02F4 7401 555 MOV A,#1 ; LINE #1 02F6 75F001 556 MOV B,#1 ; COLUMN #1 02F9 D183 557 ACALL PLACECUR4 ; PLACE CURSOR FOR DAY 02FB E527 558 MOV A,DAY ; GET DAY DATA 02FD B131 559 ACALL GET_DAY ; CONVERT BCD TO ASCII FOR LCD 02FF 7401 560 MOV A,#1 0301 75F007 561 MOV B,#7 0304 D183 562 ACALL PLACECUR4 ; PLACE CURSOR FOR MONTH 0306 E529 563 MOV A,MONTH ; LOAD DATE MONTH 0308 9149 564 ACALL WRITE_BCD 030A 7401 565 MOV A,#1 030C 75F00A 566 MOV B,#10 ; PLACE CURSOR FOR DATE 030F D183 567 ACALL PLACECUR4 0311 E528 568 MOV A,DATE ; LOAD DATE DATA 0313 9149 569 ACALL WRITE_BCD 0315 7401 570 MOV A,#1 0317 75F00D 571 MOV B,#13 031A D183 572 ACALL PLACECUR4 031C E52A 573 MOV A,YEAR 031E 9149 574 ACALL WRITE_BCD 575 576 ; ********************************************************** 577 ; NOW GET & DISPLAY TIME DS1307 PAGE 11 578 ; ********************************************************** 579 0320 580 UPDATE2: 0320 7402 581 MOV A,#2 0322 75F004 582 MOV B,#4 0325 D183 583 ACALL PLACECUR4 0327 E526 584 MOV A,HRS 0329 9149 585 ACALL WRITE_BCD 032B 7402 586 MOV A,#2 032D 75F007 587 MOV B,#7 0330 D183 588 ACALL PLACECUR4 0332 E525 589 MOV A,MINS 0334 9149 590 ACALL WRITE_BCD 0336 7402 591 MOV A,#2 0338 75F00A 592 MOV B,#10 033B D183 593 ACALL PLACECUR4 033D E524 594 MOV A,SECS 033F 9149 595 ACALL WRITE_BCD 0341 7C0C 596 MOV R4,#OFFCUR 0343 B1EE 597 ACALL WRLCDCOM4 ; TURN OFF CURSOR 0345 D1F0 598 ACALL BIG_DELAY 0347 22 599 RET 0348 600 UPDATE3: 0348 7402 601 MOV A,#2 034A 75F006 602 MOV B,#6 034D D183 603 ACALL PLACECUR4 034F E52C 604 MOV A,ALM_HOUR 0351 9149 605 ACALL WRITE_BCD 0353 7402 606 MOV A,#2 0355 75F009 607 MOV B,#9 0358 D183 608 ACALL PLACECUR4 035A E52D 609 MOV A,ALM_MIN 035C 9149 610 ACALL WRITE_BCD 035E 7C0C 611 MOV R4,#OFFCUR 0360 B1EE 612 ACALL WRLCDCOM4 0362 D1F0 613 ACALL BIG_DELAY 0364 22 614 RET 615 0365 616 CHECK_ALARM_TIME: 0365 E525 617 MOV A,MINS 0367 B52D0B 618 CJNE A,ALM_MIN,OFF 036A E526 619 MOV A,HRS 036C B52C06 620 CJNE A,ALM_HOUR,OFF 036F 752E10 621 MOV ALM_CNTRL,#10H ; LOAD VALUE TO TURN ON SQW OUT & ALARM 0372 9157 622 ACALL ALARM_CONTROL 0374 22 623 RET 624 0375 752E00 625 OFF: MOV ALM_CNTRL,#00H 0378 9157 626 ACALL ALARM_CONTROL ; LOAD VALUE TO TURN OFF ALARM & SQW OUT. 037A 22 627 RET 037B 628 ALM_A: 037B 7402 629 MOV A,#2 037D 75F005 630 MOV B,#5 0380 D183 631 ACALL PLACECUR4 0382 D16F 632 ACALL PRTLCD4 0384 2A00 633 DB '*',0 ; PRINT '*' BESIDE HOUR 634 0386 635 WAIT_HOUR1: ; WAIT HERE UNTIL BUTTON PRESS DS1307 PAGE 12 0386 30901A 636 JNB UP_BTTN,UP_HOUR1 0389 309127 637 JNB DOWN_BTTN,DOWN_HOUR1 038C 309235 638 JNB ENTER,ENTER_HOUR1 038F 7148 639 ACALL UPDATE3 0391 80F3 640 SJMP WAIT_HOUR1 641 0393 642 REDO_HOUR1: ; RESET HOUR TO 00 0393 7400 643 MOV A,#0 0395 F52C 644 MOV ALM_HOUR,A 0397 6186 645 AJMP WAIT_HOUR1 646 0399 647 REDO_HOUR_DOWN1: ; RESET HOUR TO 23 0399 7423 648 MOV A,#23H 039B F52C 649 MOV ALM_HOUR,A 039D 6186 650 AJMP WAIT_HOUR1 651 039F 652 OK_HOUR1: ; PLACE NEW HOUR DATA INTO REGISTER 039F F52C 653 MOV ALM_HOUR,A 03A1 6186 654 AJMP WAIT_HOUR1 655 03A3 656 UP_HOUR1: ; CHANGES HOUR DATA UP BY 1 03A3 3090FD 657 JNB UP_BTTN,UP_HOUR1 03A6 D1A5 658 ACALL MDELAY 03A8 792C 659 MOV R1,#ALM_HOUR 03AA E7 660 MOV A,@R1 03AB FC 661 MOV R4,A 03AC F1B9 662 ACALL CHECK_BCD 03AE B424EE 663 CJNE A,#24H,OK_HOUR1 03B1 6193 664 AJMP REDO_HOUR1 665 03B3 666 DOWN_HOUR1: ; CHANGES HOUR DATA DOWN BY ONE 03B3 3091FD 667 JNB DOWN_BTTN,DOWN_HOUR1 03B6 D1A5 668 ACALL MDELAY 03B8 792C 669 MOV R1,#ALM_HOUR 03BA E7 670 MOV A,@R1 03BB FC 671 MOV R4,A 03BC F1D4 672 ACALL CHECK_BCD_DOWN 03BE 14 673 DEC A 03BF B4F9DD 674 CJNE A,#0F9H,OK_HOUR1 03C2 6199 675 AJMP REDO_HOUR_DOWN1 676 03C4 677 ENTER_HOUR1: ; DONE WITH HOUR GO ON TO MINUTES 03C4 3092FD 678 JNB ENTER,ENTER_HOUR1 03C7 D1A5 679 ACALL MDELAY 680 03C9 681 SET_MIN1: 03C9 7402 682 MOV A,#2 03CB 75F005 683 MOV B,#5 03CE D183 684 ACALL PLACECUR4 03D0 D16F 685 ACALL PRTLCD4 03D2 2000 686 DB ' ',0 ; ERASE '*' BESIDE HOUR 03D4 7402 687 MOV A,#2 03D6 75F008 688 MOV B,#8 03D9 D183 689 ACALL PLACECUR4 03DB D16F 690 ACALL PRTLCD4 03DD 2A00 691 DB '*',0 ; PRINT '*' BESIDE MINUTES 692 03DF 693 WAIT_MIN1: ; WAIT HERE UNTIL BUTTON PRESS DS1307 PAGE 13 03DF 30901A 694 JNB UP_BTTN,UP_MIN1 03E2 309127 695 JNB DOWN_BTTN,DOWN_MIN1 03E5 309235 696 JNB ENTER,ENTER_MIN1 03E8 7148 697 ACALL UPDATE3 03EA 80F3 698 SJMP WAIT_MIN1 699 03EC 700 REDO_MIN1: ; RESET MINUTES TO 00 03EC 7400 701 MOV A,#0 03EE F52D 702 MOV ALM_MIN,A 03F0 61DF 703 AJMP WAIT_MIN1 704 03F2 705 REDO_MIN_DOWN1: ; RESETS MINUTES TO 59 03F2 7459 706 MOV A,#59H 03F4 F52D 707 MOV ALM_MIN,A 03F6 61DF 708 AJMP WAIT_MIN1 709 03F8 710 OK_MIN1: ; PLACE NEW MINUTE DATA INTO REGISTER 03F8 F52D 711 MOV ALM_MIN,A 03FA 61DF 712 AJMP WAIT_MIN1 713 03FC 714 UP_MIN1: ; CHANGES MINUTES DATA UP BY 1 03FC 3090FD 715 JNB UP_BTTN,UP_MIN1 03FF D1A5 716 ACALL MDELAY 0401 792D 717 MOV R1,#ALM_MIN 0403 E7 718 MOV A,@R1 0404 FC 719 MOV R4,A 0405 F1B9 720 ACALL CHECK_BCD 0407 B460EE 721 CJNE A,#60H,OK_MIN1 040A 61EC 722 AJMP REDO_MIN1 723 040C 724 DOWN_MIN1: ; CHANGES MINUTES DATA DOWN BY 1 040C 3091FD 725 JNB DOWN_BTTN,DOWN_MIN1 040F D1A5 726 ACALL MDELAY 0411 792D 727 MOV R1,#ALM_MIN 0413 E7 728 MOV A,@R1 0414 FC 729 MOV R4,A 0415 F1D4 730 ACALL CHECK_BCD_DOWN 0417 14 731 DEC A 0418 B4F9DD 732 CJNE A,#0F9H,OK_MIN1 041B 61F2 733 AJMP REDO_MIN_DOWN1 734 041D 735 ENTER_MIN1: ; DONE WITH MINUTES GO ON TO SECONDS 041D 3092FD 736 JNB ENTER,ENTER_MIN1 0420 D1A5 737 ACALL MDELAY 738 0422 739 SET_SECONDS1: 0422 7402 740 MOV A,#2 0424 75F008 741 MOV B,#8 0427 D183 742 ACALL PLACECUR4 0429 D16F 743 ACALL PRTLCD4 042B 3A00 744 DB ':',0 ; PRINT ':' BESIDE MINUTES 042D D1A5 745 ACALL MDELAY 746 042F 747 STORE_ALARMS: 042F F11E 748 ACALL SEND_START ; SEND 2-WIRE START CONDITION 0431 74D0 749 MOV A,#DS1307W ; SEND 1307 WRITE COMMAND 0433 F155 750 ACALL SEND_BYTE 0435 7408 751 MOV A,#ALM_STORE; POINT TO REGISTER DS1307 PAGE 14 752 ; 08H ON THE DS1307 0437 F155 753 ACALL SEND_BYTE 0439 792C 754 MOV R1,#ALM_HOUR; START WITH HOURS REGISTER 755 ; IN INTERNAL RAM 043B 756 SEND_LOOP2: 043B E7 757 MOV A,@R1 ; LOAD HOURS DATA FOR ALARM 043C F155 758 ACALL SEND_BYTE ; SET HOURS 043E 792D 759 MOV R1,#ALM_MIN 0440 E7 760 MOV A,@R1 ; LOAD MINUTES DATA FOR ALARM 0441 F155 761 ACALL SEND_BYTE ; SET MINUTES 0443 F13B 762 ACALL SEND_STOP ; SEND 2-WIRE STOP CONDITION 0445 9169 763 ACALL BEGIN ; SETUP DISPLAY AGAIN BEFORE RETURNING. 0447 0153 764 AJMP GET_TIME ; GO BACK TO SHOWING TIME AFTER 765 ; SETTING ALARM 766 767 ; ********************************************************** 768 ; BCD CONVERSION ROUTINE 769 ; ACC CONTAINS TIME DATA FROM RAM WHEN ROUTINE IS CALLED. 770 ; ********************************************************** 771 0449 772 WRITE_BCD: 0449 C0E0 773 PUSH ACC ; DECODE HIGH DIGIT 044B C4 774 SWAP A 044C 540F 775 ANL A,#0FH 044E 91BD 776 ACALL FIND ; LOOK IT UP & THEN PRINT IT. 0450 D0E0 777 POP ACC ; DECODE LOW DIGIT 0452 540F 778 ANL A,#0FH 0454 91BD 779 ACALL FIND 0456 22 780 RET 781 782 ; ********************************************************** 783 ; SUB CONTROLS THE ALARM OUTPUT 784 ; THE DS1307 SQW OUTPUT DRIVES THE ALARM BUZZER @ 1Hz 785 ; ********************************************************** 786 0457 787 ALARM_CONTROL: 0457 F11E 788 ACALL SEND_START 0459 74D0 789 MOV A,#DS1307W 045B F155 790 ACALL SEND_BYTE 045D 7407 791 MOV A,#07H 045F F155 792 ACALL SEND_BYTE 0461 792E 793 MOV R1,#ALM_CNTRL 0463 E7 794 MOV A,@R1 ; 10H = ALARM ON AT 1HZ 0464 F155 795 ACALL SEND_BYTE ; 00H = ALARM OFF & SQW OUT = GND 0466 F13B 796 ACALL SEND_STOP 0468 22 797 RET 798 799 ; ********************************************************** 800 ; SET UP DISPLAY ON BOOT, AND REDO DISPLAY AFTER CHANGE 801 ; ********************************************************** 802 0469 803 BEGIN: 0469 B1AC 804 ACALL RESETLCD4 046B B195 805 ACALL INITLCD4 046D 7401 806 MOV A,#1 046F 75F007 807 MOV B,#7 0472 D183 808 ACALL PLACECUR4 0474 D16F 809 ACALL PRTLCD4 DS1307 PAGE 15 0476 20202D20 810 DB ' - - ',0 047A 202D2020 047E 00 047F 7402 811 MOV A,#2 0481 75F000 812 MOV B,#0 0484 D183 813 ACALL PLACECUR4 0486 D16F 814 ACALL PRTLCD4 0488 2A202020 815 DB '* : : *',0 048C 20203A20 0490 203A2020 0494 2020202A 0498 00 0499 7C0C 816 MOV R4,#OFFCUR ; TURN OFF CURSOR 049B B1EE 817 ACALL WRLCDCOM4 049D 22 818 RET 819 049E 820 BEGIN3: 049E 7402 821 MOV A,#2 04A0 75F000 822 MOV B,#0 04A3 D183 823 ACALL PLACECUR4 04A5 D16F 824 ACALL PRTLCD4 04A7 2A202020 825 DB '* : *',0 04AB 20202020 04AF 3A202020 04B3 2020202A 04B7 00 04B8 7C0C 826 MOV R4,#OFFCUR ; TURN OFF CURSOR 04BA B1EE 827 ACALL WRLCDCOM4 04BC 22 828 RET 829 830 ; ********************************************************** 831 ; LOOKUP TABLE USED BY WRITE_BCD. 832 ; ********************************************************** 833 04BD 834 FIND: 04BD 8001 835 SJMP LOOK_UP 04BF 836 ST: 04BF 22 837 RET 04C0 838 LOOK_UP: 04C0 B40008 839 CJNE A,#0000000B,m1 04C3 12066F 840 LCALL PRTLCD4 04C6 3000 841 DB '0',0 04C8 0204BF 842 LJMP ST 04CB 843 m1: 04CB B40108 844 CJNE A,#00000001B,m2 04CE 12066F 845 LCALL PRTLCD4 04D1 3100 846 DB '1',0 04D3 0204BF 847 LJMP ST 04D6 848 m2: 04D6 B40208 849 CJNE A,#00000010B,m3 04D9 12066F 850 LCALL PRTLCD4 04DC 3200 851 DB '2',0 04DE 0204BF 852 LJMP ST 04E1 853 m3: 04E1 B40308 854 CJNE A,#00000011B,m4 04E4 12066F 855 LCALL PRTLCD4 04E7 3300 856 DB '3',0 04E9 0204BF 857 LJMP ST DS1307 PAGE 16 04EC 858 m4: 04EC B40408 859 CJNE A,#00000100B,m5 04EF 12066F 860 LCALL PRTLCD4 04F2 3400 861 DB '4',0 04F4 0204BF 862 LJMP ST 04F7 863 m5: 04F7 B40508 864 CJNE A,#00000101B,m6 04FA 12066F 865 LCALL PRTLCD4 04FD 3500 866 DB '5',0 04FF 0204BF 867 LJMP ST 0502 868 m6: 0502 B40608 869 CJNE A,#00000110B,m7 0505 12066F 870 LCALL PRTLCD4 0508 3600 871 DB '6',0 050A 0204BF 872 LJMP ST 050D 873 m7: 050D B40708 874 CJNE A,#00000111B,m8 0510 12066F 875 LCALL PRTLCD4 0513 3700 876 DB '7',0 0515 0204BF 877 LJMP ST 0518 878 m8: 0518 B40808 879 CJNE A,#00001000B,m9 051B 12066F 880 LCALL PRTLCD4 051E 3800 881 DB '8',0 0520 0204BF 882 LJMP ST 0523 883 m9: 0523 B40908 884 CJNE A,#00001001B,m10 0526 12066F 885 LCALL PRTLCD4 0529 3900 886 DB '9',0 052B 0204BF 887 LJMP ST 052E 888 m10: 052E 0204BF 889 LJMP ST 890 891 ; ********************************************************** 892 ; LOOKUP TABLE FOR DAY 893 ; ********************************************************** 894 0531 895 GET_DAY: 0531 B40108 896 CJNE A,#00000001B,MON 0534 12066F 897 LCALL PRTLCD4 0537 44494D00 898 DB 'DIM',0 053B 22 899 RET 053C 900 MON: 053C B40208 901 CJNE A,#00000010B,TUE 053F 12066F 902 LCALL PRTLCD4 0542 4C554E00 903 DB 'LUN',0 0546 22 904 RET 0547 905 TUE: 0547 B40308 906 CJNE A,#00000011B,WED 054A 12066F 907 LCALL PRTLCD4 054D 4D415200 908 DB 'MAR',0 0551 22 909 RET 0552 910 WED: 0552 B40408 911 CJNE A,#00000100B,THU 0555 12066F 912 LCALL PRTLCD4 0558 4D455200 913 DB 'MER',0 055C 22 914 RET 055D 915 THU: DS1307 PAGE 17 055D B40508 916 CJNE A,#00000101B,FRI 0560 12066F 917 LCALL PRTLCD4 0563 4A455500 918 DB 'JEU',0 0567 22 919 RET 0568 920 FRI: 0568 B40608 921 CJNE A,#00000110B,SAT 056B 12066F 922 LCALL PRTLCD4 056E 56454E00 923 DB 'VEN',0 0572 22 924 RET 0573 925 SAT: 0573 B40708 926 CJNE A,#00000111B,WHAT 0576 12066F 927 LCALL PRTLCD4 0579 53414D00 928 DB 'SAM',0 057D 22 929 RET 057E 930 WHAT: 057E 22 931 RET 932 933 ; ********************************************************** 934 ; SUB SETS THE CLOCK 935 ; ********************************************************** 936 057F 937 SET_CLOCK: 938 057F F11E 939 ACALL SEND_START ; SEND 2-WIRE START CONDITION 0581 74D0 940 MOV A,#DS1307W ; SEND 1307 WRITE COMMAND 0583 F155 941 ACALL SEND_BYTE 0585 7400 942 MOV A,#00H ; SET DATA POINTER TO REGISTER 943 ; 00H ON THE DS1307 0587 F155 944 ACALL SEND_BYTE 0589 7924 945 MOV R1,#24H ; START WITH SECONDS REGISTER 946 ; IN INTERNAL RAM 058B 947 SEND_LOOP: 058B E7 948 MOV A,@R1 ; MOVE FIRST BYTE OF DATA TO ACC 058C F155 949 ACALL SEND_BYTE ; SEND DATA ON 2-WIRE BUT 058E 09 950 INC R1 ; LOOP UNTIL CLOCK DATA SENT 058F B92BF9 951 CJNE R1,#2BH,SEND_LOOP 0592 F13B 952 ACALL SEND_STOP ; SEND 2-WIRE STOP CONDITION 0594 22 953 RET 954 955 ; ********************************************************** 956 ; INITIALIZE THE LCD 4-BIT MODE 957 ; ********************************************************** 958 0595 959 INITLCD4: 0595 C2B3 960 CLR LCD_RS ; LCD REGISTER SELECT LINE 0597 C2B4 961 CLR LCD_RW ; READ / WRITE LINE 0599 C2B5 962 CLR LCD_E ; ENABLE LINE 059B 7C28 963 MOV R4, #CONFIG; FUNCTION SET - DATA BITS, 964 ; LINES, FONTS 059D B1EE 965 ACALL WRLCDCOM4 059F 7C0E 966 MOV R4, #ONDSP ; DISPLAY ON 05A1 B1EE 967 ACALL WRLCDCOM4 05A3 7C06 968 MOV R4, #ENTRYMODE ; SET ENTRY MODE 05A5 B1EE 969 ACALL WRLCDCOM4 ; INCREMENT CURSOR RIGHT, NO SHIFT 05A7 7C01 970 MOV R4, #CLRDSP; CLEAR DISPLAY, HOME CURSOR 05A9 B1EE 971 ACALL WRLCDCOM4 05AB 22 972 RET 973 DS1307 PAGE 18 974 ; ********************************************************** 975 ; SOFTWARE VERSION OF THE POWER ON RESET 976 ; ********************************************************** 977 05AC 978 RESETLCD4: 05AC C2B3 979 CLR LCD_RS ; LCD REGISTER SELECT LINE 05AE C2B4 980 CLR LCD_RW ; READ / WRITE LINE 05B0 C2B5 981 CLR LCD_E ; ENABLE LINE 05B2 C287 982 CLR LCD_DB7 ; SET BIT PATTERN FOR... 05B4 C286 983 CLR LCD_DB6 ; ... POWER-ON-RESET 05B6 D285 984 SETB LCD_DB5 05B8 D284 985 SETB LCD_DB4 05BA D2B5 986 SETB LCD_E ; START ENABLE PULSE 05BC C2B5 987 CLR LCD_E ; END ENABLE PULSE 05BE 7404 988 MOV A, #4 ; DELAY 4 MILLISECONDS 05C0 D1A5 989 ACALL MDELAY 05C2 D2B5 990 SETB LCD_E ; START ENABLE PULSE 05C4 C2B5 991 CLR LCD_E ; END ENABLE PULSE 05C6 7401 992 MOV A, #1 ; DELAY 1 MILLISECOND 05C8 D1A5 993 ACALL MDELAY 05CA D2B5 994 SETB LCD_E ; START ENABLE PULSE 05CC C2B5 995 CLR LCD_E ; END ENABLE PULSE 05CE 7401 996 MOV A, #1 ; DELAY 1 MILLISECOND 05D0 D1A5 997 ACALL MDELAY 05D2 C284 998 CLR LCD_DB4 ; SPECIFY 4-BIT OPERATION 05D4 D2B5 999 SETB LCD_E ; START ENABLE PULSE 05D6 C2B5 1000 CLR LCD_E ; END ENABLE PULSE 05D8 7401 1001 MOV A, #1 ; DELAY 1 MILLISECOND 05DA D1A5 1002 ACALL MDELAY 05DC 7C28 1003 MOV R4, #CONFIG; FUNCTION SET 05DE B1EE 1004 ACALL WRLCDCOM4 05E0 7C08 1005 MOV R4, #08H ; DISPLAY OFF 05E2 B1EE 1006 ACALL WRLCDCOM4 05E4 7C01 1007 MOV R4, #1 ; CLEAR DISPLAY, HOME CURSOR 05E6 B1EE 1008 ACALL WRLCDCOM4 05E8 7C06 1009 MOV R4, #ENTRYMODE ; SET ENTRY MODE 05EA B1EE 1010 ACALL WRLCDCOM4 05EC A195 1011 AJMP INITLCD4 1012 1013 ; ********************************************************** 1014 ; SUB WRITES A COMMAND WORD TO THE LCD 1015 ; COMMAND MUST BE PLACED IN R4 BY CALLING PROGRAM 1016 ; ********************************************************** 1017 05EE 1018 WRLCDCOM4: 05EE C2B5 1019 CLR LCD_E 05F0 C2B3 1020 CLR LCD_RS ; SELECT SEND COMMAND 05F2 C2B4 1021 CLR LCD_RW ; SELECT WRITE OPERATION 05F4 C0E0 1022 PUSH ACC ; SAVE ACCUMULATOR 05F6 EC 1023 MOV A, R4 ; PUT DATA BYTE IN ACC 05F7 A2E4 1024 MOV C, ACC.4 ; LOAD HIGH NIBBLE ON DATA BUS 05F9 9284 1025 MOV LCD_DB4, C ; ONE BIT AT A TIME USING... 05FB A2E5 1026 MOV C, ACC.5 ; BIT MOVE OPERATOINS 05FD 9285 1027 MOV LCD_DB5, C 05FF A2E6 1028 MOV C, ACC.6 0601 9286 1029 MOV LCD_DB6, C 0603 A2E7 1030 MOV C, ACC.7 0605 9287 1031 MOV LCD_DB7, C DS1307 PAGE 19 0607 D2B5 1032 SETB LCD_E ; PULSE THE ENABLE LINE 0609 C2B5 1033 CLR LCD_E 060B A2E0 1034 MOV C, ACC.0 ; SIMILARLY, LOAD LOW NIBBLE 060D 9284 1035 MOV LCD_DB4, C 060F A2E1 1036 MOV C, ACC.1 0611 9285 1037 MOV LCD_DB5, C 0613 A2E2 1038 MOV C, ACC.2 0615 9286 1039 MOV LCD_DB6, C 0617 A2E3 1040 MOV C, ACC.3 0619 9287 1041 MOV LCD_DB7, C 061B D152 1042 ACALL PULSEEWAIT4; PULSE THE ENABLE LINE... 1043 ; AND WAIT FOR BUSY FLAG TO CLEAR 061D D0E0 1044 POP ACC 061F 22 1045 RET 1046 1047 ; ********************************************************** 1048 ; SUB TO WRITE A DATA WORD TO THE LCD 1049 ; DATA MUST BE PLACED IN R4 BY CALLING PROGRAM 1050 ; ********************************************************** 1051 0620 1052 WRLCDDATA: 0620 C2B5 1053 CLR LCD_E 0622 D2B3 1054 SETB LCD_RS ; SELECT SEND DATA 0624 C2B4 1055 CLR LCD_RW ; SELECT WRITE OPERATION 0626 C0E0 1056 PUSH ACC ; SAVE ACCUMULATOR 0628 EC 1057 MOV A, R4 ; PUT DATA BYTE IN ACC 0629 A2E4 1058 MOV C, ACC.4 ; LOAD HIGH NIBBLE ON DATA BUS 062B 9284 1059 MOV LCD_DB4, C ; ONE BIT AT A TIME USING... 062D A2E5 1060 MOV C, ACC.5 ; BIT MOVE OPERATOINS 062F 9285 1061 MOV LCD_DB5, C 0631 A2E6 1062 MOV C, ACC.6 0633 9286 1063 MOV LCD_DB6, C 0635 A2E7 1064 MOV C, ACC.7 0637 9287 1065 MOV LCD_DB7, C 0639 D2B5 1066 SETB LCD_E ; PULSE THE ENABLE LINE 063B C2B5 1067 CLR LCD_E 063D A2E0 1068 MOV C, ACC.0 ; SIMILARLY, LOAD LOW NIBBLE 063F 9284 1069 MOV LCD_DB4, C 0641 A2E1 1070 MOV C, ACC.1 0643 9285 1071 MOV LCD_DB5, C 0645 A2E2 1072 MOV C, ACC.2 0647 9286 1073 MOV LCD_DB6, C 0649 A2E3 1074 MOV C, ACC.3 064B 9287 1075 MOV LCD_DB7, C 064D D152 1076 ACALL PULSEEWAIT4; PULSE THE ENABLE LINE... 1077 ; AND WAIT FOR BUSY FLAG TO CLEAR 064F D0E0 1078 POP ACC 0651 22 1079 RET 1080 1081 ; ********************************************************** 1082 ; GENERATES A POSITIVE PULSE ON THE LCD ENABLE LINE. 1083 ; WAITS FOR THE BUSY FLAG TO CLEAR BEFORE RETURNING. 1084 ; ********************************************************** 1085 0652 1086 PULSEEWAIT4: 0652 C2B5 1087 CLR LCD_E 0654 D2B5 1088 SETB LCD_E ; PULSE THE ENABLE LINE 0656 C2B5 1089 CLR LCD_E DS1307 PAGE 20 0658 7580FF 1090 MOV LCD_DATA, #0FFH ; PREPARE PORT FOR INPUT 065B D2B4 1091 SETB LCD_RW ; PREPARE R/W FOR READ OPERATION 065D C0E0 1092 PUSH ACC ; SAVE ACCUMULATOR CONTENTS 065F 1093 PEW: 065F D2B5 1094 SETB LCD_E ; START THE ENABLE PULSE 0661 E580 1095 MOV A, LCD_DATA; READ STATUS NIBBLE 0663 C2B5 1096 CLR LCD_E ; END ENABLE PULSE 0665 D2B5 1097 SETB LCD_E ; PRETEND READING STATUS LOW NIBBLE 0667 C2B5 1098 CLR LCD_E 0669 20E7F3 1099 JB ACC.7, PEW ; LOOP WHILE BUSY FLAG IS SET 066C D0E0 1100 POP ACC ; RESTORE ACCUMULATOR 066E 22 1101 RET 1102 1103 ; ********************************************************** 1104 ; SUB TAKES THE STRING IMMEDIATELY FOLLOWING THE CALL AND 1105 ; DISPLAYS ON THE LCD. STRING MUST BE TERMINATED WITH A 1106 ; NULL (0). 1107 ; ********************************************************** 1108 066F 1109 PRTLCD4: 066F D083 1110 POP DPH ; POP RETURN ADDRESS INTO DPTR 0671 D082 1111 POP DPL 0673 1112 PRTNEXT: 0673 E4 1113 CLR A ; SET OFFSET = 0 0674 93 1114 MOVC A, @A+DPTR ; GET CHR FROM CODE MEMORY 0675 B40002 1115 CJNE A, #0, CHROK; IF CHR = 0 THEN RETURN 0678 8006 1116 SJMP RETPRTLCD 067A 1117 CHROK: 067A FC 1118 MOV R4, A 067B D120 1119 ACALL WRLCDDATA ; SEND CHARACTER 067D A3 1120 INC DPTR ; POINT AT NEXT CHARACTER 067E C173 1121 AJMP PRTNEXT ; LOOP TILL END OF STRING 0680 1122 RETPRTLCD: 0680 7401 1123 MOV A, #1H ; POINT TO INSTRUCTION AFTER STRING 0682 73 1124 JMP @A+DPTR ; RETURN WITH A JUMP INSTRUCTION 1125 1126 ; ********************************************************** 1127 ; SUB SETS THE CURSOR POSITION. 1128 ; ********************************************************** 1129 0683 1130 PLACECUR4: 0683 15E0 1131 DEC ACC ; ACC=0 FOR LINE=1 0685 7006 1132 JNZ LINE2 ; IF ACC=0 THEN FIRST LINE 0687 E5F0 1133 MOV A, B 0689 2480 1134 ADD A, #080H ; CONSTRUCT CONTROL WORD FOR LINE 1 068B 8004 1135 SJMP SETCUR 068D 1136 LINE2: 068D E5F0 1137 MOV A, B 068F 24C0 1138 ADD A, #0C0H ; CONSTRUCT CONTROL WORD FOR LINE 2 0691 1139 SETCUR: 0691 FC 1140 MOV R4, A ; PLACE CONTROL WORD 0692 B1EE 1141 ACALL WRLCDCOM4 ; ISSUE COMMAND 0694 22 1142 RET 1143 0695 1144 SETCGRAM: 0695 C0F0 1145 PUSH B 0697 75F008 1146 MOV B, #8 069A A4 1147 MUL AB ; multiply character number by 8 DS1307 PAGE 21 069B D0F0 1148 POP B ; b holds row number 069D 25F0 1149 ADD A,B ; a holds CGRAM address 069F 2440 1150 ADD A,#40h ; convert to instruction 06A1 FC 1151 MOV R4,A ; place instruction 06A2 B1EE 1152 ACALL WRLCDCOM4 ; issue command 06A4 22 1153 RET 1154 1155 ;MDELAY: 1156 ; MOV R5,#02DH 1157 ;here1: MOV R4,#0F2H 1158 ;here2: MOV R3,#0FFH 1159 ;here3: DJNZ R3,here3 1160 ; DJNZ R4,here2 1161 ; DJNZ R5,here1 1162 ; RET 1163 1164 ; ********************************************************** 1165 ; 1 MILLISECOND DELAY ROUTINE 1166 ; ********************************************************** 1167 06A5 1168 MDELAY: 06A5 C0E0 1169 PUSH ACC 06A7 74A6 1170 MOV A,#0A6H 06A9 1171 MD_OLP: 06A9 04 1172 INC A 06AA 00 1173 NOP 06AB 00 1174 NOP 06AC 00 1175 NOP 06AD 00 1176 NOP 06AE 00 1177 NOP 06AF 00 1178 NOP 06B0 00 1179 NOP 06B1 00 1180 NOP 06B2 00 1181 NOP 06B3 00 1182 NOP 06B4 00 1183 NOP 06B5 00 1184 NOP 06B6 00 1185 NOP 06B7 00 1186 NOP 06B8 00 1187 NOP 06B9 00 1188 NOP 06BA 00 1189 NOP 06BB 00 1190 NOP 06BC 00 1191 NOP 06BD 00 1192 NOP 06BE 00 1193 NOP 06BF 00 1194 NOP 06C0 00 1195 NOP 06C1 00 1196 NOP 06C2 00 1197 NOP 06C3 00 1198 NOP 06C4 00 1199 NOP 06C5 00 1200 NOP 06C6 00 1201 NOP 06C7 00 1202 NOP 06C8 00 1203 NOP 06C9 00 1204 NOP 06CA 00 1205 NOP DS1307 PAGE 22 06CB 00 1206 NOP 06CC 00 1207 NOP 06CD 00 1208 NOP 06CE 00 1209 NOP 06CF 00 1210 NOP 06D0 00 1211 NOP 06D1 00 1212 NOP 06D2 00 1213 NOP 06D3 00 1214 NOP 06D4 00 1215 NOP 06D5 00 1216 NOP 06D6 00 1217 NOP 06D7 00 1218 NOP 06D8 00 1219 NOP 06D9 00 1220 NOP 06DA 00 1221 NOP 06DB 00 1222 NOP 06DC 00 1223 NOP 06DD 00 1224 NOP 06DE 00 1225 NOP 06DF 00 1226 NOP 06E0 00 1227 NOP 06E1 00 1228 NOP 06E2 00 1229 NOP 06E3 00 1230 NOP 06E4 00 1231 NOP 06E5 00 1232 NOP 06E6 00 1233 NOP 06E7 00 1234 NOP 06E8 00 1235 NOP 06E9 00 1236 NOP 1237 06EA 70BD 1238 JNZ MD_OLP 06EC 00 1239 NOP 06ED D0E0 1240 POP ACC 06EF 22 1241 RET 1242 06F0 1243 BIG_DELAY: 06F0 7B0C 1244 MOV R3,#0CH ; DELAY ROUTINE. 06F2 7AFF 1245 X0B: MOV R2,#0FFH 06F4 7DFF 1246 X1B: MOV R5,#0FFH 06F6 DDFE 1247 X2B: DJNZ R5,X2B 06F8 DAFA 1248 DJNZ R2,X1B 06FA DBF6 1249 DJNZ R3,X0B 06FC 22 1250 RET 1251 1252 ; ********************************************************** 1253 ; THIS SUB READS ONE BYTE OF DATA FROM THE DS1307 1254 ; ********************************************************** 1255 06FD 1256 READ_BYTE: 06FD 752108 1257 MOV BITCNT,#08H; SET COUNTER FOR 8-BITS DATA 0700 7400 1258 MOV A,#00H 0702 D296 1259 SETB SDA ; SET SDA HIGH TO ENSURE LINE 1260 ; FREE 0704 1261 READ_BITS: 1262 +1 SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH 0704 D297 1263 +1 SETB SCL ; SET SCL HIGH DS1307 PAGE 23 0706 3097FD 1264 +1 JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL 0709 A296 1266 MOV C,SDA ; MOVE DATA BIT INTO CARRY 070B 33 1267 RLC A ; ROTATE CARRY-BIT INTO ACC.0 070C C297 1268 CLR SCL ; TRANSITION SCL HIGH-TO-LOW 070E D521F3 1269 DJNZ BITCNT,READ_BITS 1270 ; LOOP FOR 8-BITS 0711 200002 1271 JB LASTREAD,ACKN 1272 ; CHECK TO SEE IF THIS IS 1273 ; THE LAST READ 0714 C296 1274 CLR SDA ; IF NOT LAST READ SEND ACK-BIT 1275 0716 1276 ACKN: 1277 +1 SCL_HIGH ; PULSE SCL TO TRANSMIT ACKNOWLEDGE 0716 D297 1278 +1 SETB SCL ; SET SCL HIGH 0718 3097FD 1279 +1 JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL 071B C297 1281 CLR SCL ; OR NOT ACKNOWLEDGE BIT 071D 22 1282 RET 1283 1284 ; ********************************************************** 1285 ; SUB SENDS START CONDITION 1286 ; ********************************************************** 1287 071E 1288 SEND_START: 071E D207 1289 SETB _2W_BUSY ; INDICATE THAT 2-WIRE 0720 C205 1290 CLR ACK ; OPERATION IS IN PROGRESS 0722 C206 1291 CLR BUS_FLT ; CLEAR STATUS FLAGS 0724 309711 1292 JNB SCL,FAULT 0727 30960E 1293 JNB SDA,FAULT 072A D296 1294 SETB SDA ; BEGIN START CODITION 1295 +1 SCL_HIGH 072C D297 1296 +1 SETB SCL ; SET SCL HIGH 072E 3097FD 1297 +1 JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL 0731 C296 1299 CLR SDA 0733 F147 1300 ACALL DELAY 0735 C297 1301 CLR SCL 0737 22 1302 RET 0738 1303 FAULT: 0738 D206 1304 SETB BUS_FLT 073A 22 1305 RET 1306 1307 ; ********************************************************** 1308 ; SUB SENDS STOP CONDITION 1309 ; ********************************************************** 1310 073B 1311 SEND_STOP: 073B C296 1312 CLR SDA 1313 +1 SCL_HIGH 073D D297 1314 +1 SETB SCL ; SET SCL HIGH 073F 3097FD 1315 +1 JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL 0742 D296 1317 SETB SDA 0744 C207 1318 CLR _2W_BUSY 0746 22 1319 RET 1320 1321 ; ********************************************************** 1322 ; SUB DELAYS THE BUS 1323 ; ********************************************************** 1324 0747 1325 DELAY: DS1307 PAGE 24 0747 00 1326 NOP 0748 00 1327 NOP 0749 00 1328 NOP 074A 00 1329 NOP 074B 00 1330 NOP 074C 00 1331 NOP 074D 00 1332 NOP 074E 00 1333 NOP 074F 00 1334 NOP 0750 00 1335 NOP 0751 00 1336 NOP 0752 00 1337 NOP 0753 00 1338 NOP ; DELAY FOR BUS TIMING 0754 22 1339 RET 1340 1341 ; ********************************************************** 1342 ; THIS SUB SENDS 1 BYTE OF DATA TO THE DS1307 1343 ; CALL THIS FOR EACH REGISTER SECONDS TO YEAR 1344 ; ACC MUST CONTAIN DATA TO BE SENT TO CLOCK 1345 ; ********************************************************** 1346 0755 1347 SEND_BYTE: 0755 752108 1348 MOV BITCNT,#08H; SET COUNTER FOR 8-BITS 0758 1349 SB_LOOP: 0758 30E705 1350 JNB ACC.7,NOTONE; CHECK TO SEE IF BIT-7 OF 075B D296 1351 SETB SDA ; ACC IS A 1, AND SET SDA HIGH 075D 020762 1352 JMP ONE 0760 1353 NOTONE: 0760 C296 1354 CLR SDA ; CLR SDA LOW 0762 1355 ONE: 1356 +1 SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH 0762 D297 1357 +1 SETB SCL ; SET SCL HIGH 0764 3097FD 1358 +1 JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL 0767 23 1360 RL A ; ROTATE ACC LEFT 1-BIT 0768 C297 1361 CLR SCL ; TRANSITION SCL LOW-TO-HIGH 076A D521EB 1362 DJNZ BITCNT,SB_LOOP; LOOP FOR 8-BITS 076D D296 1363 SETB SDA ; SET SDA HIGH TO LOOK FOR 1364 +1 SCL_HIGH ; ACKNOWLEDGE PULSE 076F D297 1365 +1 SETB SCL ; SET SCL HIGH 0771 3097FD 1366 +1 JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL 0774 C205 1368 CLR ACK 0776 309602 1369 JNB SDA,SB_EX ; CHECK FOR ACK OR NOT ACK 0779 D205 1370 SETB ACK ; SET ACKNOWLEDGE FLAG FOR 1371 ; NOT ACK 077B 1372 SB_EX: 077B F147 1373 ACALL DELAY ; DELAY FOR AN OPERATION 077D C297 1374 CLR SCL ; TRANSITION SCL HIGH-TO-LOW 077F F147 1375 ACALL DELAY ; DELAY FOR AN OPERATION 0781 22 1376 RET 1377 1378 ; ********************************************************** 1379 ; SUB READS THE CLOCK AND WRITES IT TO THE SCRATCHPAD MEMORY 1380 ; ON RETURN FROM HERE DATE & TIME DATA WILL BE STORED IN THE 1381 ; DATE & TIME REGISTERS FROM 24H (SECS) TO 2AH (YEAR) 1382 ; ALARM SETTINGS IN REGISTERS 2CH(HRS) AND 2DH(MINUTES). 1383 ; ********************************************************** 1384 0782 1385 READ_CLOCK: DS1307 PAGE 25 1386 0782 7924 1387 MOV R1,#24H ; SECONDS STORAGE LOCATION 0784 752200 1388 MOV BYTECNT,#00H 0787 C200 1389 CLR LASTREAD 0789 F11E 1390 ACALL SEND_START 078B 74D0 1391 MOV A,#DS1307W 078D F155 1392 ACALL SEND_BYTE 078F 7400 1393 MOV A,#00H 0791 F155 1394 ACALL SEND_BYTE 0793 F13B 1395 ACALL SEND_STOP 0795 F11E 1396 ACALL SEND_START 0797 74D1 1397 MOV A,#DS1307R 0799 F155 1398 ACALL SEND_BYTE 1399 079B 1400 READ_LOOP: 079B E522 1401 MOV A,BYTECNT 079D B40902 1402 CJNE A,#09H,NOT_LAST 07A0 D200 1403 SETB LASTREAD 1404 07A2 1405 NOT_LAST: 07A2 D1FD 1406 ACALL READ_BYTE 07A4 F7 1407 MOV @R1,A 07A5 E522 1408 MOV A,BYTECNT 07A7 B40004 1409 CJNE A,#00H,NOT_FIRST 07AA E7 1410 MOV A,@R1 07AB C2E7 1411 CLR ACC.7 ; ENSURE OSC BIT=0 (ENABLED) 07AD F7 1412 MOV @R1,A 07AE 1413 NOT_FIRST: 07AE 09 1414 INC R1 07AF 0522 1415 INC BYTECNT 07B1 E522 1416 MOV A,BYTECNT 07B3 B40AE5 1417 CJNE A,#0AH,READ_LOOP 07B6 F13B 1418 ACALL SEND_STOP 07B8 22 1419 RET 1420 1421 ; ********************************************************** 1422 ; MOST OF THE REAL WORK IS DONE IN THE ADJUST ROUTINE 1423 ; THIS ROUTINE SIMPLY CHECKS TO SEE IF THE NUMBER IS 1424 ; ZERO OR ENDS IN NINE. 1425 ; ********************************************************** 1426 07B9 1427 CHECK_BCD: 07B9 EC 1428 MOV A,R4 ; SAVES THE NUMBER TO R4 07BA C3 1429 CLR C ; CLEARS CARRY BIT 07BB 2467 1430 ADD A,#67H ; CHECKS TO SEE IF EQUAL 99 07BD 4012 1431 JC ZERO ; IF EQUAL THEN BECOMES 0 07BF EC 1432 MOV A,R4 ; GETS ORIGINAL NUMBER 07C0 540F 1433 ANL A,#0FH ; GETS RID OF UPPER 4 BITS 07C2 C3 1434 CLR C ; CLEARS CARRY BIT 07C3 24F7 1435 ADD A,#0F7H ; CHECKS TO SEE IF NUMBER ENDS IN 9 07C5 4003 1436 JC ADJUST ; IF LARGER ADJUST IT 07C7 EC 1437 MOV A,R4 ; GET ORIGINAL NUMBER 07C8 04 1438 INC A ; ITS UNDER 9 AND NOT 0 SO INCREASE 07C9 22 1439 RET ; BY 1 AND GO BACK. 1440 1441 ; ********************************************************** 1442 ; BCD CONVERSION ROUTINE. 1443 ; ********************************************************** DS1307 PAGE 26 07CA 1444 ADJUST: 07CA EC 1445 MOV A,R4 ; GET ORIGINAL NUMBER 07CB C4 1446 SWAP A ; CHANGE UPPER BITS TO LOWER BITS 07CC 540F 1447 ANL A,#0FH ; GET RID OF WHAT WAS LOWER BITS 07CE 04 1448 INC A ; INCREASE BY ONE 07CF C4 1449 SWAP A ; SWITCH THE UPPER AND LOWER BITS BACK 07D0 22 1450 RET ; GO BACK WITH NEW NUMBER 1451 07D1 1452 ZERO: ; IF NUMBER IS ZERO SEND BACK A ZERO 07D1 7400 1453 MOV A,#00000000B 07D3 22 1454 RET 1455 1456 ; ********************************************************** 1457 ; THIS ROUTINE CHECKS TO SEE IF THE LOWER 4 BITS ARE 1458 ; EQUAL TO ZERO. IF THEY ARE THEN A STRAIGHT DECREASE 1459 ; CAN BE DONE. IF NOT THEN CONVERT. 1460 ; ********************************************************** 1461 07D4 1462 CHECK_BCD_DOWN: 07D4 EC 1463 MOV A,R4 ; SAVE ORIGINAL NUMBER 07D5 540F 1464 ANL A,#0FH ; GET RID OF UPPER FOUR BITS 07D7 B40004 1465 CJNE A,#00000000B,GO_ON_BACK ;DO LOWER BITS =0 ? 07DA EC 1466 MOV A,R4 ; GET ORIGINAL NUMBER 07DB 9406 1467 SUBB A,#06H ; CONVERT IT TO A BINARY NUMBER 07DD 22 1468 RET 1469 1470 ; ********************************************************** 1471 ; IF THE NUMBER ENDS IN NUMBER LESS THAN 9 THEN 1472 ; GO BACK AND, DO A NORMAL DECREMENT. 1473 ; ********************************************************** 1474 07DE 1475 GO_ON_BACK: 07DE EC 1476 MOV A,R4 ; GET ORIGINAL NUMBER 07DF 22 1477 RET ; GO BACK 1478 1479 ; ********************************************************** 1480 ; END OF PROGRAM 1481 ; ********************************************************** 1482 END 1483 1484 VERSION 1.2k ASSEMBLY COMPLETE, 0 ERRORS FOUND DS1307 PAGE 27 ACC. . . . . . . . . . . . . . . D ADDR 00E0H PREDEFINED ACK. . . . . . . . . . . . . . . B ADDR 0005H ACKN . . . . . . . . . . . . . . C ADDR 0716H ADJUST . . . . . . . . . . . . . C ADDR 07CAH ALARMS . . . . . . . . . . . . . C ADDR 02D0H ALARM_CONTROL. . . . . . . . . . C ADDR 0457H ALARM_SET. . . . . . . . . . . . B ADDR 0093H ALM_A. . . . . . . . . . . . . . C ADDR 037BH ALM_CNTRL. . . . . . . . . . . . D ADDR 002EH ALM_HOUR . . . . . . . . . . . . D ADDR 002CH ALM_MIN. . . . . . . . . . . . . D ADDR 002DH ALM_STORE. . . . . . . . . . . . NUMB 0008H B. . . . . . . . . . . . . . . . D ADDR 00F0H PREDEFINED BEGIN. . . . . . . . . . . . . . C ADDR 0469H BEGIN3 . . . . . . . . . . . . . C ADDR 049EH BIG_DELAY. . . . . . . . . . . . C ADDR 06F0H BITCNT . . . . . . . . . . . . . D ADDR 0021H BLINKCUR . . . . . . . . . . . . NUMB 000DH NOT USED BUS_FLT. . . . . . . . . . . . . B ADDR 0006H BYTECNT. . . . . . . . . . . . . D ADDR 0022H CHECK_ALARM_TIME . . . . . . . . C ADDR 0365H CHECK_BCD. . . . . . . . . . . . C ADDR 07B9H CHECK_BCD_DOWN . . . . . . . . . C ADDR 07D4H CHROK. . . . . . . . . . . . . . C ADDR 067AH CLRDSP . . . . . . . . . . . . . NUMB 0001H CONFIG . . . . . . . . . . . . . NUMB 0028H CONTROL. . . . . . . . . . . . . D ADDR 002BH NOT USED DATE . . . . . . . . . . . . . . D ADDR 0028H DAY. . . . . . . . . . . . . . . D ADDR 0027H DELAY. . . . . . . . . . . . . . C ADDR 0747H DOWN_BTTN. . . . . . . . . . . . B ADDR 0091H DOWN_DATE. . . . . . . . . . . . C ADDR 019DH DOWN_DAY . . . . . . . . . . . . C ADDR 00EEH DOWN_HOUR. . . . . . . . . . . . C ADDR 024CH DOWN_HOUR1 . . . . . . . . . . . C ADDR 03B3H DOWN_MIN . . . . . . . . . . . . C ADDR 02A5H DOWN_MIN1. . . . . . . . . . . . C ADDR 040CH DOWN_MONTH . . . . . . . . . . . C ADDR 0144H DOWN_YEAR. . . . . . . . . . . . C ADDR 01F4H DPH. . . . . . . . . . . . . . . D ADDR 0083H PREDEFINED DPL. . . . . . . . . . . . . . . D ADDR 0082H PREDEFINED DS1307R. . . . . . . . . . . . . NUMB 00D1H DS1307W. . . . . . . . . . . . . NUMB 00D0H ENTER. . . . . . . . . . . . . . B ADDR 0092H ENTER_DATE . . . . . . . . . . . C ADDR 01AEH ENTER_DAY. . . . . . . . . . . . C ADDR 00FCH ENTER_HOUR . . . . . . . . . . . C ADDR 025DH ENTER_HOUR1. . . . . . . . . . . C ADDR 03C4H ENTER_MIN. . . . . . . . . . . . C ADDR 02B6H ENTER_MIN1 . . . . . . . . . . . C ADDR 041DH ENTER_MONTH. . . . . . . . . . . C ADDR 0155H ENTER_YEAR . . . . . . . . . . . C ADDR 0202H ENTRYMODE. . . . . . . . . . . . NUMB 0006H FAULT. . . . . . . . . . . . . . C ADDR 0738H FIND . . . . . . . . . . . . . . C ADDR 04BDH FLAGS. . . . . . . . . . . . . . D ADDR 0020H FRI. . . . . . . . . . . . . . . C ADDR 0568H GET_DAY. . . . . . . . . . . . . C ADDR 0531H DS1307 PAGE 28 GET_TIME . . . . . . . . . . . . C ADDR 0053H GO_ON_BACK . . . . . . . . . . . C ADDR 07DEH HRS. . . . . . . . . . . . . . . D ADDR 0026H IE . . . . . . . . . . . . . . . D ADDR 00A8H PREDEFINED INITLCD4 . . . . . . . . . . . . C ADDR 0595H INIT_YEAR. . . . . . . . . . . . C ADDR 0005H LASTREAD . . . . . . . . . . . . B ADDR 0000H LCD_DATA . . . . . . . . . . . . NUMB 0080H LCD_DB4. . . . . . . . . . . . . NUMB 0084H LCD_DB5. . . . . . . . . . . . . NUMB 0085H LCD_DB6. . . . . . . . . . . . . NUMB 0086H LCD_DB7. . . . . . . . . . . . . NUMB 0087H LCD_E. . . . . . . . . . . . . . NUMB 00B5H LCD_RS . . . . . . . . . . . . . NUMB 00B3H LCD_RW . . . . . . . . . . . . . NUMB 00B4H LINE2. . . . . . . . . . . . . . C ADDR 068DH LOOK_UP. . . . . . . . . . . . . C ADDR 04C0H M1 . . . . . . . . . . . . . . . C ADDR 04CBH M10. . . . . . . . . . . . . . . C ADDR 052EH M2 . . . . . . . . . . . . . . . C ADDR 04D6H M3 . . . . . . . . . . . . . . . C ADDR 04E1H M4 . . . . . . . . . . . . . . . C ADDR 04ECH M5 . . . . . . . . . . . . . . . C ADDR 04F7H M6 . . . . . . . . . . . . . . . C ADDR 0502H M7 . . . . . . . . . . . . . . . C ADDR 050DH M8 . . . . . . . . . . . . . . . C ADDR 0518H M9 . . . . . . . . . . . . . . . C ADDR 0523H MDELAY . . . . . . . . . . . . . C ADDR 06A5H MD_OLP . . . . . . . . . . . . . C ADDR 06A9H MINS . . . . . . . . . . . . . . D ADDR 0025H MON. . . . . . . . . . . . . . . C ADDR 053CH MONTH. . . . . . . . . . . . . . D ADDR 0029H NOTONE . . . . . . . . . . . . . C ADDR 0760H NOT_FIRST. . . . . . . . . . . . C ADDR 07AEH NOT_LAST . . . . . . . . . . . . C ADDR 07A2H OFF. . . . . . . . . . . . . . . C ADDR 0375H OFFCUR . . . . . . . . . . . . . NUMB 000CH OK_DATE. . . . . . . . . . . . . C ADDR 0189H OK_DAY . . . . . . . . . . . . . C ADDR 00DCH OK_HOUR. . . . . . . . . . . . . C ADDR 0238H OK_HOUR1 . . . . . . . . . . . . C ADDR 039FH OK_MIN . . . . . . . . . . . . . C ADDR 0291H OK_MIN1. . . . . . . . . . . . . C ADDR 03F8H OK_MONTH . . . . . . . . . . . . C ADDR 0130H OK_YEAR. . . . . . . . . . . . . C ADDR 01E2H ONDSP. . . . . . . . . . . . . . NUMB 000EH ONE. . . . . . . . . . . . . . . C ADDR 0762H OSC_CONTROL. . . . . . . . . . . C ADDR 0025H NOT USED OSC_SET. . . . . . . . . . . . . C ADDR 003DH NOT USED P1 . . . . . . . . . . . . . . . D ADDR 0090H PREDEFINED PEW. . . . . . . . . . . . . . . C ADDR 065FH PLACECUR4. . . . . . . . . . . . C ADDR 0683H PRTLCD4. . . . . . . . . . . . . C ADDR 066FH PRTNEXT. . . . . . . . . . . . . C ADDR 0673H PULSEEWAIT4. . . . . . . . . . . C ADDR 0652H READ_BITS. . . . . . . . . . . . C ADDR 0704H READ_BYTE. . . . . . . . . . . . C ADDR 06FDH READ_CLOCK . . . . . . . . . . . C ADDR 0782H DS1307 PAGE 29 READ_LOOP. . . . . . . . . . . . C ADDR 079BH REDO_DATE. . . . . . . . . . . . C ADDR 017DH REDO_DATE_DOWN . . . . . . . . . C ADDR 0183H REDO_DAY . . . . . . . . . . . . C ADDR 00D0H REDO_DAY_DOWN. . . . . . . . . . C ADDR 00D6H REDO_HOUR. . . . . . . . . . . . C ADDR 022CH REDO_HOUR1 . . . . . . . . . . . C ADDR 0393H REDO_HOUR_DOWN . . . . . . . . . C ADDR 0232H REDO_HOUR_DOWN1. . . . . . . . . C ADDR 0399H REDO_MIN . . . . . . . . . . . . C ADDR 0285H REDO_MIN1. . . . . . . . . . . . C ADDR 03ECH REDO_MIN_DOWN. . . . . . . . . . C ADDR 028BH REDO_MIN_DOWN1 . . . . . . . . . C ADDR 03F2H REDO_MONTH . . . . . . . . . . . C ADDR 0124H REDO_MONTH_DOWN. . . . . . . . . C ADDR 012AH REDO_YEAR. . . . . . . . . . . . C ADDR 01D6H REDO_YEAR_DOWN . . . . . . . . . C ADDR 01DCH RESETLCD4. . . . . . . . . . . . C ADDR 05ACH RETPRTLCD. . . . . . . . . . . . C ADDR 0680H SAT. . . . . . . . . . . . . . . C ADDR 0573H SB_EX. . . . . . . . . . . . . . C ADDR 077BH SB_LOOP. . . . . . . . . . . . . C ADDR 0758H SCL. . . . . . . . . . . . . . . B ADDR 0097H SDA. . . . . . . . . . . . . . . B ADDR 0096H SECS . . . . . . . . . . . . . . D ADDR 0024H SEND_BYTE. . . . . . . . . . . . C ADDR 0755H SEND_LOOP. . . . . . . . . . . . C ADDR 058BH SEND_LOOP2 . . . . . . . . . . . C ADDR 043BH NOT USED SEND_START . . . . . . . . . . . C ADDR 071EH SEND_STOP. . . . . . . . . . . . C ADDR 073BH SETCGRAM . . . . . . . . . . . . C ADDR 0695H NOT USED SETCUR . . . . . . . . . . . . . C ADDR 0691H SET_ALARMS . . . . . . . . . . . C ADDR 00ACH SET_CLOCK. . . . . . . . . . . . C ADDR 057FH SET_DATE . . . . . . . . . . . . C ADDR 015AH NOT USED SET_DAY. . . . . . . . . . . . . C ADDR 00B8H NOT USED SET_HOUR . . . . . . . . . . . . C ADDR 0207H NOT USED SET_MIN. . . . . . . . . . . . . C ADDR 0262H NOT USED SET_MIN1 . . . . . . . . . . . . C ADDR 03C9H NOT USED SET_MONTH. . . . . . . . . . . . C ADDR 0101H NOT USED SET_SECONDS. . . . . . . . . . . C ADDR 02BBH NOT USED SET_SECONDS1 . . . . . . . . . . C ADDR 0422H NOT USED SET_TIME . . . . . . . . . . . . C ADDR 00B3H SET_YEAR . . . . . . . . . . . . C ADDR 01B3H NOT USED SP . . . . . . . . . . . . . . . D ADDR 0081H PREDEFINED ST . . . . . . . . . . . . . . . C ADDR 04BFH START. . . . . . . . . . . . . . C ADDR 000DH STORE_ALARMS . . . . . . . . . . C ADDR 042FH NOT USED THU. . . . . . . . . . . . . . . C ADDR 055DH TUE. . . . . . . . . . . . . . . C ADDR 0547H UPDATE . . . . . . . . . . . . . C ADDR 02F4H UPDATE2. . . . . . . . . . . . . C ADDR 0320H NOT USED UPDATE3. . . . . . . . . . . . . C ADDR 0348H UP_BTTN. . . . . . . . . . . . . B ADDR 0090H UP_DATE. . . . . . . . . . . . . C ADDR 018DH UP_DAY . . . . . . . . . . . . . C ADDR 00E0H UP_HOUR. . . . . . . . . . . . . C ADDR 023CH UP_HOUR1 . . . . . . . . . . . . C ADDR 03A3H DS1307 PAGE 30 UP_MIN . . . . . . . . . . . . . C ADDR 0295H UP_MIN1. . . . . . . . . . . . . C ADDR 03FCH UP_MONTH . . . . . . . . . . . . C ADDR 0134H UP_YEAR. . . . . . . . . . . . . C ADDR 01E6H WAIT_DATE. . . . . . . . . . . . C ADDR 0170H WAIT_DAY . . . . . . . . . . . . C ADDR 00C3H WAIT_HOUR. . . . . . . . . . . . C ADDR 021FH WAIT_HOUR1 . . . . . . . . . . . C ADDR 0386H WAIT_MIN . . . . . . . . . . . . C ADDR 0278H WAIT_MIN1. . . . . . . . . . . . C ADDR 03DFH WAIT_MONTH . . . . . . . . . . . C ADDR 0117H WAIT_YEAR. . . . . . . . . . . . C ADDR 01C9H WED. . . . . . . . . . . . . . . C ADDR 0552H WHAT . . . . . . . . . . . . . . C ADDR 057EH WRITE_BCD. . . . . . . . . . . . C ADDR 0449H WRLCDCOM4. . . . . . . . . . . . C ADDR 05EEH WRLCDDATA. . . . . . . . . . . . C ADDR 0620H X0B. . . . . . . . . . . . . . . C ADDR 06F2H X1B. . . . . . . . . . . . . . . C ADDR 06F4H X2B. . . . . . . . . . . . . . . C ADDR 06F6H YEAR . . . . . . . . . . . . . . D ADDR 002AH ZERO . . . . . . . . . . . . . . C ADDR 07D1H _2W_BUSY . . . . . . . . . . . . B ADDR 0007H