📄 24128.c
字号:
#include "KKZQ.H"
void Delay(uchar Count);
void IICStart(void);
void IICStop(void);
bit IICRecAck(void);
void IICNoAck(void);
void IICAck(void);
uchar IICReceiveByte(void);
void IICSendByte(uchar sendbyte);
bit write128(uchar number,uint addr,uchar idata *p); //写24c128
bit read128(uint number,uint addr,uchar xdata *p);
bit read128buf(uint number,uint addr);
//*p 为读写数据输入/输出缓冲区的首址
//number 为要读写数据的字节数量
//addr 为EEPROM的片内地址
//order 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),
// 其中R/W=1,表示读操作,
// R/W=0为写操作,
// A2,A1,A0为EEPROM的页选或片选地址;
//函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;
//ERRORCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1
//
//=================================================================================
//文 件 名 : bit write128(uchar number,uint addr,uchar *p) //写24c128
//功 能 : 从指定位置连续读number个字节的数据到指定缓冲区
//参 数 : number 要读的字节数 (形参)
// addr 要从什么位置开始读 (形参)
// dog_buf 读出来的数据存放数组
//返 回 : =0读成功; =1读失败
//=================================================================================
//
bit write128(uchar number,uint addr,uchar idata *p) //写24c128
{
bit errorflag=1;
uchar i,j;
uchar idata *sip; //读写X24C128指针
i=10;
while(i--) //循环读取次数
{
j=number; sip=p; //字节个数
IICStart(); //启动IIC
IICSendByte(0xa0); //发送器件地址
if(IICRecAck()) continue; //判断正确否
IICSendByte((uchar)(addr>>8)); //发送高位地址
if(IICRecAck()) continue; //判断正确否
IICSendByte((uchar)addr); //发送低位地址
if(IICRecAck()) continue; //判断正确否
errorflag=0;
while(j--)
{ IICSendByte(*sip++); //写1个字节
if(!IICRecAck()) continue;
errorflag=1;
break;
}
if(errorflag==1) continue;
break;
}
IICStop(); //停止IIC
Delay(255);
Delay(255);
Delay(255);
Delay(255);
return(errorflag);
}
//
//=================================================================================
//文 件 名 : bit read128(uchar number,uint addr)
//功 能 : 从指定位置连续读number个字节的数据到指定缓冲区
//参 数 : number 要读的字节数 (形参)
// addr 源地址 (形参)
// flash_buf 目标地址指针
//返 回 : =0读成功; =1读失败
//=================================================================================
//
bit read128(uint number,uint addr,uchar xdata *p)
{ uchar i;
uint k;
uchar xdata *sip; //读写X24C128指针
bit errorflag=1;
i=10;
while(i--) //循环读取次数
{
k=number; sip=p;
IICStart(); //启动IIC
IICSendByte(0xa0); //发送器件地址
if(IICRecAck()) continue; //判断正确否
IICSendByte((uchar)(addr>>8)); //发送高位地址
if(IICRecAck()) continue; //判断正确否
IICSendByte((uchar)addr); //发送低位地址
if(IICRecAck()) continue; //判断正确否
IICStart(); //启动IIC
IICSendByte(0xa1); //发送读命令
if(IICRecAck()) continue;
while(k) //接收数据
{ *sip=IICReceiveByte();
IICAck(); //发送应答
--k; ++sip;
}
*sip=IICReceiveByte(); //read last byte data
IICNoAck(); //发送不应答
errorflag=0;
break;
}
IICStop(); //停止IIC
return(errorflag);
}
//
//=================================================================================
//文 件 名 : bit read128(uchar number,uint addr)
//功 能 : 从指定位置连续读number个字节的数据到指定缓冲区
//参 数 : number 要读的字节数 (形参)
// addr 源地址 (形参)
// flash_buf 目标地址指针
//返 回 : =0读成功; =1读失败
//=================================================================================
//
bit read128buf(uint number,uint addr)
{ uchar i;
uint k;
uchar idata *sip; //读写X24C128指针
bit errorflag=1;
i=10;
while(i--) //循环读取次数
{
k=number; sip=eeprom_buf;
IICStart(); //启动IIC
IICSendByte(0xa0); //发送器件地址
if(IICRecAck()) continue; //判断正确否
IICSendByte((uchar)(addr>>8)); //发送高位地址
if(IICRecAck()) continue; //判断正确否
IICSendByte((uchar)addr); //发送低位地址
if(IICRecAck()) continue; //判断正确否
IICStart(); //启动IIC
IICSendByte(0xa1); //发送读命令
if(IICRecAck()) continue;
while(k) //接收数据
{ *sip=IICReceiveByte();
IICAck(); //发送应答
--k; ++sip;
}
*sip=IICReceiveByte(); //read last byte data
IICNoAck(); //发送不应答
errorflag=0;
break;
}
IICStop(); //停止IIC
return(errorflag);
}
//*****************启动总线**********************
void IICStart(void)
{
// WDTC|=0x20;
SCL=0; _nop_(); _nop_(); _nop_();
SDA=1; _nop_(); _nop_(); _nop_();
SCL=1; _nop_(); _nop_(); _nop_();
SDA=0; _nop_(); _nop_(); _nop_();
SCL=0; _nop_(); _nop_(); _nop_();
SDA=1;
}
//*****************停止IIC总线****************
void IICStop(void)
{
//WDTC|=0x20;
SCL=0; _nop_(); _nop_(); _nop_();
SDA=0; _nop_(); _nop_(); _nop_();
SCL=1; _nop_(); _nop_(); _nop_();
SDA=1; _nop_(); _nop_(); _nop_();
SCL=0;
}
/**************检查应答位*******************/
bit IICRecAck(void)
{
//WDTC|=0x20;
SCL=0; _nop_(); _nop_(); _nop_();
SDA=1; _nop_(); _nop_(); _nop_();
SCL=1; _nop_(); _nop_(); _nop_();
CY=SDA; //因为返回值总是放在CY中的
SCL=0;
return(CY);
}
/***************对IIC总线产生应答*******************/
void IICACK(void)
{
//WDTC|=0x20;
SDA=0; _nop_(); _nop_(); _nop_();
SCL=1; _nop_(); _nop_(); _nop_();
SCL=0; _nop_(); _nop_(); _nop_();
SDA=1;
}
/*****************不对IIC总线产生应答***************/
void IICNoAck(void)
{
// WDTC|=0x20;
SDA=1; _nop_(); _nop_(); _nop_();
SCL=1; _nop_(); _nop_(); _nop_();
SCL=0;
}
/*******************向IIC总线写数据*********************/
void IICSendByte(unsigned char sendbyte)
{
uchar j;
//WDTC|=0x20;
for(j=8;j>0;j--)
{
SCL=0;
sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
SDA=CY; _nop_(); _nop_(); _nop_();
SCL=1; _nop_(); _nop_(); _nop_();
}
SCL=0;
}
/**********************从IIC总线上读数据子程序**********/
uchar IICReceiveByte(void)
{
uchar i,s;
//WDTC|=0x20;
i=8; SCL=0;
while(i--)
{
SCL=1;
s=(s<<1)|SDA;
SCL=0;
}
return(s);
}
/***************一个简单延时程序************************/
void Delay(uchar DelayCount)
{
while(DelayCount--);//WDTC|=0x20;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -