📄 i2c.h
字号:
#ifndef _I2C_2007_9_2_
#define _I2C_2007_9_2_
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^0;
sbit SDA=P2^1;
void delay(uchar n)
{
uint i;
for(;n>0;n--)
for(i=0;i<6000;i++);
}
/*启动I2C总线*/
void sta()
{
SDA=1;
SCL=1;
_nop_();
SDA=0;
_nop_();
SCL=0;
}
void stop( )/*停止I2C总线*/
{
SDA=0;
SCL=1;
delay(1);
SDA=1;
delay(1);
}
void mack( )/*发送应答位*/
{
SDA=0;
SCL=1;
_nop_();
SCL=0;
SDA=1;
}
void mnack( )/*发送非应答位*/
{
SDA=1;
SCL=1;
_nop_();
SCL=0;
SDA=0;
}
void cack( )/*应答位检查*/
{
SDA=1;
SCL=1;
F0=0;
if(SDA==1)
F0=1;
SCL=0;
_nop_( );
}
/*向虚拟I2C总线上发送1个数据字节*/
void wrbyt(uchar shu)
{
uchar i;
for(i=0;i<8;i++)
{
if((shu&0x80)>0)
{
SDA=1;
SCL=1;
_nop_();
SCL=0;
}
else
{
SDA=0;
SCL=1;
_nop_();
SCL=0;
}
shu=shu<<1;
}
}
/*从I2C总线上读取1个数据字节*/
uchar rdbyt( )
{
uchar nn=0xff,mm=0x80,uu=0x7f;
uchar j;
for(j=0;j<8;j++)
{
SDA=1;
SCL=1;
if(SDA==0)
{nn=(nn&uu);}
else
{nn=(nn|mm);}
nn=_crol_(nn,1);
SCL=0;
}
return(nn);
}
void wrnbyta(uchar slaw,uchar gg[],uchar n)
{
do
{
sta( );
wrbyt(slaw);
cack( );
}
while(F0==1);
wrbyt(gg[n]);
cack( );
}
/*向虚拟I2C总线上发送n个字节的数据
参数:写命令字、需要写到总线的数据、写数据长度
ff[]:前两个字节分别为高地址、低地址、接着是数据,其中数据长度=地址+数据
*/
void wrnbyt(uchar slaw,uchar ff[],uchar number)
{
uchar idata k;
do
{
sta( );
wrbyt(slaw);
cack( );
}
while(F0==1);
for(k=0;k<number;k++)
{
wrbyt(ff[k]);
cack( );
while(F0==1)
wrnbyta(slaw,ff,k);
}
stop( );
}
/*从虚拟I2C总线上读取n个字节的数据
前提:已初始化读取的首地址
参数:读命令字、保存数组、读取字节数
*/
void rdnbyt(uchar slar,uchar qq[],uchar number)
{
uchar idata data0,l;
do
{
sta( );
wrbyt(slar);
cack( );
}
while(F0==1);
for(l=0;l<number-1;l++)
{
data0=rdbyt( );
qq[l]=data0;
mack( );
}
data0=rdbyt( );
qq[l]=data0;
mnack( );
stop( );
}
//读任意地址单元数据
//参数:高地址、低地址
char eeprom_read(uchar addr_h,uchar addr_l)
{
char a[2],temp[1];
a[0]=addr_h;
a[1]=addr_l;
wrnbyt(0xa0,a,2);
rdnbyt(0xa1,temp,1);
return(temp[0]);
}
//写一字节到任意单元
void eeprom_write(uchar addr_h,uchar addr_l,uchar data1)
{
char a[3];
a[0]=addr_h;
a[1]=addr_l;
a[2]=data1;
wrnbyt(0xa0,a,3);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -