📄 24c02.c
字号:
#include <intrins.h>
#include <24C02.h>
#include <lcd128x64.h>
#include <keyboard451.h>
#include <print.h>
#include <set.h>
#define MAX_SAVE_NUM 255
//DataBuff为读写数据输入/输出缓冲区的首址
//ByteQuantity 为要读写数据的字节数量
//Address 为EEPROM的片内地址
//函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;
//24C256的存储空间分为512页,每页64字节。总共32K字节//
/**********************************hl******************************************/
//往24c256中写数据
//Databuf中存的是写入的数据,Bytelen为每个记录含的字节数 adr为写数据的地址
//写数成功返回“0”,不成功返回“1”
/****************************************************************************/
char cc256W(BYTE *Databuf,BYTE Bytelen,WORD adr)
{
BYTE len1=0,len2=0,len3=0,len4=0;
BOOL repeat_f1=0,repeat_f2=0,repeat_f3=0;
char status;
len1=0x40-adr%0x40;
if (len1>=Bytelen) status=c256W(Databuf,Bytelen,adr);
else {
status=c256W(Databuf,len1,adr);
Delay1(1000);
Delay1(100);
if ((status==0)&&((len2=Bytelen-len1)>0x40)) { len2=0x40;repeat_f1=1;}
status=c256W(Databuf+len1,len2,adr+len1);
Delay1(1000);
Delay1(100);
if((status==0)&&(repeat_f1))
{
if ((len3=(Bytelen-len1-len2))>0x40) {len3=0x40; repeat_f2=1;}
status=c256W(Databuf+len1+len2,len3,adr+len1+len2);
Delay1(1000);
Delay1(100);
if((status==0)&&(repeat_f2))
{
len4=(Bytelen-len1-len2-len3);
status=c256W(Databuf+len1+len2+len3,len4,adr+len1+len2+len3);
}
}
}
return(status);
}
/****************************************hl***********************************************/
/*向24c256写数据 DataBuff为要写数据的首地址 ByteQuantity为要写数据的长度 Address为要存的地址*/
/*当写数据成功返回“0”,不成功返回“1”*/
/***************************************************************************************/
char c256W(BYTE *DataBuff,BYTE ByteQuantity,WORD Address)
{
BYTE kk,j=0,status=1;
ES=0;
EA=0 ;
ROMSCL=1;
ROMSDA=1;
Delay1(1);
IICStart();//hl//启动总线
if (!IICSendByte(0xa0)) //hl//发送Device Address
{
if (!IICSendByte((BYTE)(Address>>8))) //hl//发 WORD ADDRESS
{
if (!IICSendByte((BYTE)(Address)))
{
for(j=0;j<ByteQuantity;j++)
{
kk=*(DataBuff+j);
if(IICSendByte(kk)) {j=ByteQuantity;status=1;}//hl//发送数据不成功IICSendByte(kk)返回“1”
else status=0;
}
IICStop();//hl//停止总线
}
}
}
EA=1;
ES=1;
return(status);
}
/*************************************hl***************************************/
//读24c256中的工作日志
//Databuf中存的是读出的数据,Bytelen为每个记录含的字节数 adr为读数据的地址
//读数成功返回“0”,不成功返回“1”
/****************************************************************************/
char cc256R(BYTE *Databuf,BYTE Bytelen,WORD adr)
{
BYTE len1=0,len2=0,len3=0,len4=0;
BOOL repeat_f1=0,repeat_f2=0,repeat_f3=0;
char status;
len1=0x40-adr%0x40;//hl//要读数据的起始地址与此地址所在页页尾的差,即起始地址所在页还剩多少空间
if (len1>=Bytelen) status=c256R(Databuf,Bytelen,adr);
//hl//如果起始地址不是一页的开头,并且所要读的数据都在这一页中
else {
status=c256R(Databuf,len1,adr); //hl//如果要读的数据不是全部在起始地址所在的页中,只读这一页的数据
//Delay1(100);
if ((status==0)&&((len2=Bytelen-len1)>0x40)) { len2=0x40;repeat_f1=1;}//hl//读上一页成功,并且要读的数据不只两页时
status=c256R(Databuf+len1,len2,adr+len1);//hl//读第2页的数据
//Delay1(100);
if((status==0)&&(repeat_f1))
{
if ((len3=(Bytelen-len1-len2))>0x40) {len3=0x40; repeat_f2=1;}//hl//要读的数据不只3页时
status=c256R(Databuf+len1+len2,len3,adr+len1+len2);//hl//读第3页的数据
// Delay1(100);
if((status==0)&&(repeat_f2))
{
len4=(Bytelen-len1-len2-len3);
status=c256R(Databuf+len1+len2+len3,len4,adr+len1+len2+len3);//hl//读第4页的数据
}
}
}
return(status);
}
/****************************************hl***********************************************/
//从24c256读数据
//DataBuff为读出数据存放的首地址 ByteQuantity为要读的数据的长度 Address为要读的地址*/
/*当写数据成功返回“0”,不成功返回“1”*/
/***************************************************************************************/
char c256R(BYTE *DataBuff,BYTE ByteQuantity,WORD Address)
{
BYTE j,status=1;
ES=0;
EA=0 ;
ROMSCL=1;
ROMSDA=1;
Delay1(1);
IICStart();
if (!IICSendByte(0xa0)) //hl//必须先写地址
{
if(!IICSendByte((BYTE)(Address>>8)))
{
if(!IICSendByte((BYTE)(Address)))
{
IICStart();
if (!IICSendByte(0xa1)) //hl//从地址中读数据
{
if(ByteQuantity>1){
for(j=0;j<ByteQuantity;j++){ *(DataBuff+j)=IICReceiveByte(0);}
*(DataBuff+j+1)=IICReceiveByte(1); //hl//返回ack信号
IICStop();
}
else { *(DataBuff)=IICReceiveByte(1);IICStop();}
status=0;
}
}
}
}
EA=1;
ES=1 ;
return(status);
}
/*****************以下是对IIC总线的操作子程序***/
/*****************启动总线**********************/
/*****************以下是对IIC总线的操作子程序***/
/*****************启动总线**********************/
void IICStart(void)
{
ROMSCL=0;
Delay1(1);
ROMSDA=1;
Delay1(1);
ROMSCL=1;
Delay1(1);
ROMSDA=0;
Delay1(1);
ROMSCL=0;
Delay1(1);
} //1nop=4us
/*****************停止IIC总线****************/
void IICStop(void)
{
ROMSDA=0;
Delay1(1);
ROMSCL=1;
Delay1(1);
ROMSDA=1;
Delay1(1);
}
/**********************从IIC总线上读数据子程序**********/
BYTE IICReceiveByte(BYTE flag)
{
BYTE i=8,kk;
kk=0;
ROMSCL=0;
Delay1(1);
for(i=0;i<8;i++)
{
ROMSCL=1;
Delay1(1);
kk=kk<<1;
if (ROMSDA) kk++;
Delay1(1);
ROMSCL=0;
if (i!=7)Delay1(1);
}
if(flag) ROMSDA=1; //end read
else ROMSDA=0; //ack
Delay1(1);
ROMSCL=1;
Delay1(1);
ROMSCL=0;
Delay1(1);
ROMSDA=1;
return(kk);
}
/***************一个简单延时程序************************/
void Delay1(BYTE DelayCount)
{
while(DelayCount--);
}
//hl//**********************从IIC总线上写数据子程序**********/
BOOL IICSendByte(BYTE kk1)
{
BYTE j=8;
BOOL ack=0;
for(j=0;j<8;j++)
{
if (kk1&0x80) ROMSDA=1; else ROMSDA=0;
kk1=kk1<<1;
Delay1(1);
ROMSCL=1;
Delay1(1);
ROMSCL=0;
if(j!=7) Delay1(1);
}
ROMSDA=1;
Delay1(1);
ROMSCL=1;
Delay1(1);
if (ROMSDA) ack=1;
ROMSCL=0;
Delay1(1);
return(ack);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -