📄 vi2c_c51.lst
字号:
187 1 _Nop(); /*时钟低电平周期大于4μs*/
188 1 _Nop();
189 1 _Nop();
190 1 _Nop();
191 1 SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
192 1 _Nop();
193 1 _Nop();
194 1 }
195
196
197
198 /*******************************************************************
199 用户接口函数
200 *******************************************************************/
201
202
203 /*******************************************************************
204 向无子地址器件发送字节数据函数
205 函数原型: bit ISendByte(uchar sla,ucahr c);
206 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
207 如果返回1表示操作成功,否则操作有误。
208 注意: 使用前必须已结束总线。
209 ********************************************************************/
210 bit ISendByte(uchar sla,uchar c)
211 {
212 1 Start_I2c(); /*启动总线*/
213 1 SendByte(sla); /*发送器件地址*/
214 1 if(ack==0)return(0);
215 1 SendByte(c); /*发送数据*/
216 1 if(ack==0)return(0);
217 1 Stop_I2c(); /*结束总线*/
218 1 return(1);
219 1 }
220
221
222
223
224 /*******************************************************************
225 向有子地址器件发送多字节数据函数
226 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
227 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
228 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
229 如果返回1表示操作成功,否则操作有误。
230 注意: 使用前必须已结束总线。
231 ********************************************************************/
232 bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
233 {
234 1 uchar i;
235 1
236 1 Start_I2c(); /*启动总线*/
237 1 SendByte(sla); /*发送器件地址*/
238 1 if(ack==0)return(0);
239 1 SendByte(suba); /*发送器件子地址*/
240 1 if(ack==0)return(0);
C51 COMPILER V7.20 VI2C_C51 05/30/2006 19:25:31 PAGE 5
241 1
242 1 for(i=0;i<no;i++)
243 1 {
244 2 SendByte(*s); /*发送数据*/
245 2 if(ack==0)return(0);
246 2 s++;
247 2 }
248 1 Stop_I2c(); /*结束总线*/
249 1 return(1);
250 1 }
251
252
253 /*******************************************************************
254 向无子地址器件发送多字节数据函数
255 函数原型: bit ISendStr(uchar sla,ucahr *s,uchar no);
256 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
257 地址sla,发送内容是s指向的内容,发送no个字节。
258 如果返回1表示操作成功,否则操作有误。
259 注意: 使用前必须已结束总线。
260 ********************************************************************/
261 bit ISendStrExt(uchar sla,uchar *s,uchar no)
262 {
263 1 uchar i;
264 1
265 1 Start_I2c(); /*启动总线*/
266 1 SendByte(sla); /*发送器件地址*/
267 1 if(ack==0)return(0);
268 1
269 1 for(i=0;i<no;i++)
270 1 {
271 2 SendByte(*s); /*发送数据*/
272 2 if(ack==0)return(0);
273 2 s++;
274 2 }
275 1 Stop_I2c(); /*结束总线*/
276 1 return(1);
277 1 }
278
279
280
281
282
283 /*******************************************************************
284 向无子地址器件读字节数据函数
285 函数原型: bit IRcvByte(uchar sla,ucahr *c);
286 功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
287 址sla,返回值在c.
288 如果返回1表示操作成功,否则操作有误。
289 注意: 使用前必须已结束总线。
290 ********************************************************************/
291 bit IRcvByte(uchar sla,uchar *c)
292 {
293 1 Start_I2c(); /*启动总线*/
294 1 SendByte(sla+1); /*发送器件地址*/
295 1 if(ack==0)return(0);
296 1 *c=RcvByte(); /*读取数据*/
297 1 Ack_I2c(1); /*发送非就答位*/
298 1 Stop_I2c(); /*结束总线*/
299 1 return(1);
300 1 }
301
302
C51 COMPILER V7.20 VI2C_C51 05/30/2006 19:25:31 PAGE 6
303
304 /*******************************************************************
305 向有子地址器件读取多字节数据函数
306 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
307 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
308 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
309 如果返回1表示操作成功,否则操作有误。
310 注意: 使用前必须已结束总线。
311 ********************************************************************/
312 bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
313 {
314 1 uchar i;
315 1
316 1 Start_I2c(); /*启动总线*/
317 1 SendByte(sla); /*发送器件地址*/
318 1 if(ack==0)return(0);
319 1 SendByte(suba); /*发送器件子地址*/
320 1 if(ack==0)return(0);
321 1
322 1 Start_I2c(); /*重新启动总线*/
323 1 SendByte(sla+1);
324 1 if(ack==0)return(0);
325 1 for(i=0;i<no-1;i++)
326 1 {
327 2 *s=RcvByte(); /*发送数据*/
328 2 Ack_I2c(0); /*发送就答位*/
329 2 s++;
330 2 }
331 1 *s=RcvByte();
332 1 Ack_I2c(1); /*发送非应位*/
333 1 Stop_I2c(); /*结束总线*/
334 1 return(1);
335 1 }
336
337
338 /*******************************************************************
339 向无子地址器件读取多字节数据函数
340 函数原型: bit ISendStrExt(uchar sla,ucahr *s,uchar no);
341 功能: 从启动总线到发送地址,读数据,结束总线的全过程.
342 从器件地址sla,读出的内容放入s指向的存储区,
343 读no个字节。如果返回1表示操作成功,否则操作有误。
344 注意: 使用前必须已结束总线。
345 ********************************************************************/
346 bit IRcvStrExt(uchar sla,uchar *s,uchar no)
347 {
348 1 uchar i;
349 1
350 1 Start_I2c();
351 1 SendByte(sla+1);
352 1 if(ack==0)return(0);
353 1
354 1 for(i=0;i<no-1;i++)
355 1 {
356 2 *s=RcvByte(); /*发送数据*/
357 2 Ack_I2c(0); /*发送就答位*/
358 2 s++;
359 2 }
360 1 *s=RcvByte();
361 1 Ack_I2c(1); /*发送非应位*/
362 1 Stop_I2c(); /*结束总线*/
363 1 return(1);
364 1 }
C51 COMPILER V7.20 VI2C_C51 05/30/2006 19:25:31 PAGE 7
365
366
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 451 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 22
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -