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