⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24128.c

📁 一体化锁主程序
💻 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 + -