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

📄 i2c.h

📁 华帮单片机双串口工作代码
💻 H
字号:

#include "define_W77E058.h"
 void Stop_I2C();
// void write_I2C(unsigned char,unsigned char);
#define WriteI2C 0xA0 //24C02的写地址
#define ReadI2C  0xA1//24C02的读地址
 extern bit SDA,SCL;
 #define NOP _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); 
 extern void delayms(unsigned int);
 extern void Disdata(unsigned char);
 //unsigned char Read_I2C(unsigned char);
/****************************************************************************************************************************/
// I2C 
/********************************************************************************************************************************/
 void Initial_I2C()
 {  SCL=0; Stop_I2C(); }
/****************************************************************************************************************************/
/****************************************************************************************************************************/
// I2C is sounding 
/********************************************************************************************************************************/
 void Start_I2C()
{ NOP;SDA=1;//发送起始条件资料信号
  NOP;SCL=1;//发送起始条件资料信号
  NOP;  //起始建立时间大于4.7S
 while(SDA==1)SDA=0;
  NOP; SCL=0;//钳位
  NOP;
 }
/************************************************************************************************/
//I2c 停止数据
/**************************************************************************/
 void Stop_I2C()
{ SDA=0;//发送结束条件信号
  NOP;SCL=1;NOP;while(SDA==0)SDA=1;
  NOP;SCL=0;//钳定I2C
  NOP;
}

/************************************************************************************************/
//I2c 发送数据
/**************************************************************************/
 void SendByte_I2C(unsigned char C)
 {unsigned char idata Bitcnt;
 for(Bitcnt=0;Bitcnt<8;Bitcnt++)
  {if((C&0x80)==0x80)SDA=1;
  else SDA=0;NOP;SCL=1;NOP;SCL=0; C=C<<1;}
   SDA=1;
}

/******************************************/
//I2c 接收数据
/******************************************/
 unsigned char ReceiveByte_I2C()
{
 unsigned char idata retc;
 unsigned char idata Bitcnt;
 retc=0;
 for(Bitcnt=0;Bitcnt<8;Bitcnt++) { NOP;SCL=1; NOP;retc=retc<<1;
 if(SDA)retc=retc+1; NOP; SCL=0; }  NOP;//retc=0x23;
 return retc;
}

/*********************************************************************************/
//I2c ACKnolege已经接收到数据
/*******************************************************************************/
 void Ack_I2C(bit a)
{  if(!a)SDA=0;else SDA=1;NOP;NOP;SCL=1;NOP;NOP;SCL=0;NOP;}

/*********************************************************************************/
//I2c 检查确认位
/*************************************************************************************/
 bit waitack()
 { 
  unsigned char i;
  i=255;
  NOP; NOP; SCL=1;
  while(SDA)
 { NOP;i--;if(i==0)return 1; }
  SCL=0;
  return 0;
}

/*********************************************************************************/
//I2c 向指定的工作区间发送1个数据
/*************************************************************************************/
 bit write_I2C(unsigned char address,unsigned char c)
{
  unsigned char i;
  Start_I2C(); 
  SendByte_I2C(WriteI2C);
  i=255;
  if(waitack())
 {  i--; delayms(10);if(i==0){Disdata(10);Disdata(0);Disdata(0);Disdata(10);Disdata(1);while(CheckError);delayms(20);while(!CheckError);return 0;}}//发送I2C地址失败时,显示A0
    SendByte_I2C(address);
   i=255;
  if(waitack())
  { i--; delayms(10);if(i==0){Disdata(10);Disdata(1);Disdata(0); Disdata(10);Disdata(1);while(CheckError);delayms(20);while(!CheckError);return 0;}}//发送I2C子地址失败时,显示A1
  SendByte_I2C(c);//送存储数据
  i=255;
  if(waitack())
  { i--; delayms(10);if(i==0){Disdata(10);Disdata(1);Disdata(0);Disdata(10);Disdata(1);while(CheckError);delayms(20);while(!CheckError);return 0;}}//发送I2C地址失败时,显示A2
  Stop_I2C();
  return 1;
}

/*********************************************************************************/
//I2c 向指定的工作区间读1数据
/***********************************************************************************/
 unsigned char read_I2C(unsigned char address)
{
  unsigned char I2Cdata,i;
  Start_I2C(); 
  SendByte_I2C(WriteI2C);//先进行伪写操作
 i=255;
  if(waitack()){i--; delayms(10);if(i==0){ Disdata(11);Disdata(0);Disdata(0);Disdata(11);Disdata(0); while(CheckError);delayms(20);while(!CheckError);return 0;}}
  //发送I2C读芯片地址失败时,显示B0
  
  SendByte_I2C(address);
  i=255;
 if(waitack()){i--; delayms(10);if(i==0){ Disdata(11);Disdata(1);Disdata(0);Disdata(11);Disdata(0);while(CheckError);delayms(20);while(!CheckError);return 0;}}//发送I2C读子地址失败时,显示B1
  Start_I2C();//重新开始
  SendByte_I2C(ReadI2C);
   i=255; 
  if(waitack()){i--; delayms(10);if(i==0){ Disdata(12);Disdata(2);Disdata(0);Disdata(12);Disdata(0);while(CheckError);delayms(20);while(!CheckError);return 0;}}//发送I2C读芯片地址失败时,显示C0
   
  I2Cdata=ReceiveByte_I2C();//读数据
   Ack_I2C(1);//发送结束信号,应该先发1
   Stop_I2C();
   return I2Cdata;
}


