📄 112211.lst
字号:
260 1 }
261
262 void IIC_Start(void)
263 {
264 1 SDA = 1; //初始化总线;
265 1 SCL = 1;
266 1 _nop_();_nop_();
267 1 SDA = 0; //启动总线;
268 1 _nop_();_nop_();
269 1 SCL = 0; //准备数据发送,启动IIC之后传输线全部置0;
270 1 }
271 /*******************************************************************************
272 *** 函 数 名: static void IIC_TxByte(int8u tx_byte)
273 *** 功能描述: 发送一个字节;
274 *** 全局变量: NO !
275 *** 输 入: tx_byte
276 *** 输 出: NO !
277 *** 创 建 人:huangtiexiong 日期:2006-11-28
278 *** 修 改 人: 日期:2006-11-28
279 *** 函数说明: 操作完成后保证SCL为0;
280 /******************************************************************************/
281 void IIC_TxByte(uchar tx_byte)
282 {//SDA:0; SCL:0.
283 1 uchar i;
284 1 for(i=0;i<8;i++)
285 1 {
286 2 if(tx_byte & 0x80)
287 2 SDA = 1; //因为Start函数中以把SCL拉低,数据直接发送;
288 2 else
289 2 SDA = 0;
290 2 tx_byte <<= 1; //因为发送顺序:由Msb——>Lsb;
291 2 SCL = 1;
292 2 _nop_();_nop_(); //延时;
293 2 SCL = 0;
294 2 }
295 1 }
296 /*******************************************************************************
297 *** 函 数 名: static bool IIC_WaitAck(void)
298 *** 功能描述: 发送一个字节;
299 *** 全局变量: NO !
300 *** 输 入: tx_byte
301 *** 输 出: NO !
C51 COMPILER V7.07 112211 01/31/2009 01:08:39 PAGE 6
302 *** 创 建 人:huangtiexiong 日期:2006-11-28
303 *** 修 改 人: 日期:2006-11-28
304 *** 函数说明: 操作完成后保证SCL为0;
305 /******************************************************************************/
306 bit IIC_WaitAck(void)
307 {//SDA:U; SCL:0.
308 1 uchar waitTime = 0xff; //设置Ack信号超时数;
309 1 SDA = 1; //将数据线拉高;
310 1 SCL = 1; //启动Ack脉冲;
311 1 _nop_();_nop_();
312 1 while(SDA)
313 1 {
314 2 waitTime--;
315 2 if(!waitTime)
316 2 {
317 3 SCL = 0; //SCL=0;
318 3 IIC_Stop();
319 3 return FALSE;
320 3 }
321 2 }
322 1 SCL = 0; //操作完成后确认SCL为0,此时SDA=0;
323 1 return TRUE;
324 1 }
325 /*******************************************************************************
326 *** 函 数 名: static int8u IIC_RxByte(void)
327 *** 功能描述: 接收一个字节;
328 *** 全局变量: NO !
329 *** 输 入: NO !
330 *** 输 出: 接收字节:tmp
331 *** 创 建 人:huangtiexiong 日期:2006-11-28
332 *** 修 改 人: 日期:2006-11-28
333 *** 函数说明: 操作完成后保证SCL为0;
334 /******************************************************************************/
335 uchar IIC_RxByte(void)
336 {//SDA:0; SCL:0;
337 1 uchar tmp = 0;
338 1 uchar i;
339 1 for(i=0;i<8;i++)
340 1 {
341 2 SCL = 0;
342 2 SDA = 1; //向I/O口写1后准备读入;
343 2 _nop_();_nop_();
344 2 SCL = 1;
345 2 _nop_();_nop_();
346 2 tmp <<= 1;
347 2 if(SDA)
348 2 {
349 3 tmp |= 0x01;
350 3 }
351 2 }
352 1 SCL = 0; //SCL=0;
353 1 return tmp;
354 1 }
355 /*******************************************************************************
356 *** 函 数 名: static void IIC_SendAck(void)
357 *** 功能描述: 发送应答信号;
358 *** 全局变量: NO !
359 *** 输 入: NO !
360 *** 输 出: NO !
361 *** 创 建 人:huangtiexiong 日期:2006-11-28
362 *** 修 改 人: 日期:2006-11-28
363 *** 函数说明: 操作完成后保证SCL为0;
C51 COMPILER V7.07 112211 01/31/2009 01:08:39 PAGE 7
364 /******************************************************************************/
365 void IIC_SendAck(void)
366 {
367 1 SDA = 0;
368 1 _nop_();_nop_();
369 1 SCL = 1;
370 1 _nop_();_nop_();
371 1 SCL = 0;
372 1 }
373 /*******************************************************************************
374 *** 函 数 名: static void IIC_SendNoAck(void)
375 *** 功能描述: 发送非应答信号;
376 *** 全局变量: NO !
377 *** 输 入: NO !
378 *** 输 出: NO !
379 *** 创 建 人:huangtiexiong 日期:2006-11-28
380 *** 修 改 人: 日期:2006-11-28
381 *** 函数说明: 操作完成后保证SCL为0;
382 /******************************************************************************/
383 void IIC_SendNoAck(void)
384 {
385 1 SDA = 1;
386 1 _nop_();_nop_();
387 1 SCL = 1;
388 1 _nop_();_nop_();
389 1 SCL = 0;
390 1 }
391 /*******************************************************************************
392 *** 函 数 名: static void IIC_Stop(void)
393 *** 功能描述: 终止IIC传输;
394 *** 全局变量: NO !
395 *** 输 入: NO !
396 *** 输 出: NO !
397 *** 创 建 人:huangtiexiong 日期:2006-11-28
398 *** 修 改 人: 日期:2006-11-28
399 *** 函数说明: 操作完成后保证SCL为1,同时打开中断;
400 /******************************************************************************/
401 void IIC_Stop(void)
402 {
403 1 SDA = 0; //to stop IIC;
404 1 SCL = 0;
405 1 _nop_();_nop_();
406 1 SCL = 1;
407 1 _nop_();_nop_();
408 1 SDA = 1; //IIC Stoped !! 结束IIC之后传输线全部置1;
409 1
410 1 }
411 /*******************************************************************************
412 *** 函 数 名: extern void PCF8583_ReadDat(int8u addrInter,int8u num,int8u *buff)
413 *** 功能描述: 对PCF8583读;
414 *** 全局变量: NO !
415 *** 输 入: addrInter:内部寻址;num:数据长度;buff:数据缓存;
416 *** 输 出: buff数据缓存;
417 *** 创 建 人:huangtiexiong 日期:2006-11-28
418 *** 修 改 人: 日期:2006-11-28
419 *** 函数说明: IIC Start至Stop间传输的字节数不限;
420 PCF8583内部寄存器地址附自增功能;
421 /******************************************************************************/
422 void PCF8583_ReadDat(uchar addrInter,uchar num,uchar *buff)
423 {
424 1 uchar i;
425 1 IIC_Start(); //启动IIC Bus;
C51 COMPILER V7.07 112211 01/31/2009 01:08:39 PAGE 8
426 1 IIC_TxByte(0xa0); //PCF8583设备寻址;命令:写;
427 1 IIC_WaitAck(); //等待Ack信号;
428 1 IIC_TxByte(addrInter); //发送内部寄存器地址;
429 1 IIC_WaitAck(); //等待Ack信号;
430 1
431 1 IIC_Start(); //参考PCF读Read Mode时序;
432 1 IIC_TxByte(0xa1); //PCF8583设备寻址,命令:读;
433 1 IIC_WaitAck();
434 1
435 1 for(i=0;i<num-1;i++)
436 1 {
437 2 buff[i] = IIC_RxByte(); //读一个字节;
438 2 IIC_SendAck(); //发送应答信号;
439 2 }
440 1 buff[num-1] = IIC_RxByte();
441 1 IIC_SendNoAck(); //最后一个字节发送非应答信号;
442 1 IIC_Stop(); //终止本次传输,IIC Bus空闲;
443 1 }
444 /*******************************************************************************
445 *** 函 数 名: extern void PCF8583_WriteDat(int8u addrInter,int8u num,int8u *buff)
446 *** 功能描述: 对PCF8583写;
447 *** 全局变量: NO !
448 *** 输 入: addrInter:内部寻址;num:数据长度;buff:数据缓存;
449 *** 输 出: NO !
450 *** 创 建 人:huangtiexiong 日期:2006-11-28
451 *** 修 改 人: 日期:2006-11-28
452 *** 函数说明: IIC Start至Stop间传输的字节数不限;
453 PCF8583内部寄存器地址附自增功能;
454 /******************************************************************************/
455 void PCF8583_WriteDat(uchar addrInter,uchar num,uchar *buff)
456 {
457 1 uchar i;
458 1
459 1 IIC_Start();
460 1 IIC_TxByte(0xa0);
461 1 IIC_WaitAck();
462 1
463 1 IIC_TxByte(addrInter);
464 1 IIC_WaitAck();
465 1
466 1 for(i=0;i<num;i++)
467 1 {
468 2 IIC_TxByte(buff[i]);
469 2 IIC_WaitAck();
470 2 }
471 1
472 1 IIC_Stop();
473 1 }
474 /*******************************************************************************
475 *** 函 数 名: extern void PCF8583_WriteByte(int8u addrInter,int8u val)
476 *** 功能描述: 对PCF8583写一个字节;
477 *** 全局变量: NO !
478 *** 输 入: addrInter:内部寻址;val:待写字节数据;
479 *** 输 出: NO !
480 *** 创 建 人:huangtiexiong 日期:2006-11-28
481 *** 修 改 人: 日期:2006-11-28
482 *** 函数说明: 参照PCF8583读时序;
483 /******************************************************************************/
484 void PCF8583_WriteByte(uchar addrInter,uchar val)
485 {
486 1 IIC_Start();
487 1
C51 COMPILER V7.07 112211 01/31/2009 01:08:39 PAGE 9
488 1 IIC_TxByte(0xa0);
489 1 IIC_WaitAck();
490 1
491 1 IIC_TxByte(addrInter);
492 1 IIC_WaitAck();
493 1 IIC_TxByte(val);
494 1 IIC_WaitAck();
495 1 IIC_Stop();
496 1 }
497
498
499 void main(void)
500 {
501 1 TIMERIni();
502 1 //ISendByte( PCF8583, 0x00, 0x08);
503 1 PCF8583_WriteByte(0x00,0x00);
504 1 while(1)
505 1 {
506 2 keyboard();
507 2 if(key>0)
508 2 {
509 3 menu();
510 3 }
511 2
512 2
513 2 }
514 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1257 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 34 19
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -