📄 i2c.lst
字号:
113 /*******************************************************************
114 向有子地址器件发送多字节数据函数
115 函数原型: bit I2C_SendStr(uchar sla,uchar suba,ucahr *s,uchar no);
116 功能: 从启动总线到发送地址、子地址、数据、结束总线的全过程。从器件
117 地址sla、子地址suba、发送内容是s、指向的内容发送no个字节。
118 如果返回1,表示操作成功,否则操作有误。
119 ********************************************************************/
120 bit I2C_SendStr(uchar sla,uchar suba,uchar *s,uchar no)
121 {
122 1 uchar i;
123 1
124 1
125 1 I2C_GetBus(); /*启动总线*/
126 1
127 1 I2C_Send(sla); /*发送器件地址,若无应答则返回*/
128 1 if(S1STA!=0X18)
129 1 {
130 2 S1CON=0XD5;
131 2 return(0);
132 2 }
133 1
134 1 I2C_Send(suba); /*发送器件子地址,若无应答则返回*/
C51 COMPILER V7.07 I2C 07/08/2004 05:56:07 PAGE 6
135 1 if(S1STA!=0X28)
136 1 {
137 2 S1CON=0XD5;
138 2 return(0);
139 2 }
140 1
141 1 for(i=0;i<no;i++)
142 1 {
143 2 I2C_Send(*s); /*发送数据,若无应答则返回*/
144 2 if(S1STA!=0X28)
145 2 {
146 3 S1CON=0XD5;
147 3 return(0);
148 3 }
149 2 s++;
150 2 }
151 1
152 1 S1CON=0XD5; /*结束总线*/
153 1
154 1 return(1);
155 1 }
156
157
158 /*******************************************************************
159 向无子地址器件读字节数据函数
160 函数原型: bit I2C_RcvByte(uchar sla,ucahr *c);
161 功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
162 址sla、返回值在c。
163 如果返回1,表示操作成功,否则操作有误。
164 ********************************************************************/
165 bit I2C_RcvByte(uchar sla,uchar *c)
166 {
167 1 I2C_GetBus(); /*启动总线*/
168 1
169 1 I2C_Send(sla+1); /*发送器件地址,若无应答则返回*/
170 1 if(S1STA!=0X40)
171 1 {
172 2 S1CON=0XD5;
173 2 return(0);
174 2 }
175 1
176 1 S1CON=0XC1; /*接收一字节数据即发送非应答位*/
177 1 while(SI==0); /*等待接收数据*/
178 1
179 1 if(S1STA!=0X58)
180 1 {
181 2 S1CON=0XD5;
182 2 return(0);
183 2 }
184 1
185 1 *c=S1DAT; /*读取数据*/
186 1 S1CON=0XD5; /*结束总线*/
187 1
188 1 return(1);
189 1 }
190
191
192 /*******************************************************************
193 向有子地址器件读取多字节数据函数
194 函数原型: bit I2C_SendStr(uchar sla,uchar suba,ucahr *s,uchar no);
195 功能: 从启动总线到发送地址、子地址、读数据、结束总线的全过程,从器件
196 地址sla,子地址suba,读出的内容放入s指向的存储区读no个字节。
C51 COMPILER V7.07 I2C 07/08/2004 05:56:07 PAGE 7
197 如果返回1,表示操作成功,否则操作有误。
198 ********************************************************************/
199 bit I2C_RcvStr(uchar sla,uchar suba,uchar *s,uchar no)
200 {
201 1 uchar i;
202 1
203 1
204 1 I2C_GetBus(); /*启动总线*/
205 1
206 1 I2C_Send(sla); /*发送器件地址,若无应答则返回*/
207 1 if(S1STA!=0X18)
208 1 {
209 2 S1CON=0XD5;
210 2 return(0);
211 2 }
212 1
213 1 I2C_Send(suba); /*发送器件子地址,若无应答则返回*/
214 1 if(S1STA!=0X28)
215 1 {
216 2 S1CON=0XD5;
217 2 return(0);
218 2 }
219 1
220 1 S1CON=0XE5; /*重新启动总线*/
221 1 while(SI==0);
222 1
223 1 I2C_Send(sla+1); /*发送器件地址,若无应答则返回*/
224 1 if(S1STA!=0X40)
225 1 {
226 2 S1CON=0XD5;
227 2 return(0);
228 2 }
229 1
230 1 for(i=0;i<no-1;i++)
231 1 {
232 2 S1CON=0XC5; /*接收一字节数据并发送应答位*/
233 2 while(SI==0); /*等待接收数据*/
234 2 if(S1STA!=0X50)
235 2 {
236 3 S1CON=0XD5;
237 3 return(0);
238 3 }
239 2
240 2 *s=S1DAT; /*读取数据*/
241 2 s++;
242 2 }
243 1
244 1 S1CON=0XC1; /*接收最后一字节数据并发送非应答位*/
245 1 while(SI==0);
246 1 *s=S1DAT;
247 1
248 1 S1CON=0XD5; /*结束总线*/
249 1
250 1 return(1);
251 1 }
252
253
254
255 /*软件包大小 字节*/
C51 COMPILER V7.07 I2C 07/08/2004 05:56:07 PAGE 8
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION I2C_CheckBus (BEGIN)
; SOURCE LINE # 32
; SOURCE LINE # 33
; SOURCE LINE # 34
0000 C296 CLR SCL
; SOURCE LINE # 35
0002 D297 SETB SDA
; SOURCE LINE # 36
0004 209702 JB SDA,?C0001
; SOURCE LINE # 37
0007 C3 CLR C
0008 22 RET
0009 ?C0001:
; SOURCE LINE # 39
0009 D296 SETB SCL
; SOURCE LINE # 40
000B 209602 JB SCL,?C0003
; SOURCE LINE # 41
000E C3 CLR C
000F 22 RET
0010 ?C0003:
; SOURCE LINE # 43
0010 D3 SETB C
; SOURCE LINE # 44
0011 ?C0002:
0011 22 RET
; FUNCTION I2C_CheckBus (END)
; FUNCTION I2C_GetBus (BEGIN)
; SOURCE LINE # 52
; SOURCE LINE # 53
; SOURCE LINE # 54
0000 120000 R LCALL I2C_CheckBus
; SOURCE LINE # 55
0003 75D8C5 MOV S1CON,#0C5H
; SOURCE LINE # 57
0006 D2DD SETB STA
0008 ?C0004:
; SOURCE LINE # 58
0008 30DBFD JNB SI,?C0004
; SOURCE LINE # 59
000B ?C0006:
000B 22 RET
; FUNCTION I2C_GetBus (END)
; FUNCTION I2C_Stop (BEGIN)
; SOURCE LINE # 65
; SOURCE LINE # 66
; SOURCE LINE # 67
0000 75D8D5 MOV S1CON,#0D5H
; SOURCE LINE # 68
0003 22 RET
; FUNCTION I2C_Stop (END)
; FUNCTION L?0047 (BEGIN)
0000 AE07 MOV R6,AR7
0002 120000 R LCALL I2C_GetBus
; FUNCTION _I2C_Send (BEGIN)
; SOURCE LINE # 74
C51 COMPILER V7.07 I2C 07/08/2004 05:56:07 PAGE 9
;---- Variable 'c' assigned to Register 'R7' ----
; SOURCE LINE # 75
; SOURCE LINE # 76
0005 8FDA MOV S1DAT,R7
; SOURCE LINE # 77
0007 75D8C5 MOV S1CON,#0C5H
000A ?C0008:
; SOURCE LINE # 78
000A 30DBFD JNB SI,?C0008
; SOURCE LINE # 79
000D ?C0010:
000D 22 RET
; FUNCTION _I2C_Send (END)
; FUNCTION _I2C_SendByte (BEGIN)
; SOURCE LINE # 89
;---- Variable 'c' assigned to Register 'R6' ----
0000 AE05 MOV R6,AR5
;---- Variable 'sla' assigned to Register 'R7' ----
; SOURCE LINE # 90
; SOURCE LINE # 91
0002 120000 R LCALL I2C_GetBus
; SOURCE LINE # 93
0005 120000 R LCALL _I2C_Send
; SOURCE LINE # 94
0008 E5D9 MOV A,S1STA
000A 6418 XRL A,#018H
000C 6002 JZ ?C0011
; SOURCE LINE # 95
; SOURCE LINE # 96
; SOURCE LINE # 97
000E 800B SJMP ?C0040
; SOURCE LINE # 98
0010 ?C0011:
; SOURCE LINE # 100
0010 AF06 MOV R7,AR6
0012 120000 R LCALL _I2C_Send
; SOURCE LINE # 101
0015 E5D9 MOV A,S1STA
0017 6428 XRL A,#028H
0019 6005 JZ ?C0013
; SOURCE LINE # 102
; SOURCE LINE # 103
001B ?C0040:
001B 75D8D5 MOV S1CON,#0D5H
; SOURCE LINE # 104
001E C3 CLR C
001F 22 RET
; SOURCE LINE # 105
0020 ?C0013:
; SOURCE LINE # 107
0020 75D8D5 MOV S1CON,#0D5H
; SOURCE LINE # 109
0023 D3 SETB C
; SOURCE LINE # 110
0024 ?C0012:
0024 22 RET
; FUNCTION _I2C_SendByte (END)
; FUNCTION _I2C_SendStr (BEGIN)
; SOURCE LINE # 120
;---- Variable 'sla' assigned to Register 'R6' ----
C51 COMPILER V7.07 I2C 07/08/2004 05:56:07 PAGE 10
;---- Variable 's' assigned to Register 'R1/R2/R3' ----
;---- Variable 'suba' assigned to Register 'R5' ----
; SOURCE LINE # 121
; SOURCE LINE # 125
; SOURCE LINE # 127
0000 120000 R LCALL L?0047
; SOURCE LINE # 128
0003 E5D9 MOV A,S1STA
0005 6418 XRL A,#018H
0007 6002 JZ ?C0014
; SOURCE LINE # 129
; SOURCE LINE # 130
; SOURCE LINE # 131
0009 8022 SJMP ?C0042
; SOURCE LINE # 132
000B ?C0014:
; SOURCE LINE # 134
000B AF05 MOV R7,AR5
000D 120000 R LCALL _I2C_Send
; SOURCE LINE # 135
0010 E5D9 MOV A,S1STA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -