📄 ex7-4.sdi
字号:
,,,ACK BIT 10H ;应答标志位
,,,SLA DATA 50H ;器件地址字
,,,SUBA DATA 51H ;器件子地址
,,,NUMBYTE DATA 52H ;读/写字节数
000B,,,SDA BIT P1.7
000B,,,SCL BIT P1.6 ;I2C总线定义
,,,MTD EQU 30H ;发送数据缓存区首地址(30H-3FH)
,,,MRD EQU 40H ;接收数据缓存区首地址(40H-4FH)
,,, ORG 0000H
0000,21 30,, AJMP MAIN
,,, ORG 0030H
,,,;*********************************************************************
,,,;名称:IWRNBYTE
,,,;描述:向器件指定子地址写N个数据
,,,;入口参数:器件地址字SLA,子地址SUBA,发送数据缓冲区MTD,发送字节数NUMBYTE
,,,;*********************************************************************
0030,AB 52,IWRNBYTE,IWRNBYTE: MOV R3,NUMBYTE
0032,12 00 97,, LCALL START ;启动总线
0035,E5 50,, MOV A,SLA
0037,12 00 F3,, LCALL WRBYTE ;发送器件地址字
003A,12 00 DE,, LCALL CACK
003D,30 10 17,, JNB ACK,RETWRN ;无应答则退出
0040,E5 51,, MOV A,SUBA ;指定子地址
0042,12 00 F3,, LCALL WRBYTE
0045,12 00 DE,, LCALL CACK
0048,79 30,, MOV R1,#MTD
004A,E7,WRDA,WRDA: MOV A,@R1
004B,12 00 F3,, LCALL WRBYTE ;开始写入数据
004E,12 00 DE,, LCALL CACK
0051,30 10 DC,, JNB ACK,IWRNBYTE
0054,09,, INC R1
0055,DB F3,, DJNZ R3,WRDA ;判断是否写完
0057,12 00 AB,RETWRN,RETWRN: LCALL STOP
005A,22,, RET
,,,;*********************************************************************
,,,;名称:IRDNBYTE
,,,;描述:从器件指定子地址读取N个数据
,,,;入口参数:器件地址字SLA,子地址SUBA,接收数据缓存区MRD,接收字节数NUMBYTE
,,,;*********************************************************************
005B,AB 52,IRDNBYTE,IRDNBYTE: MOV R3,NUMBYTE
005D,12 00 97,, LCALL START
0060,E5 50,, MOV A,SLA
0062,12 00 F3,, LCALL WRBYTE ;发送器件地址字
0065,12 00 DE,, LCALL CACK
0068,30 10 22,, JNB ACK,RETRDN
006B,E5 51,, MOV A,SUBA ;指定子地址
006D,12 00 F3,, LCALL WRBYTE
0070,12 00 DE,, LCALL CACK
0073,12 00 97,, LCALL START ;重新启动总线
0076,E5 50,, MOV A,SLA
0078,04,, INC A ;准备进行读操作
0079,12 00 F3,, LCALL WRBYTE
007C,12 00 DE,, LCALL CACK
007F,30 10 D9,, JNB ACK,IRDNBYTE
0082,79 40,, MOV R1,#MRD
0084,12 01 1A,RON1,RON1: LCALL RDBYTE ;读操作开始
0087,F7,, MOV @R1,A
0088,DB 07,, DJNZ R3,SACK
008A,12 00 CE,, LCALL MNACK ;最后一字节发非应答位
008D,12 00 AB,RETRDN,RETRDN: LCALL STOP
0090,22,, RET
0091,12 00 BE,SACK,SACK: LCALL MACK
0094,09,, INC R1
0095,80 ED,, SJMP RON1
,,,;*********************************************************************
,,,;名称:STRRT
,,,;描述:启动I2C总线子程序—发送I2C总线起始条件
,,,;*********************************************************************
0097,D2 97,START,START: SETB SDA ;发送起始条件数据信号
0099,00,, NOP ;起始条件建立时间大于4.7us
009A,D2 96,, SETB SCL ;发送起始条件的时钟信号
009C,00,, NOP
009D,00,, NOP
009E,00,, NOP
009F,00,, NOP
00A0,00,, NOP ;起始条件锁定时间大于4.7us
00A1,C2 97,, CLR SDA ;发送起始信号
00A3,00,, NOP
00A4,00,, NOP
00A5,00,, NOP
00A6,00,, NOP ;起始条件锁定时间大于4.7us
00A7,C2 96,, CLR SCL ;钳住I2C总线,准备发送或接收数据
00A9,00,, NOP
00AA,22,, RET
,,,;*********************************************************************
,,,;名称:STOP
,,,;描述:停止I2C总线子程序—发送I2C总线停止条件
,,,;*********************************************************************
00AB,C2 97,STOP,STOP: CLR SDA ;发送停止条件的数据信号
00AD,00,, NOP
00AE,00,, NOP
00AF,D2 96,, SETB SCL ;发送停止条件的时钟信号
00B1,00,, NOP
00B2,00,, NOP
00B3,00,, NOP
00B4,00,, NOP
00B5,00,, NOP ;起始条件建立时间大于4.7us
00B6,D2 97,, SETB SDA ;发送I2C总线停止信号
00B8,00,, NOP
00B9,00,, NOP
00BA,00,, NOP
00BB,00,, NOP
00BC,00,, NOP ;延迟时间大于4.7us
00BD,22,, RET
,,,;*********************************************************************
,,,;名称:MACK
,,,;描述:发送应答信号子程序
,,,;*********************************************************************
00BE,C2 97,MACK,MACK: CLR SDA ;将SDA置0
00C0,00,, NOP
00C1,00,, NOP
00C2,D2 96,, SETB SCL
00C4,00,, NOP
00C5,00,, NOP
00C6,00,, NOP
00C7,00,, NOP
00C8,00,, NOP ;保持数据时间,大于4.7us
00C9,C2 96,, CLR SCL
00CB,00,, NOP
00CC,00,, NOP
00CD,22,, RET
,,,;*********************************************************************
,,,;名称:MNACK
,,,;描述:发送非应答信号子程序
,,,;*********************************************************************
00CE,D2 97,MNACK,MNACK: SETB SDA ;将SDA置1
00D0,00,, NOP
00D1,00,, NOP
00D2,D2 96,, SETB SCL
00D4,00,, NOP
00D5,00,, NOP
00D6,00,, NOP
00D7,00,, NOP
00D8,00,, NOP
00D9,C2 96,, CLR SCL ;保持数据时间,大于4.7us
00DB,00,, NOP
00DC,00,, NOP
00DD,22,, RET
,,,;*********************************************************************
,,,;名称:CACK
,,,;描述:检查应答位子程序,返回值:ACK=1时表示有应答
,,,;*********************************************************************
00DE,D2 97,CACK,CACK: SETB SDA
00E0,00,, NOP
00E1,00,, NOP
00E2,D2 96,, SETB SCL
00E4,C2 10,, CLR ACK
00E6,00,, NOP
00E7,00,, NOP
00E8,A2 97,, MOV C,SDA
00EA,40 02,, JC CEND
00EC,D2 10,, SETB ACK ;判断应答位
00EE,00,CEND,CEND: NOP
00EF,C2 96,, CLR SCL
00F1,00,, NOP
00F2,22,, RET
,,,;*********************************************************************
,,,;名称:WRBYTE
,,,;描述:发送字节子程序,字节数据放入ACC
,,,;*********************************************************************
00F3,78 08,WRBYTE,WRBYTE: MOV R0,#08H
00F5,33,WLP,WLP: RLC A ;取数据位
00F6,40 06,, JC WRI
00F8,80 12,, SJMP WRO ;判断数据位
00FA,D8 F9,WLP1,WLP1: DJNZ R0,WLP
00FC,00,, NOP
00FD,22,, RET
00FE,D2 97,WRI,WRI: SETB SDA ;发送1
0100,00,, NOP
0101,D2 96,, SETB SCL
0103,00,, NOP
0104,00,, NOP
0105,00,, NOP
0106,00,, NOP
0107,00,, NOP
0108,C2 96,, CLR SCL
010A,80 EE,, SJMP WLP1
010C,C2 97,WRO,WRO: CLR SDA ;发送0
010E,00,, NOP
010F,D2 96,, SETB SCL
0111,00,, NOP
0112,00,, NOP
0113,00,, NOP
0114,00,, NOP
0115,00,, NOP
0116,C2 96,, CLR SCL
0118,80 E0,, SJMP WLP1
,,,;*********************************************************************
,,,;名称:RDBYTE
,,,;描述:读取字节子程序,读出的数据存放在ACC
,,,;*********************************************************************
011A,78 08,RDBYTE,RDBYTE: MOV R0,#08H
011C,D2 97,RLP,RLP: SETB SDA
011E,00,, NOP
011F,D2 96,, SETB SCL ;时钟线为高,接收数据位
0121,00,, NOP
0122,00,, NOP
0123,A2 97,, MOV C,SDA ;读取数据位
0125,EA,, MOV A,R2
0126,C2 96,, CLR SCL ;将SCL拉低,时间大于4.7us
0128,33,, RLC A ;进行数据位的处理
0129,FA,, MOV R2,A
012A,00,, NOP
012B,00,, NOP
012C,00,, NOP
012D,D8 ED,, DJNZ R0,RLP ;未够8位,继续读入
012F,22,, RET
,,,
0130,7C F0,MAIN,MAIN: MOV R4,#0F0H ;延时,等待其它芯片复位完成
0132,DC FE,, DJNZ R4,$
,,,;发送数据缓存区初始化,将16个连续字节分别赋值为00H到0FH
0134,74 00,, MOV A,#00H
0136,78 30,, MOV R0,#30H
0138,F6,S1,S1: MOV @R0,A
0139,08,, INC R0
013A,04,, INC A
013B,B8 40 FA,, CJNE R0,#40H,S1
,,,;向24C02C中写数据,数据存放在24C02C中50H开始的16个字节中
013E,75 50 A0,, MOV SLA,#0A0H ;24C02C地址字,写操作
0141,75 51 50,, MOV SUBA,#50H ;目标地址
0144,75 52 10,, MOV NUMBYTE,#16 ;字节数
0147,12 00 30,, LCALL IWRNBYTE ;写数据
014A,7D 14,DELAY,DELAY: MOV R5,#20
014C,7E F8,D1,D1: MOV R6,#248
014E,7F F8,D2,D2: MOV R7,#248
0150,DF FE,, DJNZ R7,$
0152,DE FA,, DJNZ R6,D2
0154,DD F6,, DJNZ R5,D1
,,,;从24C04C中读数据,数据送AT89C51中40H开始的16个字节中
0156,75 50 A0,, MOV SLA,#0A0H ;24C02C地址字,伪写入操作
0159,75 51 50,, MOV SUBA,#50H ;目标地址
015C,75 52 10,, MOV NUMBYTE,#16 ;字节数
015F,12 00 5B,, LCALL IRDNBYTE ;读数据
0162,80 FE,, SJMP $
000E,,, END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -