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

📄 i2c.c

📁 此程序为本人在公司开发的继电器功能测试仪
💻 C
字号:
  #include <intrins.h>
  #include "i2c.h"
  //typedef unsigned char byte;
  //bit WRITEBYTE(byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte DATABYTE);
  //bit READBYTE(byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte *DATABYTE);
  //bit WRITEDATAARRAY(byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte *DATABYTE);
  //bit READDATAARRAY(byte N,byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte *DATABYTE);
  //sbit SDA=0X90; //P1.0
  //sbit SCL=0X92; //P1.2
  //#define DELAY1US() _nop_();_nop_();_nop_();_nop_();_nop_()
  //#define DELAY2US() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
  //#define DELAY5US() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
  //void START_BIT(void);
  //void STOP_BIT(void);
  //bit SEND_BYTE(unsigned char BYTEVALUE);
  //unsigned char RECEIVE_BYTE(void);
  //void ACK(bit IFACK);
  /* 发送一个起始位 */
  void START_BIT(void)
  {
      SDA=1;
      DELAY1US();
      SCL=1;
      DELAY5US();
      SDA=0;
      DELAY5US();
      SCL=0;
      DELAY1US();
  }
  /*发送一个停止位*/
  void STOP_BIT(void)
  {
      SDA=0;
      DELAY1US();
      SCL=1;
      DELAY5US();
      SDA=1;
      DELAY5US();
      DELAY1US();
  }
  /* 发送一个字节,如果收到应答,返回1 */
  bit SEND_BYTE(byte BYTEVALUE)
  {
      byte BITMASK=0X80;
      byte i;
      bit ACK_BIT;
      for(i=0;i<8;i++)
      {
          SDA=(BYTEVALUE&BITMASK)?1:0;
	      DELAY1US();
	      SCL=1;
	      DELAY5US();
	      SCL=0;
	      BITMASK=BITMASK>>1;
      }
      DELAY2US();
      SDA=1;
      DELAY2US();
      SCL=1;
      DELAY2US();
      ACK_BIT=SDA?0:1;
      SCL=0;
      return(ACK_BIT);
  }
  /*接收一个字节*/
  byte RECEIVE_BYTE(void)
  {
      byte BITMASK=0X80;
      byte i;
      byte RETURNVALUE=0;
      for(i=0;i<8;i++)
      {
          SDA=1;
	      SCL=0;
	      DELAY5US();
	      SCL=1;
	      DELAY2US();
	      if(SDA) RETURNVALUE|=BITMASK;
	      BITMASK=BITMASK>>1;
      }
      SCL=0;
      return(RETURNVALUE);
  }
  /*发出应答信号*/
  void ACK(bit IFACK)
  {
      SDA=IFACK?1:0;
      DELAY2US();
      SCL=1;
      DELAY5US();
      SCL=0;
      DELAY2US();
  }
  /*写一个字节,如果成功,返回0;*/
  bit WRITEBYTE(byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte DATABYTE)
  {
      START_BIT();
      if(!SEND_BYTE(CON_ADDR)) return(1);
      if(!SEND_BYTE(UNIT_ADDR_H)) return(1);
      if(!SEND_BYTE(UNIT_ADDR_L)) return(1);
      if(!SEND_BYTE(DATABYTE)) return(1);
      STOP_BIT();
      return(0);
  }
  /*读一个字节,如果成功,返回0;*/
/*  bit READBYTE(byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte *DATABYTE)
  {
      START_BIT();
      if(!SEND_BYTE(CON_ADDR)) return(1);
	  if(!SEND_BYTE(UNIT_ADDR_H)) return(1);
      if(!SEND_BYTE(UNIT_ADDR_L)) return(1);
	  START_BIT();
      if(!SEND_BYTE(CON_ADDR|0X01)) return(1);
      *DATABYTE=RECEIVE_BYTE();
      ACK(0);
      STOP_BIT();
      return(0);
  }*/
  bit WRITEDATAARRAY(byte N,byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte *DATABYTE)
  {
      char i;
      START_BIT();
	  if(!SEND_BYTE(CON_ADDR)) return(1);
      if(!SEND_BYTE(UNIT_ADDR_H)) return(1);
      if(!SEND_BYTE(UNIT_ADDR_L)) return(1);
      for(i=0;i<N;i++)
	  {
	      if(!SEND_BYTE(*DATABYTE)) return(1);
          DATABYTE++;
	  }
	  STOP_BIT();
	  return(0);
  }
  bit READDATAARRAY(byte N,byte CON_ADDR,byte UNIT_ADDR_H,byte UNIT_ADDR_L,byte *DATABYTE)
  {
      char I;
      START_BIT();
	  if(!SEND_BYTE(CON_ADDR)) return(1);
	  if(!SEND_BYTE(UNIT_ADDR_H)) return(1);
      if(!SEND_BYTE(UNIT_ADDR_L)) return(1);
	  START_BIT();
      if(!SEND_BYTE(CON_ADDR|0X01)) return(1);
	  for(I=0;I<N;I++)
	  {
	      *DATABYTE=RECEIVE_BYTE();
		  if(I==N-1)
	      {
		      ACK(1);
		  }
          else ACK(0);
		  DATABYTE++;
	  }
	  STOP_BIT();
	  return(0);
  }

⌨️ 快捷键说明

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