C51:
//定义EE24XX的管脚********************************
sbit SCL =P1^2; //
sbit SDA =P1^3;
/************************************************
延时程序
************************************************/
void nop_(void)
{
unsigned char i=5;
while (i--);
}
/***********************************************
开始位
************************************************/
void Start_ee (void)
{
SDA=HIGH;
nop_();
SCL=HIGH;
nop_();
SDA=LOW;
nop_();
SCL=LOW;
nop_();
}
/********************************
停止位
**********************************/
void Stop_ee (void)
{
SDA=LOW;
nop_();
SCL=HIGH;
nop_();
SDA=HIGH;
nop_();
SCL=LOW;
nop_();
}
/*********************************
应答位,返回SDA信号
**********************************/
bit Ack(void)
{
bit cy;
SCL=HIGH;
nop_();
cy=SDA;
SCL=LOW;
nop_();
return(cy);
}
/***********************************
主应答 返回SDA
************************************/
bit McuAck(void)
{
bit cy;
SDA=LOW;
cy=Ack();
SDA=HIGH;
return(cy);
}
/************************************
不应答
*************************************/
void McuNAck(void)
{
SDA=HIGH;
SCL=HIGH;
nop_();
SCL=LOW;
SDA=LOW;
}
/************************************
写入一个字节 ,返回成功标志
*************************************/
bit Wr_Byte(unsigned char Dat)
{
unsigned char i;
bit cy;
for (i=0;i<8;i++)
{
if ((Dat & 0x80)==0x80) SDA=HIGH;
else SDA=LOW;
cy=Ack();
Dat<<=1;
}
SDA=HIGH;
return(Ack());
}
/**********************************
读取一个字节
***********************************/
unsigned char Rd_Byte(void)
{
unsigned char i,j=0;
for (i=0;i<8;i++)
{
j<<=1;
if (Ack()) j++;
}
return j;
}
/*******************************************
EE24类型检测,返回标志位
********************************************/
unsigned char EeAll (unsigned int EeAdr)
{
Start_ee();
#if Ee_Type //1 EE24c32__
if (Wr_Byte(Wr_ee)) return 1;
if (Wr_Byte((unsigned char)EeAdr>>8)) return 1;
if (Wr_Byte((unsigned char)EeAdr)) return 1;
#else
if (Wr_Byte((unsigned char)(EeAdr>>7 |Wr_ee))) return 1;
if (Wr_Byte((unsigned char)EeAdr )) return 1;
#endif
return 0;
}
/****************************************************
连续写入字节,返回UINT8标志
*****************************************************/
unsigned char WriteEe24(unsigned int EeAdr,unsigned char *RamAdr,unsigned char Number)
{
bit cy;
if (EeAll(EeAdr)) return (0);
while (Number--)
{
cy=Wr_Byte(*RamAdr++);
}
Stop_ee();
Delay (10);
return (1);
}
/****************************************************
连续读取,返回UINT8标志
*****************************************************/
unsigned char ReadEe24(unsigned int EeAdr,unsigned char *RamAdr,unsigned char Number)
{
if (EeAll(EeAdr)) return (0);
Start_ee();
if (Wr_Byte(Rd_ee)) return (0);
while (--Number)
{
*RamAdr++=Rd_Byte();
McuAck();
}
*RamAdr=Rd_Byte();
McuNAck();
Stop_ee();
return (1);
}
/**************************************************
每过10秒写入EE24
**************************************************/
void SaveEe24c512(void)
{
unsigned char Buf[2],i;
static unsigned char Flag=0;
if ((UseData.Tm % WrSec) ==0)
{
if(Flag==0) //2004-7-9改FLAG
{
Flag=1; //写入标志
Buf[1]=WorkData.Nu;
Buf[0]=WorkData.Nu>>8;
i=WriteEe24(HeadAdr+2*Menu.Piont++,Buf,2);
if (Menu.Piont >= WrNumber)
{
EndCount(); //溢出
UseData.ToBak=0;
UseData.To=0;
UseData.Tm=0; //2004-4-18
Menu.Piont=0;
UseData.LedPower=Msg_Up; //暂停放电
}
}
}
else
{
Flag=0;
}
}