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

📄 24c01-16.c

📁 I2C程序,自动反页
💻 C
字号:
//24c01-24c16读写驱动程序,

#include <intrins.h>
#include <REG764.H>
#define	i2c_addr 0xa0	//器件地址 如有须要可作为外变量

sbit SDA=P1^3;
sbit SCL=P1^2;

sbit a0=ACC^0;
sbit a1=ACC^1;
sbit a2=ACC^2;
sbit a3=ACC^3;
sbit a4=ACC^4;
sbit a5=ACC^5;
sbit a6=ACC^6;
sbit a7=ACC^7;

void I2C_s(void) {_nop_();SCL=0;SDA=1;SCL=1;_nop_();SDA=0;_nop_();SCL=0;}
void I2C_p(void) {SDA=0;SCL=1;_nop_();SDA=1;}

/*
unsigned char I2C_r(bit i)
{
	unsigned char s,dat=0;
	SDA=1;
	for(s=0;s<8;s++)
	{
		SCL=1;
		if(SDA) dat++;
		dat<<=1;
		SCL=0;
	}
	if(i)	SDA=0;
	else	SDA=1;
	SCL=1;SCL=0;
	return(dat);
}
*/

unsigned char I2C_r(bit i)
{
	SDA=1;
	SCL=1;a7=SDA;SCL=0;
	SCL=1;a6=SDA;SCL=0;
	SCL=1;a5=SDA;SCL=0;
	SCL=1;a4=SDA;SCL=0;
	SCL=1;a3=SDA;SCL=0;
	SCL=1;a2=SDA;SCL=0;
	SCL=1;a1=SDA;SCL=0;
	SCL=1;a0=SDA;SCL=0;
	if(i)	SDA=0;
	else	SDA=1;
	SCL=1;SCL=0;
	return(ACC);
}

/*
void I2C_w(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		if(dat&0x80) SDA=1;
		else	     SDA=0;
		SCL=1; SCL=0;
		dat<<=1;
	}
	SDA=1;SCL=1;
}
*/

void I2C_w(unsigned char dat)
{
	ACC=dat;
	SDA=a7;SCL=1;SCL=0;
	SDA=a6;SCL=1;SCL=0;
	SDA=a5;SCL=1;SCL=0;
	SDA=a4;SCL=1;SCL=0;
	SDA=a3;SCL=1;SCL=0;
	SDA=a2;SCL=1;SCL=0;
	SDA=a1;SCL=1;SCL=0;
	SDA=a0;SCL=1;SCL=0;
	SDA=1;SCL=1;
}

void I2C_delay(unsigned char addr)
{
	unsigned char i,s=0;
	while(1)
	{
		I2C_s();		//启动总线
		I2C_w(i2c_addr|addr);
		if(SDA==0) break;	//有应答返回
		if(s>50)   break;	//EEPROM器件损坏返回
 		for(i=100;i;i--);	//延时200us
		s++; SCL=0;
	}
	SCL=0; I2C_s();			//结束总线
}

unsigned char I2C_qut(unsigned int address)
{
	unsigned char dat;
	dat=((address&0x77f)/128);
	I2C_s();
	I2C_w(i2c_addr|dat); SCL=0;
	I2C_w(address);	     SCL=0;
	return dat;
}
unsigned char I2C_read(unsigned int address)	//读取字节
{
	unsigned char dat;
	dat=I2C_qut(address);
	I2C_s();
	I2C_w((i2c_addr+1)|dat); SCL=0;
	dat=I2C_r(0);
	I2C_p();
	return dat;
}

void I2C_write(unsigned int address,unsigned char da)	//写入字节
{
	unsigned char dat;
	dat=I2C_qut(address);
	I2C_w(da);	SCL=0;
	I2C_p();
	I2C_delay(dat);
}

void I2C_write_much(unsigned int address,unsigned char *da,unsigned char s)	//写入多字节
{
	unsigned char dat;
	dat=I2C_qut(address);
	while(s--) { I2C_w(*da); SCL=0; da++; }
	I2C_p();
	I2C_delay(dat);
}
void I2C_read_much(unsigned int address,unsigned char *da,unsigned char s)	//读取多字节
{
	unsigned char dat;
	dat=I2C_qut(address);
	I2C_s();
	I2C_w((i2c_addr+1)|dat); SCL=0;
	while(s--) { *da=I2C_r(s==0?0:1); da++; }
	I2C_p();
	I2C_delay(dat);
}

⌨️ 快捷键说明

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