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

📄 at24c._c

📁 电梯楼层采集器代码
💻 _C
字号:

#include"include.h"

#define AT24CWAIT	1
#define AT24_DEVICEADDR	0xA0

#define SCL_HI()	PORTB |= (1<<1)
#define SCL_LO()	PORTB &= ~(1<<1)

#define SDA_HI()		PORTB |= (1<<0)
#define SDA_LO()		PORTB &= ~(1<<0)
#define SDA_OUTPUT()	DDRB |= (1<<0)
#define SDA_INPUT()		DDRB &= ~(1<<0)
#define SDAIN()			(PINB&(1<<0))

void AT24C_delay(unsigned char us)
{
	do{
	  asm("nop");
	  asm("nop");
	}while(us--);
}

//打开I2C
void I2C_Initial(void)
{
	DDRD |= (1<<1);//
	DDRD |= (1<<0);	// 
	
	SCL_HI();//SCL 
	SDA_HI();//SDA 
}

//关闭I2C
void I2C_Close(void)
{
	SCL_HI();//SCL 
	SDA_HI();//SDA 
	
	DDRD |= (1<<1);//
	DDRD |= (1<<0);	// 
}

/*发送起动信号*/
void I2C_SendStart(void)
{
	SCL_HI();
	SDA_HI();
	AT24C_delay(AT24CWAIT);
	SDA_LO();
	AT24C_delay(AT24CWAIT);
	SCL_LO();
}

/*发送停止信号*/
void I2C_SendStop(void)
{
	SDA_LO();
	SCL_HI();
	AT24C_delay(AT24CWAIT);
	SDA_HI();
}

/*发送一字节数据*/
unsigned char I2C_SendByte(unsigned char c)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		if((c<<i)&0x80)	SDA_HI();
		else SDA_LO();
		AT24C_delay(AT24CWAIT);
		SCL_HI();
		AT24C_delay(AT24CWAIT);
		SCL_LO();
	}
	SDA_INPUT();;
	AT24C_delay(AT24CWAIT);
	SCL_HI();
	AT24C_delay(AT24CWAIT);
	if(SDAIN())	i=0;
	else	i=1;
	SCL_LO();
	SDA_OUTPUT();
	return i;
}

/*接收一字节数据*/
unsigned char I2C_ReceiveByte(void)
{
	unsigned char i;
    unsigned char retc;
	retc=0;
	SDA_INPUT();
	for(i=0;i<8;i++)
	{
		retc <<= 1;
		SCL_LO();
		AT24C_delay(AT24CWAIT);
		SCL_HI();
		AT24C_delay(AT24CWAIT);
		if(SDAIN())	retc |= 1;
		AT24C_delay(AT24CWAIT);
	}
	SCL_LO();
	AT24C_delay(AT24CWAIT);
	SDA_HI();
	SDA_OUTPUT();
	SCL_HI();
	AT24C_delay(AT24CWAIT);
	SCL_LO();
	return(retc);
}

/*EEPROM数据读出*/
unsigned char AT24_Read(unsigned char * buffer,unsigned int addr,unsigned char num)
{
	unsigned char i,ret;
	for(i=0;i<num;i++)
	{
		I2C_SendStart();
		ret = I2C_SendByte(AT24_DEVICEADDR);
		if(ret != 1)
			return 0;
		ret = I2C_SendByte(addr>>8);
		if(ret != 1)
			return 0;
		ret = I2C_SendByte(addr);
		if(ret != 1)
			return 0;
		I2C_SendStart();
		ret = I2C_SendByte(AT24_DEVICEADDR|0x01);
		if(ret != 1)
			return 0;
		buffer[i] = I2C_ReceiveByte();
		I2C_SendStop();
		addr ++;
		AT24C_delay(10);
	}
	return 1;
}

unsigned char AT24_Write(unsigned char * buffer,unsigned int addr,unsigned char num)
{
	unsigned char i,ct,ret;
	
	ct = 0;
nextpage:
	I2C_SendStart();
	ret = I2C_SendByte(AT24_DEVICEADDR);
	if(ret != 1)
		return 0;
	ret = I2C_SendByte(addr>>8);
	if(ret != 1)
		return 0;
	ret = I2C_SendByte(addr);
	if(ret != 1)
		return 0;
	for(i=0;i<num;i++)
	{
		ret = I2C_SendByte(buffer[ct++]);
		if(ret != 1)
			return 0;
		addr ++;
		if((((unsigned char)addr)&0x7F) == 0)
		{
			I2C_SendStop();
			AT24C_delay(20);
			num -= i+1;
			goto nextpage;
		}
	}
	I2C_SendStop();
	AT24C_delay(15);
	return 1;
}

⌨️ 快捷键说明

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