📄 hello.lst
字号:
446 {uchar i;
447 1 TRcvAddress(0xa0,0,&bufdata[0],7);
448 1 for(i=0;i<6;i++)
449 1 {dispbuf[i]=bufdata[i];
450 2 }
451 1 } /*返回上一层程式*/
452 /******************************************************/
453 void write24c02() /*写24c02的存储值*/
454 {
455 1 TSendAddress(0xa0,0,dispbuf,7); /* 向有子地址器件写入6字节数据函数 */
456 1 }
457 /*******************************************************************/
458 // 24C02芯片读写 起动总线函数
459 //函数原型: void Start();
460 //功能: 启动总线,发送24c02启动条件.
461 //==================================================================
462 void Start()
463 {SDA=0;
464 1 nop;
465 1 nop;
466 1 SCL=0;
467 1 SDA=1; /*发送起始条件的数据信号*/
468 1 nop;
469 1 SCL=1;
470 1 nop; /*起始条件建立时间大于4.7us,延时*/
471 1 nop;
472 1 nop;
473 1 nop;
474 1 nop;
475 1 SDA=0; /*发送起始信号*/
476 1 nop; /* 起始条件锁定时间大于4us*/
477 1 nop;
478 1 nop;
479 1 nop;
480 1 nop;
481 1 SCL=0; /*钳住总线,准备发送或接收数据 */
482 1 nop;
483 1 nop;
484 1 SDA=1;
485 1 }
486 //==================================================================
487 // 结束总线函数
C51 COMPILER V7.07 HELLO 11/07/2006 19:17:04 PAGE 9
488 //函数原型: void Stop();
489 //功能: 结束总线,发送24c02结束条件.
490 //==================================================================
491 void Stop()
492 {
493 1 SCL=0;
494 1 SDA=0; /*发送结束条件的数据信号*/
495 1 nop; /*发送结束条件的时钟信号*/
496 1 SCL=1; /*结束条件建立时间大于4us*/
497 1 nop;
498 1 nop;
499 1 nop;
500 1 nop;
501 1 nop;
502 1 SDA=1; /*发送总线结束信号*/
503 1 nop;
504 1 nop;
505 1 nop;
506 1 nop;
507 1 SCL=0;
508 1 }
509 //==================================================================
510 // 89X52发数据或地址给24c02 字节数据发送函数
511 //函数原型: void SendByte(uchar c);
512 //功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
513 // 此状态位进行操作.(不应答或非应答都使acknow=0)
514 // 发送数据正常,acknow=1; acknow=0表示被控器无应答或损坏。
515 //==================================================================
516 void SendByte(uchar c)
517 { uchar count;
518 1 for(count=0;count<8;count++) /*要传送的数据长度为8位*/
519 1 {if((c<<count)&0x80)
520 2 SDA=1; /*判断发送位*/
521 2 else
522 2 SDA=0;
523 2 nop;
524 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
525 2 nop;
526 2 nop; /*保证时钟高电平周期大于4us*/
527 2 nop;
528 2 nop;
529 2 nop;
530 2 SCL=0;
531 2 }
532 1 nop;
533 1 nop;
534 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
535 1 nop;
536 1 nop;
537 1 SCL=1;
538 1 nop;
539 1 nop;
540 1 nop;
541 1 if(SDA==1)
542 1 acknow=0; /* 24c02无应答 */
543 1 else
544 1 acknow=1; /* 发送数据正常 */
545 1 SCL=0;
546 1 nop;
547 1 nop;
548 1 }
549 //==================================================================
C51 COMPILER V7.07 HELLO 11/07/2006 19:17:04 PAGE 10
550 // 89X52从24c02读数据字节数据接收函数
551 //函数原型: uchar RcvByte();
552 //功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
553 // 发完后请用应答函数应答从机。
554 //==================================================================
555 uchar RcvByte()
556 {uchar retc=0;
557 1 uchar count;
558 1 SDA=1; /*置数据线为输入方式*/
559 1 for(count=0;count<8;count++)
560 1 { nop;
561 2 SCL=0; /*置时钟线为低,准备接收数据位*/
562 2 nop;
563 2 nop; /*时钟低电平周期大于4.7us*/
564 2 nop;
565 2 nop;
566 2 nop;
567 2 SCL=1; /*置时钟线为高使数据线上数据有效*/
568 2 nop;
569 2 nop;
570 2 retc=retc<<1;
571 2 if(SDA==1)
572 2 retc=retc+1; /*读数据位,接收的数据位放入retc中 */
573 2 nop;
574 2 nop;
575 2 }
576 1 SCL=0;
577 1 nop;
578 1 nop;
579 1 return(retc);
580 1 }
581 //==================================================================
582 // 主机89X52应答子函数
583 //函数原型: void Ack(bit a);
584 //功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
585 //==================================================================
586 void Ack(bit a)
587 {if(a==0)
588 1 SDA=0; /*在此发出应答或非应答信号 */
589 1 else /* 应答 a=0 非应答 a=1 */
590 1 SDA=1;
591 1 nop;
592 1 nop;
593 1 nop;
594 1 SCL=1;
595 1 nop;
596 1 nop; /*时钟低电平周期大于4us*/
597 1 nop;
598 1 nop;
599 1 nop;
600 1 SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
601 1 nop;
602 1 nop;
603 1 }
604 //==================================================================
605 // 用户接口函数
606 // 有无子地址表示是否向芯片的特定地址写数据
607 // 向有子地址器件写入6字节数据函数 对应数据资料中的写模式
608 //函数原型: bit TSendAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no);
609 //功能: 从启动总线到发送从地址,子地址,数据,结束总线的全过程,从器件
610 // 地址slaaddress,子地址subaddress,发送内容是s指向的内容,no=字节数
611 // 如果返回1表示操作成功,否则操作有误。
C51 COMPILER V7.07 HELLO 11/07/2006 19:17:04 PAGE 11
612 //注意: 使用前必须已结束总线。
613 //==================================================================
614 bit TSendAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no) /* 向有子地址器件写入6字节数据函数
-*/
615 {
616 1 uchar i;
617 1 Start(); /*启动总线*/
618 1 SendByte(slaaddress); /*发送器件地址*/
619 1 if(acknow==0)
620 1 return(0);
621 1 SendByte(subaddress); /*发送器件子地址*/
622 1 if(acknow==0)
623 1 return(0);
624 1 for(i=0;i<no;i++)
625 1 {
626 2 SendByte(s[i]); /*发送数据*/
627 2 if(acknow==0)
628 2 return(0);
629 2 }
630 1 Stop(); /*结束总线*/
631 1 return(0);
632 1 }
633 //==================================================================
634 // 向有子地址器件读取4字节数据函数
635 //函数原型: bit TRcvAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no);
636 //功能: 从启动总线到发送从地址,子地址,读数据,结束总线的全过程,从器件
637 // 地址slaaddress,子地址subaddress,读出的内容放入s, no=字节数
638 // 如果返回1表示操作成功,否则操作有误。
639 //注意: 使用前必须已结束总线。
640 //==================================================================
641 bit TRcvAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no)
642 {
643 1 uchar i;
644 1 Start(); /*启动总线*/
645 1 SendByte(slaaddress); /*发送器件从地址*/
646 1 if(acknow==0)
647 1 return(0);
648 1 SendByte(subaddress); /*发送器件子地址*/
649 1 if(acknow==0)
650 1 return(0);
651 1 Stop(); /*结束总线*/
652 1 Start(); /*重新启动总线*/
653 1 SendByte(slaaddress+1);
654 1 if(acknow==0)
655 1 return(0);
656 1 for(i=0;i<no;i++)
657 1 {* s=RcvByte(); /*接收数据*/
658 2 Ack(0); /*发送应答位*/
659 2 s++;
660 2 }
661 1 * s=RcvByte(); /*接收数据*/
662 1 Ack(1);
663 1 Stop(); /*结束总线*/
664 1 return(1);
665 1 }
666 //******************************************************************
667 void service_int0 () interrupt 1 using 2 /*设定每隔3000us中断扫描一次数码管*/
668 {
669 1 ptr1++; /*扫描指标加1*/
670 1 TH0=(65536-2000)/256; /*每隔4000US扫描一次*/
671 1 TL0=(65536-2000)%256;
672 1 while (ptr1>5) ptr1=0; /*ptr1>5表示6个数码管都已经扫描过*/
C51 COMPILER V7.07 HELLO 11/07/2006 19:17:04 PAGE 12
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -