i2c.c

来自「51单片机上模拟i2c传输的程序」· C语言 代码 · 共 266 行

C
266
字号
#include <head.h>


uchar i2c_read_byte(uchar byte_add)
{
	uchar i,a,u,v;
	v=0;

	scl=1;
	sda=1;
	delay(10);
	sda=0;//start i2c;
	delay(15);

	for(i=0;i<8;i++)//transmit the dev write add
	{
	scl=0;
	delay(5);
	sda=((0xa0>>(7-i)) & 0x01);
	delay(5);
	scl=1;
	delay(15);
	}

	scl=0;//wait the ACK
	sda=1;

	a=20;
	while(sda&&a)//
	{a--;}

	if(a==0)
    {
	scl=1;
	return 0x55;
    }

	
    delay(10);
	scl=1;
	delay(15);
	scl=0;
	delay(20);

	for(i=0;i<8;i++)//transmit the byte add
	{
	scl=0;
	delay(5);
	sda=((byte_add>>(7-i)) & 0x01);
	delay(5);
	scl=1;
	delay(15);
	}

	scl=0;//wait the ACK
	sda=1;

	a=20;
	while(sda&&a)//
	{a--;}

	if(a==0)
    {
	scl=1;
	return 0x55;
    }

	
    delay(10);
	scl=1;
	delay(15);
	scl=0;
	delay(20);

    scl=1;
	sda=1;
	delay(30);
	sda=0;//start i2c;
	delay(15);

	for(i=0;i<8;i++)//transmit the dev read add
	{
	scl=0;
	delay(5);
	sda=((0xa1>>(7-i)) & 0x01);
	delay(10);
	scl=1;
	delay(15);
	}

	scl=0;//wait the ACK
	sda=1;

	a=20;
	while(sda&&a)//
	{a--;}

	if(a==0)
    {
	scl=1;
	return 0x55;
    }

	delay(10);
	scl=1;
	delay(15);
	scl=0;
	delay(20);

	sda=1;//read the byte
	delay(10);
	for(i=0;i<8;i++)
	{
	scl=0;
	delay(10);/////maybe require to adjust the interval to let the dev clock out data
	u=sda;
	v+=u<<(7-i);	
	delay(5);
	scl=1;
	delay(15);
	}

	scl=0;
	delay(10);
	sda=0;
	delay(20);

	scl=1;//stop i2c
	delay(5);
	sda=1;

    

	return v;
}
















uchar i2c_write_byte(uchar byte_add,uchar byte_data)
{
	uchar i,a;
	
	scl=1;
	sda=1;
	delay(10);
	sda=0;//start i2c;
	delay(15);

	for(i=0;i<8;i++)//transmit the dev write add
	{
	scl=0;
	delay(5);
	sda=((0xa0>>(7-i)) & 0x01);
	delay(5);
	scl=1;
	delay(15);
	}

	scl=0;//wait the ACK
	sda=1;

	a=20;
	while(sda&&a)//
	{a--;}

	if(a==0)
    {
	scl=1;
	return 0x55;
    }

	
    delay(10);
	scl=1;
	delay(15);
	scl=0;
	delay(20);

	for(i=0;i<8;i++)//transmit the byte add
	{
	scl=0;
	delay(5);
	sda=((byte_add>>(7-i)) & 0x01);
	delay(5);
	scl=1;
	delay(15);
	}

	scl=0;//wait the ACK
	sda=1;

	a=20;
	while(sda&&a)//
	{a--;}

	if(a==0)
    {
	scl=1;
	return 0x55;
    }

	
    delay(10);
	scl=1;
	delay(15);
	scl=0;
	delay(20);



	for(i=0;i<8;i++)//transmit the byte_data
	{
	scl=0;
	delay(5);
	sda=((byte_data>>(7-i)) & 0x01);
	delay(10);
	scl=1;
	delay(15);
	}

	scl=0;//wait the ACK
	sda=1;

	a=20;
	while(sda&&a)//
	{a--;}

	if(a==0)
    {
	scl=1;
	return 0x55;
    }

	
    delay(10);
	scl=1;
	delay(15);
	scl=0;
	delay(20);


	delay(15);//stop the bus
	sda=0;
	delay(10);
	scl=1;
	delay(10);
	sda=1;
	delay(20);

	return 1;
}

⌨️ 快捷键说明

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