📄 i2c_slaver.lst
字号:
562 1 {
563 2 if(TF0 == 1)
564 2 {
565 3 return;
566 3 }
567 2
568 2 }
569 1
570 1 SDA_LEVEL = SDA_PIN;//读SDA数据
571 1 if(SDA_LEVEL== 1)
572 1 {
573 2 *Recevie_Pointer |= 0x01;
574 2 *Recevie_Pointer =*Recevie_Pointer << 1;
575 2 }
576 1 else
577 1 {
578 2 *Recevie_Pointer &= 0xfe;
579 2 *Recevie_Pointer =*Recevie_Pointer << 1;
580 2 }
581 1 TH0 =0xed;//18.432MHz晶体,16位方式3ms
582 1 TL0 =0xef;
583 1 TF0 = 0;
584 1 while(CLK_PIN == 1)//等待CLK 的 1完成
585 1 {
586 2 if(TF0 == 1)
587 2 {
588 3 return;
589 3 }
590 2
591 2 }
592 1
593 1 TH0 =0xed;//18.432MHz晶体,16位方式3ms
594 1 TL0 =0xef;
595 1 TF0 = 0;
596 1 while(CLK_PIN == 0)//等待CLK 的0完成
597 1 {
598 2 if(TF0 == 1)
599 2 {
600 3 return;
601 3 }
602 2
603 2 }
604 1
605 1 SDA_LEVEL = SDA_PIN;//读SDA数据
606 1 if(SDA_LEVEL== 1)
607 1 {
608 2 *Recevie_Pointer |= 0x01;
609 2 *Recevie_Pointer =*Recevie_Pointer << 1;
610 2 }
611 1 else
612 1 {
613 2 *Recevie_Pointer &= 0xfe;
C51 COMPILER V7.50 I2C_SLAVER 03/02/2009 14:25:10 PAGE 11
614 2 *Recevie_Pointer =*Recevie_Pointer << 1;
615 2 }
616 1
617 1 TH0 =0xed;//18.432MHz晶体,16位方式3ms
618 1 TL0 =0xef;
619 1 TR0 = 1;
620 1 TF0 = 0;
621 1 while(CLK_PIN == 1)//等待CLK 的 1完成
622 1 {
623 2 if(TF0 == 1)
624 2 {
625 3 return;
626 3 }
627 2
628 2 }
629 1
630 1 TH0 =0xed;//18.432MHz晶体,16位方式3ms
631 1 TL0 =0xef;
632 1 TF0 = 0;
633 1 while(CLK_PIN == 0)//等待CLK 的0完成
634 1 {
635 2 if(TF0 == 1)
636 2 {
637 3 return;
638 3 }
639 2
640 2 }
641 1
642 1 SDA_LEVEL = SDA_PIN;//读SDA数据
643 1 if(SDA_LEVEL == 1)
644 1 {
645 2 *Recevie_Pointer |= 0x01;
646 2
647 2 }
648 1 else
649 1 {
650 2 *Recevie_Pointer &= 0xfe;
651 2 }
652 1
653 1 TH0 =0xed;//18.432MHz晶体,16位方式3ms
654 1 TL0 =0xef;
655 1 TF0 = 0;
656 1 while(CLK_PIN == 1)//等待CLK 的 1完成
657 1 {
658 2 if(TF0 == 1)
659 2 {
660 3 return;
661 3 }
662 2
663 2 }
664 1
665 1 //处理应答
666 1 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
667 1 SDA_PIN = 0;//应答
668 1
669 1 TH0 =0xed;//18.432MHz晶体,16位方式3ms
670 1 TL0 =0xef;
671 1 TF0 = 0;
672 1 while(CLK_PIN == 0)//等待应答的 CLK 的0完成
673 1 {
674 2 if(TF0 == 1)
675 2 {
C51 COMPILER V7.50 I2C_SLAVER 03/02/2009 14:25:10 PAGE 12
676 3 return;
677 3 }
678 2
679 2 }
680 1
681 1 TH0 =0xed;//18.432MHz晶体,16位方式3ms
682 1 TL0 =0xef;
683 1 TF0 = 0;
684 1 while(CLK_PIN == 1)//等待应答的CLK的1完成
685 1 {
686 2 if(TF0 == 1)
687 2 {
688 3 return;
689 3 }
690 2
691 2 }
692 1
693 1 SDA_PIN = 1;//完成应答,
694 1
695 1 //检测是否stop
696 1 TH0 =0xed;//18.432MHz晶体,16位方式3ms
697 1 TL0 =0xef;
698 1 TF0 = 0;
699 1 while(CLK_PIN == 0)//等待CLK 0 的完成
700 1 {
701 2 if(TF0 == 1)
702 2 {
703 3 return;
704 3 }
705 2
706 2 }
707 1 //CLK的0完成了, 接下来检测是否在1期间SDA有上升沿
708 1
709 1 TH0 =0xed;//18.432MHz晶体,16位方式3ms
710 1 TL0 =0xef;
711 1 TF0 = 0;
712 1 SDA_LEVEL= SDA_PIN;
713 1 if(SDA_LEVEL == 1)
714 1 {
715 2 SDA_LEVEL_BAK = 1;
716 2 while(CLK_PIN == 1)//如果 第一次就是1,肯定不是stop,等待1完
717 2 {
718 3 if(TF0 == 1)
719 3 {
720 4 return;
721 4 }
722 3 }
723 2 }
724 1 else//(SDA_LEVEL == 0)
725 1 {
726 2 SDA_LEVEL_BAK = 0;
727 2 while(CLK_PIN == 1)//等和读
728 2 {
729 3 if(TF0 == 1)
730 3 {
731 4 return;
732 4 }
733 3 SDA_LEVEL= SDA_PIN;
734 3
735 3 if(SDA_LEVEL == 1)//是stop
736 3 {
737 4 /*
C51 COMPILER V7.50 I2C_SLAVER 03/02/2009 14:25:10 PAGE 13
738 4 Recevie_Pointer--;
739 4 SBUF = *Recevie_Pointer;
740 4 while(TI == 0);
741 4 TI = 0;
742 4
743 4 *Recevie_Pointer = 0;
744 4
745 4 Recevie_Pointer++;
746 4 SBUF = *Recevie_Pointer;
747 4 while(TI == 0);
748 4 TI = 0;
749 4
750 4 *Recevie_Pointer = 0;*/
751 4 var = (Recevie_Pointer - SDA_DATA) + 1;//需要更新var给下一次中断Recevie_Byte()调用
752 4
753 4 Byte_var1= (Recevie_Pointer - SDA_DATA) ;//必须要的
754 4 //if(Byte_var1 >= 199)//就是0-199,返回到buffer开头放入数据
755 4 if(Byte_var1 >= (Buffer_Len - 1))
756 4 {
757 5 Buffer_Return = 1;//返回标记置位
758 5 var = 0;
759 5 }
760 4 return;
761 4 }
762 3 }
763 2
764 2 }
765 1 Recevie_Pointer++;
766 1 Byte_var1= (Recevie_Pointer - SDA_DATA) ;
767 1 //if(Byte_var1 > 199)//就是0-199(共200字节),返回到buffer开头放入数据
768 1 if(Byte_var1 > (Buffer_Len - 1))
769 1 {
770 2 Recevie_Pointer = SDA_DATA;
771 2 }
772 1 Recevie_Byte(Recevie_Pointer);
773 1 }
774
775
776
777 void INT0_SDA_INT(void) interrupt 0 using 1
778 {
779 1 /***************************************************
780 1
781 1 //SDA 下降沿产生 了我们看SCL 是否为1
782 1
783 1 //SDA --------\ /-----------\
784 1 \________/____________\____...........
785 1
786 1 //SCL--------------\ /------\
787 1 \______/ \______...........
788 1
789 1 *****************************************************/
790 1
791 1 //LED1 = !LED1; //已经进入中断
792 1
793 1 EX0 = 0;//关外部0 (SDA)中断
794 1 CLK_LEVEL = CLK_PIN;
795 1 if(CLK_LEVEL == 1)//SDA下降沿时SCL为1,说明I2C start开始了
796 1 {
797 2 //LED2 = 0;//是start
798 2 TH0 =0xed;//18.432MHz晶体,16位方式3ms
799 2 TL0 =0xef;
C51 COMPILER V7.50 I2C_SLAVER 03/02/2009 14:25:10 PAGE 14
800 2 TF0 = 0;
801 2 while(CLK_PIN == 1)//等待CLK 的start 1完成
802 2 {
803 3 if(TF0 == 1)
804 3 {
805 4 goto end;
806 4 }
807 3
808 3 }
809 2 Recevie_Byte1();
810 2 }
811 1 else
812 1 {
813 2 EX0 = 1;
814 2 //LED2 = 1;//不是start
815 2 }
816 1 end:
817 1 EX0 = 1;
818 1 //LED1 = 1;
819 1 }
820
821 #if 0
void T0_INT(void) interrupt 1 using 2
{
TH0 =0xed;//18.432MHz晶体,16位方式3ms,重装计数初值
TL0 =0xef;
}
#endif
829
830
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1539 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 3
IDATA SIZE = ---- ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -