📄 viic.lst
字号:
162 1 }
163
164
165
166
167 /********************************************************************
168 应答子函数
169 原型: void I2c_Ack(bit a);
170
171 功能:主控器进行应答信号,(可以是应答或非应答信号)
172 ********************************************************************/
173 void I2c_Ack(bit a)
174 {
175 1
176 1 if(a==0)SDA=0; //在此发出应答或非应答信号
177 1 else SDA=1;
178 1
179 1 SomeNopForIic();
C51 COMPILER V7.04 VIIC 03/04/2006 08:52:55 PAGE 4
180 1 SCL=0;
181 1
182 1 SomeNopForIic(); //时钟低电平周期大于4μs
183 1 SCL=1; //清时钟线,钳住I2C总线以便继续接收
184 1 SomeNopForIic();
185 1 if(SDA==1)SDA=1;
186 1 SomeNopForIic();
187 1 SCL=0;
188 1 SomeNopForIic();
189 1 SDA=1;
190 1 SomeNopForIic();
191 1
192 1
193 1 }
194
195
196 /*******************************************************************
197 向无子地址器件发送字节数据函数
198 函数原型: bit ISendByte(uchar sla,ucahr c);
199 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
200 如果返回1表示操作成功,否则操作有误。
201 注意: 使用前必须已结束总线。
202 ********************************************************************/
203 /*
204 bit ISendByte(uchar sla,uchar c)
205 {
206 I2c_Start(); //启动总线
207 I2c_SendByte(sla); //发送器件地址
208 if(b_AckForIIC==0)return(0);
209 I2c_SendByte(c); //发送数据
210 if(b_AckForIIC==0)return(0);
211 I2c_Stop(); //结束总线
212 return(1);
213 }
214
215 */
216
217
218 /*******************************************************************
219 向有子地址器件发送多字节数据函数
220 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
221 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
222 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
223 如果返回1表示操作成功,否则操作有误。
224 注意: 使用前必须已结束总线。
225 ********************************************************************/
226 bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
227 {
228 1 uchar i;
229 1
230 1 I2c_Start(); //启动总线
231 1 I2c_SendByte(sla); //发送器件地址
232 1
233 1 if(b_AckForIIC==0)return(0);
234 1 I2c_SendByte(suba); //发送器件子地址
235 1 if(b_AckForIIC==0)return(0);
236 1
237 1 for(i=0;i<no;i++)
238 1 {
239 2 I2c_SendByte(*s); //发送数据
240 2 if(b_AckForIIC==0)return(0);
241 2 s++;
C51 COMPILER V7.04 VIIC 03/04/2006 08:52:55 PAGE 5
242 2 }
243 1
244 1 I2c_Stop(); //结束总线
245 1 return(1);
246 1 }
247
248
249
250
251
252
253 /*******************************************************************
254 向无子地址器件读字节数据函数
255 函数原型: bit IRcvByte(uchar sla,ucahr *c);
256 功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
257 址sla,返回值在c.
258 如果返回1表示操作成功,否则操作有误。
259 注意: 使用前必须已结束总线。
260 ********************************************************************/
261 /*
262 bit IRcvByte(uchar sla,uchar *c)
263 {
264 I2c_Start(); //启动总线
265 I2c_SendByte(sla+1); //发送器件地址
266 if(b_AckForIIC==0)return(0);
267 *c=I2c_RcvByte(); //读取数据
268 I2c_Ack(1); //发送非就答位
269 I2c_Stop(); //结束总线
270 return(1);
271 }
272 */
273
274
275
276 /*******************************************************************
277 向有子地址器件读取多字节数据函数
278 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
279 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
280 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
281 如果返回1表示操作成功,否则操作有误。
282 注意: 使用前必须已结束总线。
283 ********************************************************************/
284 bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
285 {
286 1 uchar i;
287 1
288 1 I2c_Start(); //启动总线
289 1 I2c_SendByte(sla); //发送器件地址
290 1 if(b_AckForIIC==0)return(0);
291 1 I2c_SendByte(suba); //发送器件子地址
292 1 if(b_AckForIIC==0)return(0);
293 1
294 1 I2c_Start();
295 1 I2c_SendByte(sla+1);
296 1 if(b_AckForIIC==0)return(0);
297 1
298 1 for(i=0;i<no-1;i++)
299 1 {
300 2 *s=I2c_RcvByte(); //发送数据
301 2 I2c_Ack(0); //发送就答位
302 2 s++;
303 2 }
C51 COMPILER V7.04 VIIC 03/04/2006 08:52:55 PAGE 6
304 1
305 1 *s=I2c_RcvByte();
306 1 I2c_Ack(1); //发送非应位
307 1
308 1 I2c_Stop(); //结束总线
309 1 return(1);
310 1 }
311
312
313
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 351 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 12
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 + -