📄 24ceprom.c
字号:
/*******************************************
* 文件名 : 24CEPROM.C
* 功能 : 24C系列EPROM读写程序
* 占用资源: 两个IO口
* 程序员 : wyl(wyl-e@163.com)
* 日期 : 2007.07
* 包含文件: 24CEPROM.H(见本文件结尾处)
* 说明 :
Table : Description RomSize
EPROM24C01 128
EPROM24C02 256
EPROM24C04 512
EPROM24C08 1024
EPROM24C16 2048
********************************************/
#include<_REG52_.H>
#include"24CEPROM.H"
/******************************************/
#define SETB_SDA SDA_EPROM=1;_nop_();_nop_()
#define CLR_SDA SDA_EPROM=0;_nop_();_nop_()
#define SETB_SCK SCK_EPROM=1;_nop_();_nop_()
#define CLR_SCK SCK_EPROM=0;_nop_();_nop_()
#define WAIT_FOR_ACK _nop_() //等待时钟周期.
/*******************************************/
/*******************************************
* 函数功能 : 启动EPROM
* 入口参数 : (void)
* 返回值 : (void)
********************************************/
void START_EPROM(void)
{
CLR_SCK;
SETB_SDA;
SETB_SCK;
CLR_SDA;
CLR_SCK;
}
/*******************************************
* 函数功能 : 停止EPROM
* 入口参数 : (void)
* 返回值 : (void)
********************************************/
void STOP_EPROM(void)
{
CLR_SCK;
CLR_SDA;
SETB_SCK;
SETB_SDA;
CLR_SCK;
}
/*******************************************
* 函数功能 : 写字节到EPROM
* 入口参数 : (uchar)
* 返回值 : (bit)
********************************************/
static bit WriteByte_EPROM(uchar byte_dat)
{
uchar dat,i,j=255;
dat = byte_dat;
for(i=0;i<8;i++)
{
CLR_SCK;
if(dat&0x80){SETB_SDA;}
else {CLR_SDA;}
SETB_SCK;
dat<<=1;
}
CLR_SCK;
SETB_SDA;
SETB_SCK;
while((SDA_EPROM)&&(j>10))
{
#ifdef WAIT_FOR_ACK
WAIT_FOR_ACK;
#endif
j--;
}
CLR_SCK;
if(j>10) return 1; //OK
else return 0; //ERROR
}
/*******************************************
* 函数功能 : 从EPROM读一个字节
* 入口参数 : (void)
* 返回值 : (uchar)
********************************************/
static uchar ReadByte_EPROM(void)
{
uchar dat,i;
CLR_SCK;
SETB_SDA;
for(i=0;i<8;i++)
{
dat<<=1;
CLR_SCK;
SETB_SCK;
if(SDA_EPROM)dat+=1;
}
CLR_SCK;
SETB_SDA;
SETB_SCK;
return dat;
}
/*******************************************
* 函数功能 : 写一个字节到EPROM指定地址.
* 入口参数 : (uchar dat,uint addr)
* 返回值 : (bit)
* 说明 : 连续执行本函数时中间应该有10毫秒
的延时.以待ROM内部操作完毕.
********************************************/
bit WriteByteToEPROM(uchar byte,uint f_add)
{
uchar addr;
uchar page;
bit ack;
page = (uchar)(f_add/256);
addr = (uchar)(f_add%256);
page <<= 1;
page &= 0x0E;
START_EPROM();
WriteByte_EPROM(0xA0|page);
WriteByte_EPROM(addr);
ack=WriteByte_EPROM(byte);
STOP_EPROM();
return ack;
}
/*******************************************
* 函数功能 : 从EPROM的指定地址读取一个字节
* 入口参数 : (uint addr)
* 返回值 : (uchar dat)
********************************************/
uchar ReadByteFromEPROM(uint f_add)
{
uchar addr,dat;
uchar page;
page = (uchar)(f_add/256);
addr = (uchar)(f_add%256);
page <<= 1;
page &= 0x0E;
START_EPROM();
WriteByte_EPROM(0xA0|page);
WriteByte_EPROM(addr);
START_EPROM();
WriteByte_EPROM(0xA1|page);
dat=ReadByte_EPROM();
STOP_EPROM();
return dat;
}
/*******************************************
* 函数功能 : 从EPROM的指定地址进行读取,获得应得信号
* 入口参数 : (uint addr)
* 返回值 : (uchar dat)
********************************************/
bit ReadACKFromEPROM(uint f_add)
{
uchar addr;
bit ack;
uchar page;
page = (uchar)(f_add/256);
addr = (uchar)(f_add%256);
page <<= 1;
page &= 0x0E;
START_EPROM();
ack = WriteByte_EPROM(0xA0|page);
/*
WriteByte_EPROM(addr);
START_EPROM();
ack=WriteByte_EPROM(0xA1|page);
dat=ReadByte_EPROM();
*/
STOP_EPROM();
return ack;
}
/******************THE END*********************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -