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_();
}
bit Ack(void)
{
bit cy;
SCL=HIGH;
nop_();
cy=SDA;
SCL=LOW;
nop_();
return(cy);
}
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;
}
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;
}
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);
}
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);
}
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;
}
}