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