/*extern void Write_RTC()
{

  Start_I2C();Stop_I2C();
  
  Start_I2C();
  SendByte_I2C(0x64);//写器件地址

  while(waitack()){ Disdata(1); Disdata(10);Disdata(0);Disdata(0);Disdata(0);  return; } //寻址failure-A1

  SendByte_I2C(0x00);
  while(waitack()){ Disdata(2);Disdata(10);Disdata(0);Disdata(0);Disdata(0); return;}//写模式的地址
 
  SendByte_I2C(0x01);//写秒寄存器
 while(waitack()){ Disdata(3);Disdata(10);Disdata(0);Disdata(0);Disdata(0); return;}//

 SendByte_I2C(0x46);//写分寄存器
 while(waitack()){ Disdata(4);Disdata(10);Disdata(0);Disdata(0);Disdata(0);return;}//
 //if(Settime==0){while(SetMinute==0);delayms(20);while(SetMinute);count++; goto Set;}

 SendByte_I2C(0x15);//写时寄存器
 while(waitack()){Disdata(5);Disdata(10);Disdata(0);Disdata(0);Disdata(0); return;}//
 
 SendByte_I2C(0x02);//写周寄存器
 while(waitack()){Disdata(6);Disdata(10);Disdata(0);Disdata(0);Disdata(0);return; }//


 SendByte_I2C(0x22);//写天寄存器
 while(waitack()){Disdata(7);Disdata(10);Disdata(0);Disdata(0);Disdata(0);return; }//

 SendByte_I2C(0x08);//写月寄存器
 while(waitack()){Disdata(8);Disdata(10);Disdata(0);Disdata(0);Disdata(0);return;}//

 SendByte_I2C(0x08);//写年寄存器
 while(waitack()){ Disdata(9);Disdata(10);Disdata(0);Disdata(0);Disdata(0);return; }//

 SendByte_I2C(0x07);//
 while(waitack()){Disdata(0);Disdata(10);Disdata(0);Disdata(0);Disdata(0); return;}//
 Stop_I2C();
 
}
/**********************************************************/
//Read  I2C
/*************************************************/
/*extern unsigned char Read_RTC(unsigned char addr1)//地址的后四位必须是为0100
{
  unsigned char ad ,i;
  Start_I2C();Stop_I2C();ad=0;Start_I2C();
  SendByte_I2C(0x64);
  i=255;
  while(waitack()){ i--; delayms(10);if(i==0){ Disdata(0);Disdata(11);Disdata(0);Disdata(0);Disdata(0);
  return 0; } }//
 SendByte_I2C(addr1);
  i=255;
  while(waitack()){ i--; delayms(10);if(i==0){ Disdata(2);Disdata(11);Disdata(2);Disdata(11);Disdata(11);
  return 0; } }
 ad=ReceiveByte_I2C();
 Ack_I2C(1);
 Stop_I2C();
 Disdata(12);Disdata(12);Disdata(12);Disdata(12);Disdata(12);
 return ad;
}

*/
/*********************************************************************************/
//I2c 向指定的工作区间发送n个数据
/*************************************************************************************/
/*extern bit Write_N_I2C(unsigned char address,unsigned char idata *c,unsigned char n)//n小于16
{
  unsigned char data i,j;
  Start_I2C(); 
  SendByte_I2C(WriteI2C);
   i=255;
  if(waitack()){i--;delayms(10);if(i==0) { Disdata(10);Disdata(0);Disdata(0);Disdata(10);Disdata(1);return 0;}}//发送I2C地址失败时,显示A0
  

   SendByte_I2C(address);
   i=255;
  if(waitack())
   { i--; delayms(10);if(i==0){ Disdata(10);Disdata(1);Disdata(0); Disdata(10);Disdata(1);return 0;}}//发送I2C子地址失败时,显示A1
  
  for(i=0;i++;(i<16||i<n))
  { //11
  SendByte_I2C(c[i]);//送存储数据
  j=255;
  if(waitack()){ j--; delayms(10);if(j==0){  Disdata(10);Disdata(1);Disdata(0);Disdata(10);Disdata(1);;return 0;} }//发送I2C地址失败时,显示A2
   }//11
 
  Stop_I2C();
  return 1;
}
*/
/*********************************************************************************/
//I2c 向指定的工作区间读1数据
/***********************************************************************************/
/*extern unsigned char *Read_N_I2C(unsigned char address,unsigned char n)
{
  unsigned char idata *I2Cdata;
  unsigned char data i;
 
  Start_I2C(); 
  SendByte_I2C(WriteI2C);//先进行伪写操作
 
  if(waitack()){ Disdata(11);Disdata(0);Disdata(0);Disdata(11);Disdata(0); delayms(20);return 0;}//发送I2C读芯片地址失败时,显示B0
  SendByte_I2C(address);
 if(waitack()){ Disdata(11);Disdata(0);Disdata(0);Disdata(11);Disdata(0);delayms(20);return 0;}//发送I2C读地址失败时,显示B1
  
  Start_I2C();//重新开始
  SendByte_I2C(ReadI2C);
    
  if(waitack()){ Disdata(12);Disdata(0);Disdata(0);Disdata(12);Disdata(0);delayms(20);return 0;}//发送I2C读芯片地址失败时,显示C0
   for(i=0;i++;(i<16||i<n))
  {
   I2Cdata[i]=ReceiveByte_I2C();//读数据
  if(i==15||i==n-1){ Ack_I2C(1); Stop_I2C(); return I2Cdata;}//发送结束信号,应该先发1
  else Ack_I2C(0);
   }
}

*/

⌨️ 快捷键说明

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