📄 i2c.lst
字号:
249
250
251
252
002A 253 MOVX_A_DPTR:
002A 254 RE_READ:
255 ;测试地址是否小于 0x8000
002A C0D0 256 PUSH PSW
A51 MACRO ASSEMBLER I2C 12/18/2007 11:18:07 PAGE 5
002C E583 257 MOV A, DPH
002E 20E704 258 JB ACC.7, RE_IS_EPROM
0031 E0 259 MOVX A,@DPTR
0032 D0D0 260 POP PSW
0034 22 261 RET
262
0035 263 RE_IS_EPROM:
0035 C200 F 264 CLR enable_task_switch ;disable task switch
0037 C0F0 265 PUSH B
266 ;@@ JB epm_err, RE_RETURN
267
0039 300009 F 268 JNB is_writing,RE_CHECK_READING;if(!is_writing) goto check_reading
003C C200 F 269 CLR is_writing ;is_reading = is_writing = 0;
003E C200 F 270 CLR is_reading
0040 120000 F 271 LCALL SendStopCondition ;Send Stop condition
0043 8014 272 SJMP RE_BEGIN_READ ; goto begin_read
0045 273 RE_CHECK_READING:
0045 300011 F 274 JNB is_reading, RE_BEGIN_READ
275 CompareAddress RE_NOT_EQUAL,RE_READ_A_BYTE
0054 281 RE_NOT_EQUAL:
0054 120000 F 282 LCALL SendStopCondition
0057 C200 F 283 CLR is_reading
0059 284 RE_BEGIN_READ:
0059 D200 F 285 SETB EPM_WP;//置位写保护
005B 120000 F 286 LCALL WriteControlCode ;#0A0H,RE_RETURN
005E 200018 F 287 JB epm_err, RE_RETURN ;如果EPROM错误,则退出
288
0061 120000 F 289 LCALL SendStopCondition
0064 120000 F 290 LCALL SendStartcondition
0067 74A1 291 MOV A, #0A1h; //read
0069 120000 F 292 LCALL WriteByte;
006C 293 RE_READ_A_BYTE:
294 ;addr++
295 IncrementAddress RE_DO_READ
0074 300 RE_DO_READ:
0074 120000 F 301 LCALL ReadByte
0077 D200 F 302 SETB is_reading
0079 303 RE_RETURN:
0079 D0F0 304 POP B
007B D0D0 305 POP PSW
007D 300003 F 306 JNB epm_err, RE_END
0080 75E0FF 307 MOV ACC,#0FFH ;ff is the address code in rom, this will be safer when no RAM a
vailable.
0083 308 RE_END:
0083 D200 F 309 SETB enable_task_switch ;enable task switch
0085 22 310 ret;
311
312
313
314
0086 315 MOVX_DPTR_A:
0086 316 WE_WRITE:
0086 C0D0 317 PUSH PSW
0088 C0E0 318 PUSH ACC
008A E583 319 MOV A, DPH
008C 20E706 320 JB ACC.7, WE_IS_EPROM
008F D0E0 321 POP ACC
0091 F0 322 MOVX @DPTR,A
0092 D0D0 323 POP PSW
0094 22 324 RET
325
0095 326 WE_IS_EPROM:
0095 C200 F 327 CLR EPM_WP;//清除写保护。
0097 C200 F 328 CLR enable_task_switch ;disable task switch
329
0099 D0E0 330 POP ACC ;pushed when testing DPH
A51 MACRO ASSEMBLER I2C 12/18/2007 11:18:07 PAGE 6
009B C0F0 331 PUSH B
009D C0E0 332 PUSH ACC
333
334 ;JNB EPM_WP, WE_WP_CHECKED; write protect active low
335 ;SETB epm_err
336 ;SJMP WE_RETURN
009F 337 WE_WP_CHECKED:
009F 300007 F 338 JNB is_reading, WE_CHECK_WRITE; 如果没有读,检查写
00A2 C200 F 339 CLR is_reading ; 清除读写标志
00A4 C200 F 340 CLR is_writing
00A6 120000 F 341 LCALL SendStopCondition; ;发送起始条件
00A9 342 WE_CHECK_WRITE:
00A9 300011 F 343 JNB is_writing, WE_BEGIN_WRITE ;如果没有写,则开始发送起始命令和地址
344 CompareAddress NOT_EQUAL, WE_WRITE_A_BYTE; 正在写,检查地址
00B8 350 NOT_EQUAL:
00B8 120000 F 351 LCALL SendStopCondition
00BB C200 F 352 CLR is_writing
00BD 353 WE_BEGIN_WRITE:
00BD 120000 F 354 LCALL WriteControlCode ;#0A0H, WE_RETURN
00C0 20001E F 355 JB epm_err, WE_RETURN
00C3 D200 F 356 SETB is_writing
00C5 357 WE_WRITE_A_BYTE:
00C5 D0E0 358 POP ACC ;load ACC
00C7 C0E0 359 PUSH ACC
00C9 120000 F 360 LCALL WriteByte
361 ;addr++
362 IncrementAddress WE_CHECK_BOUNDARY;
00D4 367 WE_CHECK_BOUNDARY:
00D4 E500 F 368 MOV A,addr_low ;now check page boundary
00D6 541F 369 ANL A,#(PAGE_SIZE-1)
00D8 7007 370 JNZ WE_RETURN
00DA 120000 F 371 LCALL SendStopCondition
00DD C200 F 372 CLR is_writing
00DF C200 F 373 CLR is_reading ;for confirmation.
374
00E1 375 WE_RETURN:
00E1 D0E0 376 POP ACC
00E3 D0F0 377 POP B
00E5 D0D0 378 POP PSW
00E7 D200 F 379 SETB enable_task_switch ;enable task switch
00E9 22 380 RET
381
382
00EA 383 SendStopCondition:
00EA C200 F 384 CLR EPM_SCL
00EC C200 F 385 CLR EPM_SDA
00EE D200 F 386 SETB EPM_SCL
00F0 00 387 NOP
00F1 D200 F 388 SETB EPM_SDA
00F3 22 389 ret
390
00F4 391 SendStartCondition:
00F4 D200 F 392 SETB EPM_SDA
00F6 D200 F 393 SETB EPM_SCL
00F8 C200 F 394 CLR EPM_SDA
00FA 00 395 NOP
00FB C200 F 396 CLR EPM_SCL
00FD 22 397 ret
398
399
400
401
402
403
404
405
A51 MACRO ASSEMBLER I2C 12/18/2007 11:18:07 PAGE 7
406
407
00FE 408 WriteByte:
00FE 75F008 409 MOV B,#8
0101 33 410 RLC A
0102 411 wb_again:
0102 9200 F 412 MOV EPM_SDA ,C ;EPM_SDA=a_byte & 0x80;
0104 D200 F 413 SETB EPM_SCL ;EPM_SLK=1;
0106 33 414 RLC A ;a_byte <<= 1; also a short delay
0107 00 415 NOP ;inverted to speed down to 400K
0108 C200 F 416 CLR EPM_SCL ;EPM_SLK=0;
010A D5F0F5 417 DJNZ B, wb_again
418
419
010D D200 F 420 SETB EPM_SDA ;EPM_SDA = 1;
421 ;for debug only
422 ;debug: CLR epm_err
010F D200 F 423 SETB EPM_SCL ;EPM_SLK= 1;
0111 A200 F 424 MOV C, EPM_SDA;epm_err = EPM_SDA; //store ack in epm_err
0113 9200 F 425 MOV epm_err, C
0115 C200 F 426 CLR EPM_SCL ;EPM_SLK = 0; //ready for next byte.
0117 22 427 ret
428
429
430
431
432
433
0118 434 ReadByte:
435
0118 300009 F 436 JNB is_reading, RB_LOOP_START;
437 ;write the ack byte
011B C200 F 438 CLR EPM_SDA ; EPM_SDA=0;
011D D200 F 439 SETB EPM_SCL ; EPM_SLK=1;
011F 00 440 NOP
0120 00 441 NOP
0121 00 442 NOP
0122 C200 F 443 CLR EPM_SCL ; EPM_SLK=0;
0124 444 rb_loop_start:
0124 75F008 445 MOV B, #8
0127 D200 F 446 SETB EPM_SDA ;EPM_SDA=1;
0129 447 rb_again:
0129 D200 F 448 SETB EPM_SCL ;EPM_SLK=1;
012B A200 F 449 MOV C, EPM_SDA;
012D 33 450 RLC A ;epm_result <<= 1;epm_result|=EPM_SDA;
012E C200 F 451 CLR EPM_SCL ;EPM_SLK=0;
0130 D5F0F6 452 DJNZ B,rb_again;
0133 22 453 ret
454
455
456 END
A51 MACRO ASSEMBLER I2C 12/18/2007 11:18:07 PAGE 8
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
ACC . . . . . . . . . D ADDR 00E0H A
ADDR_HIGH . . . . . . D ADDR 0001H R SEG=EPM_DATA
ADDR_LOW. . . . . . . D ADDR 0000H R SEG=EPM_DATA
B . . . . . . . . . . D ADDR 00F0H A
DPH . . . . . . . . . D ADDR 0083H A
DPL . . . . . . . . . D ADDR 0082H A
ENABLE_TASK_SWITCH. . B ADDR ----- EXT
EPM_BITS. . . . . . . B SEG 0003H REL=UNIT
EPM_DATA. . . . . . . D SEG 0002H REL=UNIT
EPM_ERR . . . . . . . B ADDR 0000H.2 R SEG=EPM_BITS
EPM_SCL . . . . . . . B ADDR ----- EXT
EPM_SDA . . . . . . . B ADDR ----- EXT
EPM_WP. . . . . . . . B ADDR ----- EXT
EPM_WR_CODE_SEG . . . C SEG 0134H REL=UNIT
IS_READING. . . . . . B ADDR 0000H.0 R SEG=EPM_BITS
IS_WRITING. . . . . . B ADDR 0000H.1 R SEG=EPM_BITS
MOVX_A_DPTR . . . . . C ADDR 002AH R SEG=EPM_WR_CODE_SEG
MOVX_DPTR_A . . . . . C ADDR 0086H R SEG=EPM_WR_CODE_SEG
NOT_EQUAL . . . . . . C ADDR 00B8H R SEG=EPM_WR_CODE_SEG
PAGE_SIZE . . . . . . N NUMB 0020H A
PSW . . . . . . . . . D ADDR 00D0H A
RB_AGAIN. . . . . . . C ADDR 0129H R SEG=EPM_WR_CODE_SEG
RB_LOOP_START . . . . C ADDR 0124H R SEG=EPM_WR_CODE_SEG
READBYTE. . . . . . . C ADDR 0118H R SEG=EPM_WR_CODE_SEG
RE_BEGIN_READ . . . . C ADDR 0059H R SEG=EPM_WR_CODE_SEG
RE_CHECK_READING. . . C ADDR 0045H R SEG=EPM_WR_CODE_SEG
RE_DO_READ. . . . . . C ADDR 0074H R SEG=EPM_WR_CODE_SEG
RE_END. . . . . . . . C ADDR 0083H R SEG=EPM_WR_CODE_SEG
RE_IS_EPROM . . . . . C ADDR 0035H R SEG=EPM_WR_CODE_SEG
RE_NOT_EQUAL. . . . . C ADDR 0054H R SEG=EPM_WR_CODE_SEG
RE_READ . . . . . . . C ADDR 002AH R SEG=EPM_WR_CODE_SEG
RE_READ_A_BYTE. . . . C ADDR 006CH R SEG=EPM_WR_CODE_SEG
RE_RETURN . . . . . . C ADDR 0079H R SEG=EPM_WR_CODE_SEG
SENDSTARTCONDITION. . C ADDR 00F4H R SEG=EPM_WR_CODE_SEG
SENDSTOPCONDITION . . C ADDR 00EAH R SEG=EPM_WR_CODE_SEG
WAIT_WRITE_COUNT. . . N NUMB 00FAH A
WB_AGAIN. . . . . . . C ADDR 0102H R SEG=EPM_WR_CODE_SEG
WCC_RET . . . . . . . C ADDR 0029H R SEG=EPM_WR_CODE_SEG
WE_BEGIN_WRITE. . . . C ADDR 00BDH R SEG=EPM_WR_CODE_SEG
WE_CHECK_BOUNDARY . . C ADDR 00D4H R SEG=EPM_WR_CODE_SEG
WE_CHECK_WRITE. . . . C ADDR 00A9H R SEG=EPM_WR_CODE_SEG
WE_IS_EPROM . . . . . C ADDR 0095H R SEG=EPM_WR_CODE_SEG
WE_NEXT_CONTROL_CODE. C ADDR 001BH R SEG=EPM_WR_CODE_SEG
WE_RETURN . . . . . . C ADDR 00E1H R SEG=EPM_WR_CODE_SEG
WE_WP_CHECKED . . . . C ADDR 009FH R SEG=EPM_WR_CODE_SEG
WE_WRITE. . . . . . . C ADDR 0086H R SEG=EPM_WR_CODE_SEG
WE_WRITE_A_BYTE . . . C ADDR 00C5H R SEG=EPM_WR_CODE_SEG
WE_WRITE_CONTROL_CODE C ADDR 0009H R SEG=EPM_WR_CODE_SEG
WRITEBYTE . . . . . . C ADDR 00FEH R SEG=EPM_WR_CODE_SEG
WRITECONTROLCODE. . . C ADDR 0000H R SEG=EPM_WR_CODE_SEG
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -