⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.lst

📁 51开发板的源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
                     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 + -