⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c_sub.lst

📁 C51单片机模拟I2C双机通信协议
💻 LST
字号:
C51 COMPILER V7.50   I2C_SUB                                                               07/10/2007 21:26:01 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE I2C_SUB
OBJECT MODULE PLACED IN I2C_Sub.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE I2C_Sub.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include"stdafx.h"
   2          //#include"i2c_fun.h"
   3          //SDA p1.7  SCL p3.3
   4          #include"rt1602c_lcd.h"
   5          sbit SDA=P1^7;
   6          sbit SCL=P3^3;
   7          
   8          #define UP 1
   9          #define DOWN 0
  10          #define ACK 0
  11          #define FREE 1
  12          #define N 2
  13          #define SubAddr 0x5e
  14          
  15          void job(void);
  16          
  17          sbit P11=P1^1;
  18          
  19          bit I2CStart;
  20          //bit I2CStop;
  21          bit WorkFlag;
  22          bit I2CConnected;
  23          //uchar num;
  24          uchar ddata;
  25          uchar SorceData[2]={5,8};
  26          
  27          void main(void)
  28          {
  29   1              uchar temp,temp1,i,j;
  30   1              Delay400Ms();
  31   1              //LCMInit();
  32   1      
  33   1              EX1=1;EA=1;IT1=1;
  34   1      while(1){
  35   2              
  36   2      ReSet:
  37   2              
  38   2                      
  39   2              SDA=FREE;
  40   2              WorkFlag=0;
  41   2              I2CStart=I2CConnected=DOWN;
  42   2              
  43   2              while(I2CStart==DOWN){
  44   3              //job();
  45   3              if(WorkFlag)
  46   3                      {
  47   4                      WorkFlag=0;
  48   4                      while(SCL==0);
  49   4                      temp=SDA;
  50   4                      while(SCL==1);
  51   4                      temp1=SDA;
  52   4                      if(temp!=temp1)
  53   4                              if(temp==1 && temp1==0) I2CStart=UP;
  54   4                      }
  55   3              }
C51 COMPILER V7.50   I2C_SUB                                                               07/10/2007 21:26:01 PAGE 2   

  56   2              ddata=j=0; 
  57   2              for(i=0;i<8;i++)
  58   2                      {
  59   3                      while(WorkFlag==0);
  60   3                      WorkFlag=0;
  61   3                      while(SCL==0); 
  62   3                      temp=SDA;
  63   3                      ddata=(ddata<<1) | temp;
  64   3                      }
  65   2              
  66   2              if((ddata/2)==(SubAddr/2)) I2CConnected=UP;
  67   2                      else {I2CConnected=DOWN;I2CStart=DOWN;goto ReSet;}
  68   2      
  69   2              while(WorkFlag==0);WorkFlag=0;
  70   2              SDA=ACK;
  71   2              while(WorkFlag==0);
  72   2              SDA=FREE;
  73   2              //WorkFlag=0;
  74   2      
  75   2              if(ddata&0x01)
  76   2                      {//主read
  77   3                      while(1){
  78   4                      
  79   4      //              Resent:
  80   4                      for(i=0;i<8;i++)
  81   4                              {
  82   5                              while(WorkFlag==0);
  83   5                              SDA=(SorceData[j]&0x80);
  84   5                              WorkFlag=0;
  85   5                              
  86   5                              SorceData[j]=SorceData[j]<<1; 
  87   5                              }
  88   4                      while(WorkFlag==0);
  89   4                      SDA=FREE;
  90   4                      WorkFlag=0;
  91   4                      while(SCL==0);
  92   4                      temp=SDA;
  93   4                      if((temp==0)) goto Next;
  94   4                              else {goto ReSet;}  //若主机产生NOT ACK信号时默认结束
  95   4                      Next:
  96   4                      /*while(WorkFlag==0);
  97   4                      WorkFlag=0;
  98   4                      while(SCL==0);
  99   4                      temp=SDA;
 100   4                      while(SCL==1);
 101   4                      if(SDA!=temp) {I2CStart=DOWN;I2CConnected=DOWN;goto ReSet;}     */      
 102   4                      j++;
 103   4                      j=j%N;
 104   4                      }
 105   3                      
 106   3                      }
 107   2              else
 108   2                      {//主write
 109   3      //               Receive:
 110   3                       //P1=0x55;while(1);
 111   3                       while(1){
 112   4                       temp=0;
 113   4                       
 114   4                       //while(WorkFlag==0);WorkFlag=0;
 115   4                       while(SCL==0);
 116   4                       temp=SDA;
 117   4                       while(SCL==1);
C51 COMPILER V7.50   I2C_SUB                                                               07/10/2007 21:26:01 PAGE 3   

 118   4                       if(temp!=SDA) break; 
 119   4                       for(i=1;i<8;i++)
 120   4                              {
 121   5                              while(WorkFlag==0);WorkFlag=0;
 122   5                              while(SCL==0);
 123   5                              temp=(temp<<1) | SDA;
 124   5      
 125   5                              }
 126   4                      while(WorkFlag==0);WorkFlag=0;
 127   4                      SDA=ACK;
 128   4                      while(WorkFlag==0);WorkFlag=0;
 129   4                      SDA=FREE;
 130   4                      SorceData[j]=temp;
 131   4                      j++;j=j%N;
 132   4                      //P1=temp;while(1);
 133   4      
 134   4                      }               
 135   3                      P1=SorceData[0];
 136   3                      //DisplayOneChar(0,0,SorceData[0]|0x30);
 137   3                      //DisplayOneChar(0,0,SorceData[1]|0x30);
 138   3                      break;
 139   3                      }
 140   2      
 141   2      }
 142   1              LCMInit();
 143   1              DisplayOneChar(0,0,SorceData[0]|0x30);
 144   1      }
 145          
 146          
 147          void negtive(void) interrupt 2
 148                  {
 149   1      //       bit i2c_temp;
 150   1               WorkFlag=1;
 151   1               return;
 152   1              }
 153          
 154          
 155          
 156          
 157          /*
 158                   while(SCL==0);
 159                   i2c_temp=SDA;
 160                   while(SCL==high);
 161                   if(i2c_temp!=SDA)
 162                          if((i2c_temp==high)&&(SDA==low)) {i2cstart=UP;num=1;}
 163                                  else i2cstop = DOWN;
 164                  else {ddata=ddata<<1 |i2c_temp;num++;}
 165          
 166                  } */


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    595    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3      13
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -