📄 jiankong.lst
字号:
536 2 _Nop();
537 2 SCL=1; //置时钟线为高,通知被控器开始接收数据位
538 2 _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); //保证时钟高电平周期大于4μs
539 2 SCL=0;
540 2 }
541 1 _Nop(); _Nop();
542 1 SDA=1; //8位发送完后释放数据线,准备接收应答位
543 1 _Nop(); _Nop();
C51 COMPILER V7.06 JIANKONG 05/07/2005 20:29:54 PAGE 10
544 1 SCL=1;
545 1 _Nop(); _Nop(); _Nop();
546 1 if(SDA==1) ack=0;
547 1 else ack=1; //判断是否接收到应答信号
548 1 SCL=0;
549 1 _Nop(); _Nop();
550 1 }
551
552 //////////////////////////////////////////////////////////////////////////
553 //字节数据接收函数原型: uchar RcvByte();
554 //功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
555 // 发完后请用应答函数。
556 ///////////////////////////////////////////////////////////////////////////
557 uchar RcvByte()
558 {
559 1 uchar retc = 0;
560 1 uchar BitCnt;
561 1
562 1 SDA=1; //置数据线为输入方式
563 1 for(BitCnt=0;BitCnt<8;BitCnt++)
564 1 {
565 2 _Nop();
566 2 SCL=0; //置时钟线为低,准备接收数据位
567 2 _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); //时钟低电平周期大于4.7μs
568 2 SCL=1; //置时钟线为高使数据线上数据有效
569 2 _Nop(); _Nop();
570 2 retc = retc<<1;
571 2 if(SDA==1) retc=retc+1; //读数据位,接收的数据位放入retc中
572 2 _Nop(); _Nop();
573 2 }
574 1 SCL=0;
575 1 _Nop(); _Nop();
576 1 return(retc);
577 1 }
578
579 ///////////////////////////////////////////////////////////////////////////
580 //应答子原型: void Ack_I2c(bit a);
581 //功能: 主控器进行应答信号,(可以是应答或非应答信号)
582 ////////////////////////////////////////////////////////////////////////////
583 void Ack_I2c(bit a)
584 {
585 1 if(a==0) SDA=0; //在此发出应答或非应答信号
586 1 else SDA=1;
587 1 _Nop(); _Nop(); _Nop();
588 1 SCL=1;
589 1 _Nop(); _Nop(); _Nop(); _Nop();_Nop(); //时钟低电平周期大于4μs
590 1 SCL=0; //清时钟线,钳住I2C总线以便继续接收
591 1 _Nop(); _Nop();
592 1 }
593
594 /////////////////////////////////////////////////////////////////////////
595 //向无子地址器件发送字节数据函数原型: bit ISendByte(uchar sla,ucahr c);
596 //功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
597 // 如果返回1表示操作成功,否则操作有误。
598 //注意: 使用前必须已结束总线。
599 /////////////////////////////////////////////////////////////////////////
600 bit ISendByte(uchar sla,uchar c)
601 {
602 1 Start_I2c(); //启动总线
603 1 SendByte(sla); //发送器件地址
604 1 if(ack==0) return(0);
605 1 SendByte(c); //发送数据
C51 COMPILER V7.06 JIANKONG 05/07/2005 20:29:54 PAGE 11
606 1 if(ack==0) return(0);
607 1 Stop_I2c(); //结束总线
608 1 return(1);
609 1 }
610
611 //////////////////////////////////////////////////////////////////////////////
612 //向无子地址器件读字节数据函数原型: bit IRcvByte(uchar sla,ucahr *c);
613 //功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
614 // 址sla,返回值在c.
615 // 如果返回1表示操作成功,否则操作有误。
616 //注意: 使用前必须已结束总线。
617 ///////////////////////////////////////////////////////////////////////////////
618 bit IRcvByte(uchar sla,uchar *c)
619 {
620 1 Start_I2c(); //启动总线
621 1 SendByte(sla+1); //发送器件地址
622 1 if(ack==0) return(0);
623 1 *c=RcvByte(); //读取数据
624 1 Ack_I2c(1); //发送非就答位
625 1 Stop_I2c(); //结束总线
626 1 return(1);
627 1 }
628
629 //////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
630 //watch dog
631 /*void x5045_outbyte(unsigned char wr_data)
632 {
633 unsigned char loop;
634 unsigned char tmp_x;
635 tmp_x=1;
636 for(loop=8;loop>0;loop--)
637 {
638 WD_SCK=0;
639 if((wr_data&(tmp_x<<(loop-1)))!=0)
640 {
641 WD_SI=1;
642 }
643 else
644 {
645 WD_SI=0;
646 }
647 WD_SCK=1;
648 }
649 WD_SI=0;
650 }
651 unsigned char x5045_inbyte(void)
652 {
653 unsigned char loop;
654 unsigned char tmp_x;
655 tmp_x=0;
656 for(loop=8;loop>0;loop--)
657 {
658 WD_SCK=1;
659 WD_SCK=0;
660 tmp_x<<=1;
661 if(WD_SO!=0)
662 {
663 tmp_x+=1;
664 }
665 }
666 return tmp_x;
C51 COMPILER V7.06 JIANKONG 05/07/2005 20:29:54 PAGE 12
667 }
668
669 void x5045_wren_cmd()
670 {
671 WD_SCK=0;
672 WD_CS=0;
673 x5045_outbyte(WREN);
674 WD_SCK=0;
675 WD_CS=1;
676 }
677
678 unsigned char x5045_rdsr_cmd()
679 {
680 unsigned char tmp_x;
681 WD_SCK=0;
682 WD_CS=0;
683 x5045_outbyte(RSDR);
684 tmp_x=x5045_inbyte();
685 WD_SCK=0;
686 WD_CS=1;
687 return tmp_x;
688 }
689
690 void x5045_wip_poll(void)
691 {
692 unsigned char loop;
693 unsigned char tmp_x;
694 for(loop=0;loop<MAX_POLL;loop++)
695 {
696 tmp_x=x5045_rdsr_cmd();
697 if((tmp_x&0x01)==0)
698 {
699 return;
700 }
701 }
702 }
703 void x5045_wrsr_cmd()
704 {
705 WD_SCK=0;
706 WD_CS=0;
707 x5045_outbyte(WRSR);
708 x5045_outbyte(STATUS_REG);
709 WD_SCK=0;
710 WD_CS=1;
711 x5045_wip_poll();
712 }*/
713
714 /*void x5045_page_write(unsigned int address,unsigned char *p,unsigned char number)
715 {
716 unsigned char loop;
717 unsigned char d1,d2;
718 unsigned char *k;
719 k=p;
720 WD_SCK=0;
721 WD_CS=0;
722 number&=0x1f;
723 d1=(address>>8)&0x01;
724 d1<<=3;
725 d1|=WRITE;
726 d2=(address&0x00ff);
727 x5045_outbyte(d1);
728 x5045_outbyte(d2);
C51 COMPILER V7.06 JIANKONG 05/07/2005 20:29:54 PAGE 13
729 for(loop=0;loop<number;loop++)
730 {
731 x5045_outbyte(*k);
732 k++;
733 }
734 WD_SCK=0;
735 WD_CS=1;
736 x5045_wip_poll();
737 return;
738 }
739
740 void x5045_page_read(unsigned int address,unsigned char *p,unsigned char number)
741 {
742 unsigned char loop;
743 unsigned char d1,d2;
744 unsigned char *k;
745 k=p;
746 WD_SCK=0;
747 WD_CS=0;
748 number&=0x1f;
749 d1=(address>>8)&0x01;
750 d1<<=3;
751 d1|=READ;
752 d2=(address&0x00ff);
753 x5045_outbyte(d1);
754 x5045_outbyte(d2);
755 for(loop=0;loop<number;loop++)
756 {
757 *k=x5045_inbyte();
758 k++;
759 }
760 WD_SCK=0;
761 WD_CS=1;
762 return;
763 }*/
764
765 /*void x5045_rst_wdog()
766 {
767 //WD_WP=1;
768 WD_CS=0;
769 WD_CS=1;
770 //WD_WP=1;
771 return;
772 }
773
774 /////////////////////
775 void x5045_initial()
776 {
777 //WD_WP=1;
778 WD_CS=1;
779 WD_SO=1;
780 WD_SCK=0;
781 WD_SI=0;
782 x5045_wren_cmd();
783 x5045_wrsr_cmd();
784 //WD_WP=1;
785 }*/
786
787
788
789
790
C51 COMPILER V7.06 JIANKONG 05/07/2005 20:29:54 PAGE 14
791
792
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1571 ----
CONSTANT SIZE = 1580 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 27 30
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 + -