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

📄 i2c.lst

📁 使用显示芯片ZLG7290
💻 LST
📖 第 1 页 / 共 2 页
字号:
 168                  SubAddr:从机的子地址
 169                  SubMod:子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址
 170                  *dat:要发送的数据
 171                  Size:数据的字节数
 172          返回:
 173                  0:发送成功
 174                  1:在发送过程中出现异常
 175          说明:
 176                  本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
 177                  当从机没有子地址时,参数SubAddr任意,而SubMod应当为0
 178          -------------------------------------------------------------*/
 179          bit I2C_Puts
C51 COMPILER V8.05a   I2C                                                                  01/11/2008 12:42:15 PAGE 4   

 180          (
 181                  unsigned char SlaveAddr,
 182                  unsigned int SubAddr,
 183                  unsigned char SubMod,
 184                  char *dat,
 185                  unsigned int Size
 186          )
 187          {
 188   1      //定义临时变量
 189   1              unsigned char i;
 190   1              char a[3];
 191   1      //检查长度
 192   1              if ( Size == 0 ) return 0;
 193   1      //准备从机地址
 194   1              a[0] = (SlaveAddr << 1);          //0x38 * 2 = 0x70;
 195   1      //检查子地址模式
 196   1              if ( SubMod > 2 ) SubMod = 2;
 197   1      //确定子地址
 198   1              switch ( SubMod )
 199   1              {
 200   2              case 0:
 201   2                      break;
 202   2              case 1:
 203   2                      a[1] = (char)(SubAddr);
 204   2                      break;
 205   2              case 2:
 206   2                      a[1] = (char)(SubAddr >> 8);
 207   2                      a[2] = (char)(SubAddr);
 208   2                      break;
 209   2              default:
 210   2                      break;
 211   2              }
 212   1      //发送从机地址,接着发送子地址(如果有子地址的话)
 213   1              SubMod++;
 214   1              I2C_Start();
 215   1              for ( i=0; i<SubMod; i++ )
 216   1              {
 217   2                      I2C_Write(a[i]);
 218   2                      if ( I2C_GetAck() )             ///1 表示非应答;0 应答
 219   2                      {
 220   3                              I2C_Stop();
 221   3                              return 1;
 222   3                      }
 223   2              }
 224   1      //发送数据
 225   1              do
 226   1              {
 227   2                      I2C_Write(*dat++);
 228   2                      if ( I2C_GetAck() ) break;
 229   2              } while ( --Size != 0 );
 230   1      //发送完毕,停止I2C总线,并返回结果
 231   1              I2C_Stop();
 232   1              if ( Size == 0 )
 233   1              {
 234   2                      return 0;
 235   2              }
 236   1              else
 237   1              {
 238   2                      return 1;
 239   2              }
 240   1      }
 241          
C51 COMPILER V8.05a   I2C                                                                  01/11/2008 12:42:15 PAGE 5   

 242          /*-------------------------------------------------------------
 243          函数:I2C_Gets()
 244          功能:I2C总线综合接收函数,从从机接收多个字节的数据
 245          参数:
 246                  SlaveAddr:从机地址(7位纯地址,不含读写位)
 247                  SubAddr:从机的子地址
 248                  SubMod:子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址
 249                  *dat:保存接收到的数据
 250                  Size:数据的字节数
 251          返回:
 252                  0:接收成功
 253                  1:在接收过程中出现异常
 254          说明:
 255                  本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
 256                  当从机没有子地址时,参数SubAddr任意,而SubMod应当为0
 257          -------------------------------------------------------------*/
 258          bit I2C_Gets
 259          (
 260                  unsigned char SlaveAddr,
 261                  unsigned int SubAddr,
 262                  unsigned char SubMod,
 263                  char *dat,
 264                  unsigned int Size
 265          )
 266          {
 267   1      //定义临时变量
 268   1              unsigned char i;
 269   1              char a[3];
 270   1      //检查长度
 271   1              if ( Size == 0 ) return 0;
 272   1      //准备从机地址
 273   1              a[0] = (SlaveAddr << 1);
 274   1      //检查子地址模式
 275   1              if ( SubMod > 2 ) SubMod = 2;
 276   1      //如果是有子地址的从机,则要先发送从机地址和子地址
 277   1              if ( SubMod != 0 )
 278   1              {
 279   2              //确定子地址
 280   2                      if ( SubMod == 1 )
 281   2                      {
 282   3                              a[1] = (char)(SubAddr);
 283   3                      }
 284   2                      else
 285   2                      {
 286   3                              a[1] = (char)(SubAddr >> 8);
 287   3                              a[2] = (char)(SubAddr);
 288   3                      }
 289   2              //发送从机地址,接着发送子地址
 290   2                      SubMod++;
 291   2                      I2C_Start();
 292   2                      for ( i=0; i<SubMod; i++ )
 293   2                      {
 294   3                              I2C_Write(a[i]);
 295   3                              if ( I2C_GetAck() )
 296   3                              {
 297   4                                      I2C_Stop();
 298   4                                      return 1;
 299   4                              }
 300   3                      }
 301   2              }
 302   1      //这里的I2C_Start()对于有子地址的从机是重复起始状态
 303   1      //对于无子地址的从机则是正常的起始状态
C51 COMPILER V8.05a   I2C                                                                  01/11/2008 12:42:15 PAGE 6   

 304   1              I2C_Start();
 305   1      //发送从机地址
 306   1              I2C_Write(a[0]+1);
 307   1              if ( I2C_GetAck() )
 308   1              {
 309   2                      I2C_Stop();
 310   2                      return 1;
 311   2              }
 312   1      //接收数据
 313   1              for (;;)
 314   1              {
 315   2                      *dat++ = I2C_Read();
 316   2                      if ( --Size == 0 )
 317   2                      {
 318   3                              I2C_PutAck(1);
 319   3                              break;
 320   3                      }
 321   2                      I2C_PutAck(0);
 322   2              }
 323   1      //接收完毕,停止I2C总线,并返回结果
 324   1              I2C_Stop();
 325   1              return 0;
 326   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    449    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1      24
   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 + -