📄 i2c.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 + -