📄 i2c.lst
字号:
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 1
MCS-51 Family Cross Assembler A S E M - 5 1 V 1.2
=====================================================
Source File: I2C.ASM
Object File: I2C.HEX
List File: I2C.LST
Line I Addr Code Source
1: N 10 ACK BIT 10H ;应答标志位
2: N 50 SLA DATA 50H ;器件地址字
3: N 51 SUBA DATA 51H ;器件子地址
4: N 52 NUMBYTE DATA 52H ;读/写字节数
5: B 95 SDA BIT P1.5
6: B 94 SCL BIT P1.4 ;I2C总线定义
7: N 0030 MTD EQU 30H ;发送数据缓存区首地址(30H-3FH)
8: N 0040 MRD EQU 40H ;接收数据缓存区首地址(40H-4FH)
9: 0000 21 80 AJMP MAIN
10: N 0080 ORG 80H
11: ;*********************************************************************
12: ;名称:IWRNBYTE
13: ;描述:向器件指定子地址写N个数据
14: ;入口参数:器件地址字SLA,子地址SUBA,发送数据缓冲区MTD,发送字节数NUMBYTE
15: ;*********************************************************************
16: 0080 IWRNBYTE:
17: 0080 AB 52 MOV R3,NUMBYTE
18: 0082 12 00 E7 LCALL START ;启动总线
19: 0085 E5 50 MOV A,SLA
20: 0087 12 01 43 LCALL WRBYTE ;发送器件地址字
21: 008A 12 01 2E LCALL CACK
22: 008D 30 10 17 JNB ACK,RETWRN ;无应答则退出
23: 0090 E5 51 MOV A,SUBA ;指定子地址
24: 0092 12 01 43 LCALL WRBYTE
25: 0095 12 01 2E LCALL CACK
26: 0098 79 30 MOV R1,#MTD
27: 009A E7 WRDA: MOV A,@R1
28: 009B 12 01 43 LCALL WRBYTE ;开始写入数据
29: 009E 12 01 2E LCALL CACK
30: 00A1 30 10 DC JNB ACK,IWRNBYTE
31: 00A4 09 INC R1
32: 00A5 DB F3 DJNZ R3,WRDA ;判断是否写完
33: 00A7 12 00 FB RETWRN: LCALL STOP
34: 00AA 22 RET
35: ;*********************************************************************
36: ;名称:IRDNBYTE
37: ;描述:从器件指定子地址读取N个数据
38: ;入口参数:器件地址字SLA,子地址SUBA,接收数据缓存区MRD,接收字节数NUMBYTE
39: ;*********************************************************************
40: 00AB IRDNBYTE:
41: 00AB AB 52 MOV R3,NUMBYTE
42: 00AD 12 00 E7 LCALL START
43: 00B0 E5 50 MOV A,SLA
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 2
Line I Addr Code Source
44: 00B2 12 01 43 LCALL WRBYTE ;发送器件地址字
45: 00B5 12 01 2E LCALL CACK
46: 00B8 30 10 22 JNB ACK,RETRDN
47: 00BB E5 51 MOV A,SUBA ;指定子地址
48: 00BD 12 01 43 LCALL WRBYTE
49: 00C0 12 01 2E LCALL CACK
50: 00C3 12 00 E7 LCALL START ;重新启动总线
51: 00C6 E5 50 MOV A,SLA
52: 00C8 04 INC A ;准备进行读操作
53: 00C9 12 01 43 LCALL WRBYTE
54: 00CC 12 01 2E LCALL CACK
55: 00CF 30 10 D9 JNB ACK,IRDNBYTE
56: 00D2 79 40 MOV R1,#MRD
57: 00D4 12 01 6A RON1: LCALL RDBYTE ;读操作开始
58: 00D7 F7 MOV @R1,A
59: 00D8 DB 07 DJNZ R3,SACK
60: 00DA 12 01 1E LCALL MNACK ;最后一字节发非应答位
61: 00DD 12 00 FB RETRDN: LCALL STOP
62: 00E0 22 RET
63: 00E1 12 01 0E SACK: LCALL MACK
64: 00E4 09 INC R1
65: 00E5 80 ED SJMP RON1
66: ;*********************************************************************
67: ;名称:STRRT
68: ;描述:启动I2C总线子程序—发送I2C总线起始条件
69: ;*********************************************************************
70: 00E7 D2 95 START: SETB SDA ;发送起始条件数据信号
71: 00E9 00 NOP ;起始条件建立时间大于4.7us
72: 00EA D2 94 SETB SCL ;发送起始条件的时钟信号
73: 00EC 00 NOP
74: 00ED 00 NOP
75: 00EE 00 NOP
76: 00EF 00 NOP
77: 00F0 00 NOP ;起始条件锁定时间大于4.7us
78: 00F1 C2 95 CLR SDA ;发送起始信号
79: 00F3 00 NOP
80: 00F4 00 NOP
81: 00F5 00 NOP
82: 00F6 00 NOP ;起始条件锁定时间大于4.7us
83: 00F7 C2 94 CLR SCL ;钳住I2C总线,准备发送或接收数据
84: 00F9 00 NOP
85: 00FA 22 RET
86: ;*********************************************************************
87: ;名称:STOP
88: ;描述:停止I2C总线子程序—发送I2C总线停止条件
89: ;*********************************************************************
90: 00FB C2 95 STOP: CLR SDA ;发送停止条件的数据信号
91: 00FD 00 NOP
92: 00FE 00 NOP
93: 00FF D2 94 SETB SCL ;发送停止条件的时钟信号
94: 0101 00 NOP
95: 0102 00 NOP
96: 0103 00 NOP
97: 0104 00 NOP
98: 0105 00 NOP ;起始条件建立时间大于4.7us
99: 0106 D2 95 SETB SDA ;发送I2C总线停止信号
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 3
Line I Addr Code Source
100: 0108 00 NOP
101: 0109 00 NOP
102: 010A 00 NOP
103: 010B 00 NOP
104: 010C 00 NOP ;延迟时间大于4.7us
105: 010D 22 RET
106: ;*********************************************************************
107: ;名称:MACK
108: ;描述:发送应答信号子程序
109: ;*********************************************************************
110: 010E C2 95 MACK: CLR SDA ;将SDA置0
111: 0110 00 NOP
112: 0111 00 NOP
113: 0112 D2 94 SETB SCL
114: 0114 00 NOP
115: 0115 00 NOP
116: 0116 00 NOP
117: 0117 00 NOP
118: 0118 00 NOP ;保持数据时间,大于4.7us
119: 0119 C2 94 CLR SCL
120: 011B 00 NOP
121: 011C 00 NOP
122: 011D 22 RET
123: ;*********************************************************************
124: ;名称:MNACK
125: ;描述:发送非应答信号子程序
126: ;*********************************************************************
127: 011E D2 95 MNACK: SETB SDA ;将SDA置1
128: 0120 00 NOP
129: 0121 00 NOP
130: 0122 D2 94 SETB SCL
131: 0124 00 NOP
132: 0125 00 NOP
133: 0126 00 NOP
134: 0127 00 NOP
135: 0128 00 NOP
136: 0129 C2 94 CLR SCL ;保持数据时间,大于4.7us
137: 012B 00 NOP
138: 012C 00 NOP
139: 012D 22 RET
140: ;*********************************************************************
141: ;名称:CACK
142: ;描述:检查应答位子程序,返回值:ACK=1时表示有应答
143: ;*********************************************************************
144: 012E D2 95 CACK: SETB SDA
145: 0130 00 NOP
146: 0131 00 NOP
147: 0132 D2 94 SETB SCL
148: 0134 C2 10 CLR ACK
149: 0136 00 NOP
150: 0137 00 NOP
151: 0138 A2 95 MOV C,SDA
152: 013A 40 02 JC CEND
153: 013C D2 10 SETB ACK ;判断应答位
154: 013E 00 CEND: NOP
155: 013F C2 94 CLR SCL
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 4
Line I Addr Code Source
156: 0141 00 NOP
157: 0142 22 RET
158: ;*********************************************************************
159: ;名称:WRBYTE
160: ;描述:发送字节子程序,字节数据放入ACC
161: ;*********************************************************************
162: 0143 78 08 WRBYTE: MOV R0,#08H
163: 0145 33 WLP: RLC A ;取数据位
164: 0146 40 06 JC WRI
165: 0148 80 12 SJMP WRO ;判断数据位
166: 014A D8 F9 WLP1: DJNZ R0,WLP
167: 014C 00 NOP
168: 014D 22 RET
169: 014E D2 95 WRI: SETB SDA ;发送1
170: 0150 00 NOP
171: 0151 D2 94 SETB SCL
172: 0153 00 NOP
173: 0154 00 NOP
174: 0155 00 NOP
175: 0156 00 NOP
176: 0157 00 NOP
177: 0158 C2 94 CLR SCL
178: 015A 80 EE SJMP WLP1
179: 015C C2 95 WRO: CLR SDA ;发送0
180: 015E 00 NOP
181: 015F D2 94 SETB SCL
182: 0161 00 NOP
183: 0162 00 NOP
184: 0163 00 NOP
185: 0164 00 NOP
186: 0165 00 NOP
187: 0166 C2 94 CLR SCL
188: 0168 80 E0 SJMP WLP1
189: ;*********************************************************************
190: ;名称:RDBYTE
191: ;描述:读取字节子程序,读出的数据存放在ACC
192: ;*********************************************************************
193: 016A 78 08 RDBYTE: MOV R0,#08H
194: 016C D2 95 RLP: SETB SDA
195: 016E 00 NOP
196: 016F D2 94 SETB SCL ;时钟线为高,接收数据位
197: 0171 00 NOP
198: 0172 00 NOP
199: 0173 A2 95 MOV C,SDA ;读取数据位
200: 0175 EA MOV A,R2
201: 0176 C2 94 CLR SCL ;将SCL拉低,时间大于4.7us
202: 0178 33 RLC A ;进行数据位的处理
203: 0179 FA MOV R2,A
204: 017A 00 NOP
205: 017B 00 NOP
206: 017C 00 NOP
207: 017D D8 ED DJNZ R0,RLP ;未够8位,继续读入
208: 017F 22 RET
209: 0180 7C F0 MAIN: MOV R4,#0F0H ;延时,等待其它芯片复位完成
210: 0182 DC FE DJNZ R4,$
211: ;发送数据缓存区初始化,将16个连续字节分别赋值为00H到0FH
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 5
Line I Addr Code Source
212: 0184 74 00 MOV A,#0
213: 0186 78 30 MOV R0,#30H
214: 0188 F6 S1: MOV @R0,A
215: 0189 08 INC R0
216: 018A 04 INC A
217: 018B B8 40 FA CJNE R0,#40H,S1
218: ;向24C01C中写数据,数据存放在24C01C中30H开始的16个字节中
219: 018E 75 50 A0 MOV SLA,#0A0H ;24C01C地址字,写操作
220: 0191 75 51 30 MOV SUBA,#30H ;目标地址
221: 0194 75 52 10 MOV NUMBYTE,#16 ;字节数
222: 0197 12 00 80 LCALL IWRNBYTE ;写数据
223: 019A 7D 14 DELAY: MOV R5,#20
224: 019C 7E F8 D1: MOV R6,#248
225: 019E 7F F8 D2: MOV R7,#248
226: 01A0 DF FE DJNZ R7,$
227: 01A2 DE FA DJNZ R6,D2
228: 01A4 DD F6 DJNZ R5,D1
229: ;从24C01C中读数据,数据送AT89C51中40H开始的16个字节中
230: 01A6 75 50 A0 MOV SLA,#0A0H ;24C01C地址字,伪写入操作
231: 01A9 75 51 30 MOV SUBA,#30H ;目标地址
232: 01AC 75 52 10 MOV NUMBYTE,#16 ;字节数
233: 01AF 12 00 AB LCALL IRDNBYTE ;写数据
234: END
register banks used: ---
no errors
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 6
L I S T O F S Y M B O L S
=============================
SYMBOL TYPE VALUE LINE
------------------------------------------------------------
AC BIT D6
ACC DATA E0
ACK BIT 10 1
B DATA F0
CACK CODE 012E 144
CEND CODE 013E 154
CY BIT D7
D1 CODE 019C 224
D2 CODE 019E 225
DELAY CODE 019A 223
DPH DATA 83
DPL DATA 82
EA BIT AF
ES BIT AC
ET0 BIT A9
ET1 BIT AB
EX0 BIT A8
EX1 BIT AA
EXTI0 CODE 0003
EXTI1 CODE 0013
F0 BIT D5
IE DATA A8
IE0 BIT 89
IE1 BIT 8B
INT0 BIT B2
INT1 BIT B3
IP DATA B8
IRDNBYTE CODE 00AB 40
IT0 BIT 88
IT1 BIT 8A
IWRNBYTE CODE 0080 16
MACK CODE 010E 110
MAIN CODE 0180 209
MNACK CODE 011E 127
MRD NUMBER 0040 8
MTD NUMBER 0030 7
NUMBYTE DATA 52 4
OV BIT D2
P BIT D0
P0 DATA 80
P1 DATA 90
P2 DATA A0
P3 DATA B0
PCON DATA 87
PS BIT BC
PSW DATA D0
PT0 BIT B9
PT1 BIT BB
PX0 BIT B8
PX1 BIT BA
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 7
SYMBOL TYPE VALUE LINE
------------------------------------------------------------
RB8 BIT 9A
RD BIT B7
RDBYTE CODE 016A 193
REN BIT 9C
RESET CODE 0000
RETRDN CODE 00DD 61
RETWRN CODE 00A7 33
RI BIT 98
RLP CODE 016C 194
RON1 CODE 00D4 57
RS0 BIT D3
RS1 BIT D4
RXD BIT B0
S1 CODE 0188 214
SACK CODE 00E1 63
SBUF DATA 99
SCL BIT 94 6
SCON DATA 98
SDA BIT 95 5
SINT CODE 0023
SLA DATA 50 2
SM0 BIT 9F
SM1 BIT 9E
SM2 BIT 9D
SP DATA 81
START CODE 00E7 70
STOP CODE 00FB 90
SUBA DATA 51 3
T0 BIT B4
T1 BIT B5
TB8 BIT 9B
TCON DATA 88
TF0 BIT 8D
TF1 BIT 8F
TH0 DATA 8C
TH1 DATA 8D
TI BIT 99
TIMER0 CODE 000B
TIMER1 CODE 001B
TL0 DATA 8A
TL1 DATA 8B
TMOD DATA 89
TR0 BIT 8C
TR1 BIT 8E
TXD BIT B1
WLP CODE 0145 163
WLP1 CODE 014A 166
WR BIT B6
WRBYTE CODE 0143 162
WRDA CODE 009A 27
WRI CODE 014E 169
WRO CODE 015C 179
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -