📄 实现存储器eeprom at24c02的数据读写操作 采用iic总线读写 c程序.c
字号:
//EEPROM AT24C02的数据读写操作 采用IIC总线读写 C程序
/***************************************************************
功能:11:32 2008-6-27
作者:SG
时间:2004-03-15
版本:V1.0
***************************************************************/
#include "INTRINS.H"
#include "reg52.h"
#define WriteDeviceAddress 0xa0 //写驱动地址指令
#define ReadDeviceAddress 0xa1 //读驱动地址指令
sbit AT24C02_SCL = 0xa4; //*****相当于sbit AT24C02_SCL = P2^4
sbit AT24C02_SDA = 0xa5; //*****相当于sbit AT24C02_SDA = P2^5
/*-------------------------------------------------------------
功能:发起始信号
------------------------------------------------------------*/
void Start_Cond()
{
AT24C02_SCL = 0;
_nop_();
AT24C02_SDA = 1;
_nop_();
AT24C02_SCL = 1;
_nop_();
AT24C02_SDA = 0;
_nop_();
}
/*-------------------------------------------------------------
功能:发停止信号
------------------------------------------------------------*/
void Stop_Cond()
{
AT24C02_SCL = 0;
_nop_();
AT24C02_SDA = 0;
_nop_();
AT24C02_SCL = 1;
_nop_();
AT24C02_SDA = 1;
_nop_();
}
/*-------------------------------------------------------------
功能:发确认信号
------------------------------------------------------------*/
void Ack()
{
AT24C02_SCL = 0;
_nop_();
AT24C02_SDA = 0;
AT24C02_SCL = 1;
_nop_();
AT24C02_SCL = 0;
_nop_();
AT24C02_SDA = 1;
}
/*-------------------------------------------------------------
功能:发无确认信号
------------------------------------------------------------*/
void NoAck()
{
AT24C02_SCL = 0;
_nop_();
AT24C02_SDA = 1;
_nop_();
AT24C02_SCL = 1;
_nop_();
AT24C02_SCL = 0;
_nop_();
}
/*-------------------------------------------------------------
功能:写一个字节数据
------------------------------------------------------------*/
bit Write8Bit(unsigned char input)
{
unsigned char i;
for (i=0;i<8;i++)
{
AT24C02_SCL = 0;
input <<= 1;
AT24C02_SDA = CY; //*************左移位后,移出的哪一位进入了CY中
AT24C02_SCL = 1;
}
AT24C02_SCL = 0; //****以下为"接受确认信号"程序
_nop_();
AT24C02_SDA = 1; //*****拉高管脚,准备读该管脚电平
AT24C02_SCL = 1;
_nop_();
CY = AT24C02_SDA; //读"确认信息",如果返回1则表明写入失败
return(CY) ;
}
/*-------------------------------------------------------------
功能:读一个字节数据
------------------------------------------------------------*/
unsigned char Read8Bit()
{
unsigned char temp,rbyte=0;
for (temp = 8;temp != 0;temp--)
{
AT24C02_SCL = 0;
_nop_();
rbyte = (rbyte << 1) | AT24C02_SDA; //*****这样也可以按位并吗?AT24C02_SDA是不是代表着某个字节的最低位,其余位都为0
AT24C02_SCL = 1;
_nop_();
}
return rbyte;
}
/*-------------------------------------------------------------
功能:从EEPROM中给定一个地址连续读NLEN个字节数据存放在以指针
nContent开头的往下内容。
------------------------------------------------------------*/
bit Read_Flash ( unsigned char *nContent, unsigned char nAddr, unsigned char nLen )
{
unsigned char Addr;
Addr = nAddr;
Start_Cond(); //写开始信号
Write8Bit(WriteDeviceAddress); //写驱动地址
Write8Bit(Addr); //写从EEPROM中读的开始地址
Start_Cond(); //写开始信号
Write8Bit(ReadDeviceAddress); //写读数据指令
while(--nLen)
{
*nContent=Read8Bit(); //读出内容
nContent++; //指针加1
Ack(); //发确认信号,让24WC02继续发送数据
}
*nContent=Read8Bit(); //读一字节
NoAck(); //发无确认信号,让24WC02停止发送数据
Stop_Cond(); //发终止信号
return(0); //返回
}
/*-------------------------------------------------------------
功能:初始化EEPROM子程序内容为FF
------------------------------------------------------------*/
bit Init_Flash ( unsigned int nPage ) // 8 Byte/1Page init 0xFF
{
unsigned char nLen;
unsigned char Addr;
nLen=8;
Addr=8 *nPage;
Start_Cond();
Write8Bit(WriteDeviceAddress);
Write8Bit(Addr);
for(;nLen!=0;nLen--)
{
if(Write8Bit(0xff)) break; //if Write8Bit() Return 1 Write Flase
}
Stop_Cond();
return(CY);
}
/*-------------------------------------------------------------
功能:从EEPROM中给定一个地址连续写NLEN个字节数据存放在以指针
nContent开头的往下内容。
------------------------------------------------------------*/
bit Write_Flash ( unsigned char *nContent, unsigned char nAddr,unsigned char nLen)
{
unsigned char i,temp;
unsigned char Addr;
Addr = nAddr;
Start_Cond(); //写开始信号
Write8Bit(WriteDeviceAddress); //写驱动地址
Write8Bit(Addr); //写从EEPROM中写的开始地址
for(i = 0;i < nLen;i++)
{
if(Addr%8==0) //每页8字节 //换页 //*****为什么读EEPROM时不用换页呢?
{
Stop_Cond();
_nop_();
Start_Cond();
Write8Bit(WriteDeviceAddress);
Write8Bit(Addr);
}
temp = *nContent;
if(Write8Bit(temp))
break; //如果失败则跳出循环
nContent++;
Addr++;
}
Stop_Cond(); //发停止信号
return(CY); //*****CY来自Write8Bit(temp)
}
/*-------------------------------------------------------------
主程序
功能:实现存储器EEPROM AT24C02的数据读写操作
------------------------------------------------------------*/
void main()
{
unsigned char dat[16],i;
Read_Flash(dat,0,16); //读出AT24C02中从地址0开始依次往后16个字节放入dat数组中
Init_Flash(0); //将AT24C02的第0页初始化为FF
Read_Flash(dat,0,16); //读出AT24C02中从地址0开始依次往后16个字节放入dat数组中
for(i = 0;i < 16;i++ )
{
dat[i] = i; //对数组dat初始化为0---F
}
Write_Flash(dat,0,16); //将dat数组中的数据写入AT24C02中地址从0开始
Read_Flash(dat,1,16); //读出AT24C02中从地址1开始依次往后16个字节放入dat数组中
while(1)
{
i = 9;
}
}
//http://www.picavr.com/news/2008-06/6666.htm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -