📄 i2c.sdi
字号:
,,,ACK BIT 10H ;应答标志位
,,,SLA DATA 50H ;器件地址字
,,,SUBA DATA 51H ;器件子地址
,,,NUMBYTE DATA 52H ;读/写字节数
000B,,,SDA BIT P1.5
000B,,,SCL BIT P1.4 ;I2C总线定义
,,,MTD EQU 30H ;发送数据缓存区首地址(30H-3FH)
,,,MRD EQU 40H ;接收数据缓存区首地址(40H-4FH)
0000,21 80,, AJMP MAIN
,,, ORG 80H
,,,;*********************************************************************
,,,;名称:IWRNBYTE
,,,;描述:向器件指定子地址写N个数据
,,,;入口参数:器件地址字SLA,子地址SUBA,发送数据缓冲区MTD,发送字节数NUMBYTE
,,,;*********************************************************************
0080,,IWRNBYTE,IWRNBYTE:
0080,AB 52,, MOV R3,NUMBYTE
0082,12 00 E7,, LCALL START ;启动总线
0085,E5 50,, MOV A,SLA
0087,12 01 43,, LCALL WRBYTE ;发送器件地址字
008A,12 01 2E,, LCALL CACK
008D,30 10 17,, JNB ACK,RETWRN ;无应答则退出
0090,E5 51,, MOV A,SUBA ;指定子地址
0092,12 01 43,, LCALL WRBYTE
0095,12 01 2E,, LCALL CACK
0098,79 30,, MOV R1,#MTD
009A,E7,WRDA,WRDA: MOV A,@R1
009B,12 01 43,, LCALL WRBYTE ;开始写入数据
009E,12 01 2E,, LCALL CACK
00A1,30 10 DC,, JNB ACK,IWRNBYTE
00A4,09,, INC R1
00A5,DB F3,, DJNZ R3,WRDA ;判断是否写完
00A7,12 00 FB,RETWRN,RETWRN: LCALL STOP
00AA,22,, RET
,,,;*********************************************************************
,,,;名称:IRDNBYTE
,,,;描述:从器件指定子地址读取N个数据
,,,;入口参数:器件地址字SLA,子地址SUBA,接收数据缓存区MRD,接收字节数NUMBYTE
,,,;*********************************************************************
00AB,,IRDNBYTE,IRDNBYTE:
00AB,AB 52,, MOV R3,NUMBYTE
00AD,12 00 E7,, LCALL START
00B0,E5 50,, MOV A,SLA
00B2,12 01 43,, LCALL WRBYTE ;发送器件地址字
00B5,12 01 2E,, LCALL CACK
00B8,30 10 22,, JNB ACK,RETRDN
00BB,E5 51,, MOV A,SUBA ;指定子地址
00BD,12 01 43,, LCALL WRBYTE
00C0,12 01 2E,, LCALL CACK
00C3,12 00 E7,, LCALL START ;重新启动总线
00C6,E5 50,, MOV A,SLA
00C8,04,, INC A ;准备进行读操作
00C9,12 01 43,, LCALL WRBYTE
00CC,12 01 2E,, LCALL CACK
00CF,30 10 D9,, JNB ACK,IRDNBYTE
00D2,79 40,, MOV R1,#MRD
00D4,12 01 6A,RON1,RON1: LCALL RDBYTE ;读操作开始
00D7,F7,, MOV @R1,A
00D8,DB 07,, DJNZ R3,SACK
00DA,12 01 1E,, LCALL MNACK ;最后一字节发非应答位
00DD,12 00 FB,RETRDN,RETRDN: LCALL STOP
00E0,22,, RET
00E1,12 01 0E,SACK,SACK: LCALL MACK
00E4,09,, INC R1
00E5,80 ED,, SJMP RON1
,,,;*********************************************************************
,,,;名称:STRRT
,,,;描述:启动I2C总线子程序—发送I2C总线起始条件
,,,;*********************************************************************
00E7,D2 95,START,START: SETB SDA ;发送起始条件数据信号
00E9,00,, NOP ;起始条件建立时间大于4.7us
00EA,D2 94,, SETB SCL ;发送起始条件的时钟信号
00EC,00,, NOP
00ED,00,, NOP
00EE,00,, NOP
00EF,00,, NOP
00F0,00,, NOP ;起始条件锁定时间大于4.7us
00F1,C2 95,, CLR SDA ;发送起始信号
00F3,00,, NOP
00F4,00,, NOP
00F5,00,, NOP
00F6,00,, NOP ;起始条件锁定时间大于4.7us
00F7,C2 94,, CLR SCL ;钳住I2C总线,准备发送或接收数据
00F9,00,, NOP
00FA,22,, RET
,,,;*********************************************************************
,,,;名称:STOP
,,,;描述:停止I2C总线子程序—发送I2C总线停止条件
,,,;*********************************************************************
00FB,C2 95,STOP,STOP: CLR SDA ;发送停止条件的数据信号
00FD,00,, NOP
00FE,00,, NOP
00FF,D2 94,, SETB SCL ;发送停止条件的时钟信号
0101,00,, NOP
0102,00,, NOP
0103,00,, NOP
0104,00,, NOP
0105,00,, NOP ;起始条件建立时间大于4.7us
0106,D2 95,, SETB SDA ;发送I2C总线停止信号
0108,00,, NOP
0109,00,, NOP
010A,00,, NOP
010B,00,, NOP
010C,00,, NOP ;延迟时间大于4.7us
010D,22,, RET
,,,;*********************************************************************
,,,;名称:MACK
,,,;描述:发送应答信号子程序
,,,;*********************************************************************
010E,C2 95,MACK,MACK: CLR SDA ;将SDA置0
0110,00,, NOP
0111,00,, NOP
0112,D2 94,, SETB SCL
0114,00,, NOP
0115,00,, NOP
0116,00,, NOP
0117,00,, NOP
0118,00,, NOP ;保持数据时间,大于4.7us
0119,C2 94,, CLR SCL
011B,00,, NOP
011C,00,, NOP
011D,22,, RET
,,,;*********************************************************************
,,,;名称:MNACK
,,,;描述:发送非应答信号子程序
,,,;*********************************************************************
011E,D2 95,MNACK,MNACK: SETB SDA ;将SDA置1
0120,00,, NOP
0121,00,, NOP
0122,D2 94,, SETB SCL
0124,00,, NOP
0125,00,, NOP
0126,00,, NOP
0127,00,, NOP
0128,00,, NOP
0129,C2 94,, CLR SCL ;保持数据时间,大于4.7us
012B,00,, NOP
012C,00,, NOP
012D,22,, RET
,,,;*********************************************************************
,,,;名称:CACK
,,,;描述:检查应答位子程序,返回值:ACK=1时表示有应答
,,,;*********************************************************************
012E,D2 95,CACK,CACK: SETB SDA
0130,00,, NOP
0131,00,, NOP
0132,D2 94,, SETB SCL
0134,C2 10,, CLR ACK
0136,00,, NOP
0137,00,, NOP
0138,A2 95,, MOV C,SDA
013A,40 02,, JC CEND
013C,D2 10,, SETB ACK ;判断应答位
013E,00,CEND,CEND: NOP
013F,C2 94,, CLR SCL
0141,00,, NOP
0142,22,, RET
,,,;*********************************************************************
,,,;名称:WRBYTE
,,,;描述:发送字节子程序,字节数据放入ACC
,,,;*********************************************************************
0143,78 08,WRBYTE,WRBYTE: MOV R0,#08H
0145,33,WLP,WLP: RLC A ;取数据位
0146,40 06,, JC WRI
0148,80 12,, SJMP WRO ;判断数据位
014A,D8 F9,WLP1,WLP1: DJNZ R0,WLP
014C,00,, NOP
014D,22,, RET
014E,D2 95,WRI,WRI: SETB SDA ;发送1
0150,00,, NOP
0151,D2 94,, SETB SCL
0153,00,, NOP
0154,00,, NOP
0155,00,, NOP
0156,00,, NOP
0157,00,, NOP
0158,C2 94,, CLR SCL
015A,80 EE,, SJMP WLP1
015C,C2 95,WRO,WRO: CLR SDA ;发送0
015E,00,, NOP
015F,D2 94,, SETB SCL
0161,00,, NOP
0162,00,, NOP
0163,00,, NOP
0164,00,, NOP
0165,00,, NOP
0166,C2 94,, CLR SCL
0168,80 E0,, SJMP WLP1
,,,;*********************************************************************
,,,;名称:RDBYTE
,,,;描述:读取字节子程序,读出的数据存放在ACC
,,,;*********************************************************************
016A,78 08,RDBYTE,RDBYTE: MOV R0,#08H
016C,D2 95,RLP,RLP: SETB SDA
016E,00,, NOP
016F,D2 94,, SETB SCL ;时钟线为高,接收数据位
0171,00,, NOP
0172,00,, NOP
0173,A2 95,, MOV C,SDA ;读取数据位
0175,EA,, MOV A,R2
0176,C2 94,, CLR SCL ;将SCL拉低,时间大于4.7us
0178,33,, RLC A ;进行数据位的处理
0179,FA,, MOV R2,A
017A,00,, NOP
017B,00,, NOP
017C,00,, NOP
017D,D8 ED,, DJNZ R0,RLP ;未够8位,继续读入
017F,22,, RET
0180,7C F0,MAIN,MAIN: MOV R4,#0F0H ;延时,等待其它芯片复位完成
0182,DC FE,, DJNZ R4,$
,,,;发送数据缓存区初始化,将16个连续字节分别赋值为00H到0FH
0184,74 00,, MOV A,#0
0186,78 30,, MOV R0,#30H
0188,F6,S1,S1: MOV @R0,A
0189,08,, INC R0
018A,04,, INC A
018B,B8 40 FA,, CJNE R0,#40H,S1
,,,;向24C01C中写数据,数据存放在24C01C中30H开始的16个字节中
018E,75 50 A0,, MOV SLA,#0A0H ;24C01C地址字,写操作
0191,75 51 30,, MOV SUBA,#30H ;目标地址
0194,75 52 10,, MOV NUMBYTE,#16 ;字节数
0197,12 00 80,, LCALL IWRNBYTE ;写数据
019A,7D 14,DELAY,DELAY: MOV R5,#20
019C,7E F8,D1,D1: MOV R6,#248
019E,7F F8,D2,D2: MOV R7,#248
01A0,DF FE,, DJNZ R7,$
01A2,DE FA,, DJNZ R6,D2
01A4,DD F6,, DJNZ R5,D1
,,,;从24C01C中读数据,数据送AT89C51中40H开始的16个字节中
01A6,75 50 A0,, MOV SLA,#0A0H ;24C01C地址字,伪写入操作
01A9,75 51 30,, MOV SUBA,#30H ;目标地址
01AC,75 52 10,, MOV NUMBYTE,#16 ;字节数
01AF,12 00 AB,, LCALL IRDNBYTE ;写数据
000E,,, END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -