📄 i2ctest.c
字号:
//************* Delay *********//
void delay(int n)
{
int i;
for(i=0;i<=n;i++)
{
_nop_();
}
}
//************* Delay N ms *********//
void delay_ms(int n)
{
int i,j;
for(i=0;i<=n;i++)
{
for(j=0;j<=31;j++) //** Delay 1 ms **//
{
_nop_();
}
}
}
//**************Start**********//
void I2C_start(void)
{
SDA=1;
SCL=1;
delay(3);
SDA=0;
delay(3);
SCL=0;
}
//*************Stop***********//
void I2C_stop(void)
{
SDA=0;
SCL=1;
delay(3);
SDA=1;
delay(3);
SCL=0;
}
//*************Ack**************//
void I2C_ack(void)
{
SDA=0;
SCL=1;
delay(3);
SCL=0;
SDA=1;
}
//*************No Ack*********//
void I2C_nack(void)
{
SDA=1;
SCL=1;
delay(3);
SCL=0;
SDA=0;
}
//*********Check ack signal*******//
bit I2C_Cack(void)
{
bit a;
SDA=1;
SCL=1;
delay(1);
a=SDA;
delay(1);
SCL=0;
delay(3);
if(a==1)
{
return 1;
}
else
{
return 0;
}
}
//**********Send a Bety*********//
void I2C_Send_byte(char da)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((da<<i)&0x80)
{
SDA=1; //send "1"//
SCL=1;
delay(3);
SCL=0;
SDA=0;
delay(3);
}
else
{
SDA=0; //send "0"//
SCL=1;
delay(3);
SCL=0;
delay(3);
}
}
}
//*************receive a byte *********//
unsigned char I2C_Receive_byte(void)
{
unsigned char i,da=0;
bit a;
for(i=0;i<8;i++)
{
SDA=1;
SCL=1;
delay(3);
a=SDA;
delay(3);
SCL=0;
if(a==1)
{
da=da<<1;
da=da|0x01;
}
else
{
da=da<<1;
}
}
return da;
}
//**********Send n bety ,n<16,page[0-7],add[0-255].error return 0********//
bit I2C_Send_Nbyte(unsigned char page,unsigned char add,unsigned char *buffer,unsigned char n)
{
unsigned char i;
I2C_start(); //send start//
I2C_Send_byte(page); //send address//
if(I2C_Cack()==1)
{
I2C_stop();
return 0;
}
I2C_Send_byte(add); //send data address//
if(I2C_Cack()==1)
{
I2C_stop();
return 0;
}
for(i=0;i<n;i++) //send data//
{
I2C_Send_byte(buffer[i]);
if(I2C_Cack()==1)
{
I2C_stop();
return 0;
}
}
I2C_stop(); //send stop//
return 1;
}
//***********receive n byte n<16,page[0-7],add[0-255],error return 0*********//
bit I2C_Receive_Nbyte(unsigned char page,unsigned char add,unsigned char *buffer,unsigned char n)
{
unsigned char i;
I2C_start(); //send start//
I2C_Send_byte(page); //send device address//
if(I2C_Cack()==1)
{
I2C_stop();
return 0;
}
I2C_Send_byte(add); //send data address//
if(I2C_Cack()==1)
{
I2C_stop();
return 0;
}
for(i=0;i<n;i++) //send data//
{
buffer[i]=I2C_Receive_byte();
if(i!=n)
{
I2C_ack();
}
else
{
I2C_nack();
}
}
I2C_stop(); //send stop//
return 1;
}
//********main************//
void main(void)
{ unsigned char i,j,k;
unsigned char code yuan[17]={0,1,2,3,4,5,6,7,8,9,10,11,13,13,14,15,16};
unsigned char tt[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
bit a=0;
SCON = 0x52;
TMOD=0x29;
TH1=0xfd;
TL1=0xfd; //** 9600 baud **//
TR1=1; //** start timer 1 **//
TI=1;
EA=1; //** Allow UART Int **//
printf("I1C Test\n");
led=0;
delay_ms(100);
/* for(i=0;i<8;i++)
{
for(j=0;j<0x10;j++)
{
I2C_Send_Nbyte(i,j*0x10,yuan,16);
delay_ms(10);
}
}
led=!led; */
delay_ms(200);
I2C_Receive_Nbyte(0x4,0xa0,tt,16);
delay_ms(100);
for(i=0;i<16;i++)
{
printf("%x,",tt[i]);
}
printf("\n");
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -