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

📄 i2c_2.lst

📁 ADUC的周立功7290可以显示的程序
💻 LST
字号:
C51 COMPILER V8.02   I2C_2                                                                 08/13/2008 08:12:38 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE I2C_2
OBJECT MODULE PLACED IN i2c_2.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE i2c_2.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<ADuC845.h>
   2          
   3          #define I2C_SCL T1                  //T1,时钟位
   4          #define I2C_SDA T0                  //T0,数据位
   5          #define ZLGWR 0x70                  //ZLG7290的写地址
   6          #define ZLGRD 0x71                  //ZLG7290的读地址 
   7          
   8          /**********************************************************
   9          I2C时序的延时程序
  10          适用于aduc848,系统时钟为12.582912MHz时,for循环30次以上
  11          ***********************************************************/
  12          static void I2C_Delay_2()
  13          {
  14   1              char i;
  15   1              for(i=0;i<50;i++);
  16   1      }        
  17          
  18          
  19          
  20          /***********************************************************
  21          函数:I2C_Start()
  22          功能:产生I2C 总线的起始状态
  23          说明:
  24          SCL处于高电平期间,当SDA 出现下降沿时启动I2C 总线
  25          不论SDA 和SCL 处于什么电平状态,本函数总能正确产生起始状态
  26          本函数也可以用来产生重复起始状态
  27          本函数执行后,I2C 总线处于忙状态
  28          ***********************************************************/
  29          static void I2C_Start_2()
  30          {
  31   1              I2C_SDA = 1;
  32   1              I2C_Delay_2();
  33   1              I2C_SCL = 1;
  34   1              I2C_Delay_2();
  35   1              I2C_SDA = 0;
  36   1              I2C_Delay_2();
  37   1              I2C_SCL = 0;
  38   1              I2C_Delay_2();
  39   1      } 
  40          
  41          /***********************************************************
  42          函数:I2C_Write()
  43          功能:向I2C 总线写1 个字节的数据
  44          参数:
  45          dat:要写到总线上的数据
  46          ***********************************************************/
  47          static void I2C_Write_2(char dat)
  48          {
  49   1              unsigned char t = 8;
  50   1              do
  51   1              {
  52   2                      I2C_SDA = (bit)(dat & 0x80);
  53   2                      dat <<= 1;
  54   2                      I2C_SCL = 1;
  55   2                      I2C_Delay_2();
C51 COMPILER V8.02   I2C_2                                                                 08/13/2008 08:12:38 PAGE 2   

  56   2                      I2C_SCL = 0;
  57   2                      I2C_Delay_2();
  58   2              } while ( --t != 0 );
  59   1      } 
  60          
  61          /***********************************************************
  62          函数:I2C_Read()
  63          功能:从从机读取1 个字节的数据
  64          返回:读取的一个字节数据
  65          ***********************************************************/
  66          static char I2C_Read_2()
  67          {
  68   1              char dat=0;
  69   1              unsigned char t = 8;
  70   1              do
  71   1              {
  72   2                      I2C_SCL = 0;
  73   2                      I2C_Delay_2();
  74   2                      I2C_SCL = 1;
  75   2                      I2C_Delay_2();
  76   2                      dat <<= 1;
  77   2                      if ( I2C_SDA ) dat |= 0x01;
  78   2                      I2C_SCL = 0;
  79   2                      I2C_Delay_2();
  80   2              } while ( --t != 0 );
  81   1              return dat;
  82   1      }
  83          
  84          
  85          /***********************************************************
  86          函数:I2C_GetAck()
  87          功能:读取从机应答位
  88          返回:
  89          0:从机应答
  90          1:从机非应答
  91          说明:
  92          从机在收到每个字节的数据后,要产生应答位
  93          从机在收到最后1 个字节的数据后,一般要产生非应答位
  94          ***********************************************************/
  95          static bit I2C_GetAck_2()
  96          {
  97   1              bit ack;
  98   1              I2C_SDA = 1;
  99   1              I2C_Delay_2();
 100   1              I2C_SCL = 1;
 101   1              I2C_Delay_2();
 102   1              ack = I2C_SDA;
 103   1              I2C_SCL = 0;
 104   1              I2C_Delay_2();
 105   1              return ack;
 106   1      }        
 107          
 108          /********************************************************
 109          函数:I2C_PutAck()
 110          功能:主机产生应答位或非应答位
 111          参数:
 112          ack=0:主机产生应答位
 113          ack=1:主机产生非应答位
 114          说明:
 115          主机在接收完每一个字节的数据后,都应当产生应答位
 116          主机在接收完最后一个字节的数据后,应当产生非应答位
 117          *********************************************************/
C51 COMPILER V8.02   I2C_2                                                                 08/13/2008 08:12:38 PAGE 3   

 118          static void I2C_PutAck_2(bit ack)
 119          {
 120   1              I2C_SDA = ack;
 121   1              I2C_Delay_2();
 122   1              I2C_SCL = 1;
 123   1              I2C_Delay_2();
 124   1              I2C_SCL = 0;
 125   1              I2C_Delay_2();
 126   1      }       
 127          
 128          /***********************************************************
 129          函数:I2C_Stop()
 130          功能:产生I2C 总线的停止状态
 131          说明:
 132          SCL处于高电平期间,当SDA 出现上升沿时停止I2C 总线
 133          不论SDA 和SCL 处于什么电平状态,本函数总能正确产生停止状态
 134          本函数执行后,I2C 总线处于空闲状态
 135          ***********************************************************/
 136          static void I2C_Stop_2()
 137          {
 138   1              unsigned char t = 10;
 139   1              I2C_SDA = 0;
 140   1              I2C_Delay_2();
 141   1              I2C_SCL = 1;
 142   1              I2C_Delay_2();
 143   1              I2C_SDA= 1;
 144   1              I2C_Delay_2();
 145   1              while ( --t != 0 ); //在下一次产生Start 之前,要加一定的延时
 146   1      }  
 147          
 148          /***********************************************************
 149          功能:将I2C总线置于空闲状态,即将时钟线和数据线都拉高
 150          ***********************************************************/
 151          static void idle_2()
 152          {
 153   1         I2C_SCL=1;
 154   1         I2C_SDA=1;
 155   1      }
 156          
 157          /**********************************************************
 158          函数:I2C_Init_2()
 159          功能:I2C 总线初始化,使总线处于空闲状态
 160          说明:在main()函数的开始处,通常应当要执行一次本函数
 161          ***********************************************************/
 162          void I2C_Init_2()
 163          {
 164   1              I2C_SCL = 1;
 165   1              I2C_Delay_2();
 166   1              I2C_SDA = 1;
 167   1              I2C_Delay_2();
 168   1      }
 169          
 170          /***********************************************************
 171          函数:I2C_Puts_2()
 172          功能:I2C 总线综合发送函数,向从机发送多个字节的数据
 173          参数:
 174          SlaveAddr:从机地址(7 位纯地址,不含读写位)
 175          SubAddr:从机的子地址
 176          SubMod:子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址
 177          *dat:要发送的数据
 178          Size:数据的字节数
 179          返回:
C51 COMPILER V8.02   I2C_2                                                                 08/13/2008 08:12:38 PAGE 4   

 180          0:发送成功
 181          1:在发送过程中出现异常
 182          说明:
 183          本函数能够很好地适应所有常见的I2C 器件,不论其是否有子地址
 184          当从机没有子地址时,参数SubAddr 任意,而SubMod 应当为0
 185          ***********************************************************/
 186          bit I2C_Puts_2(unsigned char SlaveAddr,unsigned int SubAddr,unsigned char SubMod,char *dat,unsigned int Si
             -ze)
 187          {
 188   1              unsigned char i;                        //定义临时变量
 189   1              char a[3];
 190   1              if ( Size == 0 ) return 0;      //检查长度
 191   1              a[0] = (SlaveAddr << 1);        //准备从机地址
 192   1              if ( SubMod > 2 ) SubMod = 2;   //检查子地址模式
 193   1              switch ( SubMod )               //确定子地址
 194   1              {
 195   2                      case 0:break;
 196   2                      case 1:a[1] = (char)(SubAddr);break;
 197   2                      case 2:a[1] = (char)(SubAddr >> 8);a[2] = (char)(SubAddr);break;
 198   2                      default:break;
 199   2              }
 200   1              a[1] = (char)(SubAddr);
 201   1              SubMod++;                               //发送从机地址,接着发送子地址
 202   1              I2C_Start_2();
 203   1              for ( i=0; i<SubMod; i++ )
 204   1              {
 205   2                      I2C_Write_2(a[i]);
 206   2                      if ( I2C_GetAck_2() )
 207   2                      {
 208   3                              I2C_Stop_2();idle_2();
 209   3                              return 1;
 210   3                      }
 211   2              }
 212   1              do                              //发送数据
 213   1              {
 214   2                      I2C_Write_2(*dat++);
 215   2                      if ( I2C_GetAck_2() ) break;
 216   2              } while ( --Size != 0 );
 217   1              I2C_Stop_2();  idle_2();                //发送完毕,停止I2C 总线,并返回结果
 218   1              if ( Size == 0 ) return 0;
 219   1              else return 1;
 220   1      }
 221          
 222          /***********************************************************
 223          函数:I2C_gets_2()
 224          功能:I2C 总线综合接收函数,接收多个字节的数据
 225          参数:
 226          SubAddr:从机的子地址
 227          ***********************************************************/
 228          char I2C_gets_2(unsigned char subaddr)
 229          {
 230   1              char i,dat;
 231   1              I2C_Start_2();
 232   1              I2C_Write_2(ZLGWR);
 233   1              I2C_GetAck_2();
 234   1              I2C_Write_2(subaddr);
 235   1              I2C_SCL=1;
 236   1              for(i=0;i<2;i++){;}
 237   1              I2C_SCL=0;
 238   1              I2C_Stop_2();
 239   1              for(i=0;i<5;i++){;}
 240   1              I2C_Start_2();
C51 COMPILER V8.02   I2C_2                                                                 08/13/2008 08:12:38 PAGE 5   

 241   1              I2C_Write_2(ZLGRD);
 242   1              I2C_GetAck_2();
 243   1              dat=I2C_Read_2();
 244   1              I2C_PutAck_2(1);
 245   1              I2C_Stop_2();
 246   1              idle_2();
 247   1              return dat;
 248   1      }
 249          
 250          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    328    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      12
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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