c51利用i2c和xpt2046来断电后保存电位值,但保存失败

xpi2c.c中的函数

#include"xpi2c.h"
void SPIWrite(uchar dat)                //写入数据
{
    uchar i;
    CLK=0;                                //闲置状态下处于低电压
    for(i=0;i<8;i++)
    {
        DIN=dat>>7;
        dat<<=1;
        CLK=0;
        CLK=1;                            //上升沿放置数据
    }
}

uint SPIRead()                           //读取数据
{
    uint i,dat=0;
    CLK=0;
    for(i=0;i<12;i++)                   //接收12位数据
    {
        dat<<=1;
        CLK=1;
        CLK=0;
        dat|=DOUT;
    }
    return dat;
}

uint ReadADDate(uchar cmd)
{
    uchar i;
    uint ADValue;
    CLK=0;
    CS=0;
    SPIWrite(cmd);
    for(i=6;i>0;i--);                    //延时
    CLK=1;
    _nop_();
    _nop_();
    CLK=0;
    _nop_();
    _nop_();
    ADValue=SPIRead();
    CS=1;                                //结束
    return ADValue;
}



void delay10us()
{
    uchar a,b;
    for(b=1;b>0;b--)
        for(a=2;a>0;a--);
}

void I2cStart()                        //起始信号
{
    SDA=1;                            //初始
    delay10us();
    SCL=1;                            //初始
    delay10us();
    SDA=0;                            //SDA从高跳低开始
    delay10us();
    SCL=0;
    delay10us();
}

void I2cStop()                        //结束信号
{
    SDA=0;
    delay10us();
    SCL=1;
    delay10us();
    SDA=1;                           //SDA从低跳高结束
    delay10us();

}

uchar I2cSendByte(uchar dat)         //发送一个字节
{
    uchar a=0,b=0;
    for(a=0;a<8;a++)
    {
        SDA=dat>>7;
        dat<<=1;
        delay10us();
        SCL=1;
        delay10us();
        SCL=0;
        delay10us();
    }
    SDA=1;
    delay10us();
    SCL=1;
    while(SDA)                       //等待应答
    {
         b++;
        if(b>200)
        {
             SCL=0;
            delay10us();
            return 0;
        }
    }
    SCL=0;
    delay10us();
    return 1;
}

uchar I2cReadByte()                 //读取字节
{
    uchar a=0,dat=0;
    SDA=1;
    delay10us();
    for(a=0;a<8;a++)
    {
        SCL=1;
        delay10us();
        dat<<=1;
        dat|=SDA;
        delay10us();
        SCL=0;
        delay10us();
    }    
    return dat;
}

void AT24c02Write(uchar addr,uchar dat)            //向24c02的地址中写入数据
{
    I2cStart();
    I2cSendByte(0xa0);                            //发送写器件地址
    I2cSendByte(addr);                            //发送要写入内容地址
    I2cSendByte(dat);                            //发送数据
    I2cStop();
}

uchar AT24c02Read(uchar addr)                    //读取24c02的一个地址的一个数据
{
    uchar num;
    I2cStart();
    I2cSendByte(0xa0);
    I2cSendByte(addr);
    I2cStart();
    I2cSendByte(0xa1);
    num=I2cReadByte();                            //发送读器件的地址
    I2cStop();
    return num;
}


main里的函数

#include"reg51.h"
#include"xpi2c.h"

typedef unsigned int u16;
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P3^0;                           //读取
sbit k2=P3^1;                           //保存
sbit k3=P3^2;

u16 temp,k=0;
u8 disp[4];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(u16 j)
{
    while(j--);
}

 void Keypros()
{    u16 j=0;
    if(k1==0)
    {
        delay(100);
        if(k1==0)
        {
            disp[0]=AT24c02Read(1);
            disp[1]=AT24c02Read(2);
            disp[2]=AT24c02Read(3);
            disp[3]=AT24c02Read(4);
        }
        while(!k1);
    }

    if(k2==0)
    {
        delay(100);
        if(k2==0)
        {
            AT24c02Write(1,disp[0]);            //写入
            AT24c02Write(2,disp[1]);
            AT24c02Write(3,disp[2]);
            AT24c02Write(4,disp[3]);
        }
        while(!k2);
    }

    if(k3==0)
    {
        delay(100);
        if(k3==0)
        {
            k++;
            if(k==2)
            k=0;
        }
        while(!k3);
    }
}
void datapros()
{
    static u8 i;
    if(i==50)
    {
        i=0;
        temp=ReadADDate(0x94);                    //AIN0电位器
    }
    i++;
    disp[0]=smgduan[temp/1000];
    disp[1]=smgduan[temp%1000/100];
    disp[2]=smgduan[temp%1000%100/10];
    disp[3]=smgduan[temp%1000%100%10];

}

void DigDisplay()
{
    u8 i;
    for(i=0;i<4;i++)
    {
        switch(i)
        {
             case(0):
                LSA=0;LSB=0;LSC=0;break;
            case(1):
                LSA=1;LSB=0;LSC=0;break;
            case(2):
                LSA=0;LSB=1;LSC=0;break;
            case(3):
                LSA=1;LSB=1;LSC=0;break;
        }
        P0=disp[i];
        delay(100);
        P0=0x00;
    }
}

void main()
{
    while(1)
    {
        Keypros();
        if(k==1){
            datapros();
        }
        DigDisplay();
    }
}