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

📄 rom.c

📁 i2c总线的程序设计
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
#include "at24c04.h"
#include "i2c.h"

void delay10ms(void)
{
	uint i;
	for(i=0;i<200;i++);
}

//启动信号
void start(void)
{
	AT24C04_SCL=0;
	nop();
	AT24C04_SDA=1;
	nop();
	AT24C04_SCL=1;
	nop();
	AT24C04_SDA=0;
	nop();
	
}
//停止信号
void stop(void)
{	AT24C04_SCL=0;
	nop();
	AT24C04_SDA=0;
	AT24C04_SCL=1;
	nop();
	AT24C04_SDA=1;
	nop();
}
//发应答信号
void ack(void)
{
	AT24C04_SCL=0;
	AT24C04_SDA=0;
	AT24C04_SCL=1;
	nop();
	
}
//发非应答信号
void no_ack(void)
{
	AT24C04_SCL=0;
	AT24C04_SDA=1;
	AT24C04_SCL=1;
	nop();
}
//写字节
bit write8bit(uchar input)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		AT24C04_SCL=0;
		input=input<<1;
		AT24C04_SDA=CY;
		nop();
		nop();
		AT24C04_SCL=1;
		nop();
	}
	AT24C04_SCL=0;
	nop();
	AT24C04_SDA=1;
	AT24C04_SCL=1;
	nop();
	CY=AT24C04_SDA;
	return(CY);
}
//读字节
uchar read8bit(void)
{
	uchar i,readdata;
	for(i=0;i<8;i++)
	{
		AT24C04_SCL=0;
		nop();

		readdata=(readdata<<1)|AT24C04_SDA;
		AT24C04_SCL=1;
	}
	return readdata;
}
//功能:从EEPROM中给定一个地址连续读NLEN个字节数据存放在以指针
//nContent开头的往下内容。
void readflash(uchar *content,uchar address,uchar len)	//顺序读
{
	uchar i;
	start();							//以随机读开始,提供开始地址
	write8bit(WriteDeviceAddress);
	write8bit(address);
	
	start();
	write8bit(ReadDeviceAddress);
	for(i=0;i<len;i++)
	{
		*content=read8bit();
		content++;
		ack();	
	}
	no_ack();
	stop();
}

uchar readflash_byte()
{
	 uchar readdata;
	 start();
	 write8bit(ReadDeviceAddress);
	 readdata=read8bit();
	 ack();
	 stop();
	 return readdata;
	}
//
bit Init_Flash ( unsigned int nPage ) //    8 Byte/1Page init 0xFF 
{
	unsigned char nLen;
	unsigned char Addr;
	nLen=16;
    Addr=16 *nPage;
	start();;
    write8bit(WriteDeviceAddress);
	write8bit(Addr);
	for(;nLen!=0;nLen--)
    {
	       if(write8bit(0xff)) break;  //if Write8Bit() Return 1 Write Flase
	}
	stop();
	delay10ms();
    return(CY);
}																		
//功能:向EEPROM

void writeflash(uchar *content,uchar address,uchar len)
{
	uchar i;

	start();
	write8bit(WriteDeviceAddress);
	write8bit(address);
	for(i=0;i<len;i++)
	{
		if(address%16==0)//该写下一页了
		{
			stop();
			delay10ms();
			start();
			write8bit(WriteDeviceAddress);
			write8bit(address);
		}

		write8bit(*content);  
		
		content++;
		address++;
	}
	stop();
	delay10ms();
}






			

⌨️ 快捷键说明

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