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

📄 a24c32.c

📁 用PICC开发的RC500的完整C源程序。单片机用PIC16f73。
💻 C
字号:
//i2c.c
//for mp-198
/* 使用全局变量:
 * addr
 *
 */
void Read24C32(unsigned char eAddr,unsigned char numb,unsigned char *ptr)
{
    if (numb==0)
    {
        Flag.SUCCESS=0;
        return;
    }
    numb--;
    eStart();          //开始
    eSend(0xa0);        //写主控器识别地址(写)
    WaitAck()   ;      //等待应答
    eSend(0);    //送高位
    WaitAck()   ;      //等待应答
    eSend(eAddr);    //送低位
    WaitAck()   ;      //等待应答
 //
    eStart();
    eSend(0xa1);
    WaitAck()   ;      //等待应答
        while(numb)
        {
            clrwdt();
            *ptr=eReceive();
            eAck();
            ptr++;
            numb--;
        }
        *ptr=eReceive();
    eNack();
    eStop();
    Flag.SUCCESS=1;
}
//=================================
void Write24C32(unsigned char eAddr,unsigned char numb,unsigned char *ptr)
{
    if (numb==0)
    {
        Flag.SUCCESS=0;
        return;
    }
    eWP_Lo();// write enable
//eSeek()
    eStart();          //开始
    eSend(0xa0);        //写主控器识别地址(写)
    WaitAck();     //等待应答
    eSend(0);       //送高位
    WaitAck();     //等待应答
    eSend(eAddr);    //送低位
    WaitAck();     //等待应答
 //
        while (numb)
        {
            clrwdt();
            eSend(*ptr);    //发送数据
            WaitAck();      //等待应答
            ptr++;
            numb--;
        }
    eStop();//停止
//延时10ms
    DelayMS(10);
    Flag.SUCCESS=1;
}
//=================================
void DelayUS()//10us
{
unsigned char i;
    for(i=5;i--;)
        {;}
}
//-----------------------------------
void DelayMS(unsigned char val)
{
    unsigned int k;
    do{
        clrwdt();
        for(k=550;k--;)
        {
            nop();
        }
    }while(--val);
}
/* ******************** */
void eAck()  //发送继续读信号
{
    SCL_Lo();
    SDA_Lo();
        DelayUS();
    SCL_Hi();
        DelayUS();
    SCL_Lo();
}
//-----------------------------------
void eNack()    //停止继续读
{
    SCL_Lo();
    SDA_Hi();
        DelayUS();
    SCL_Hi();
        DelayUS();
    SCL_Lo();
}
//-----------------------------------
void WaitAck()    //等待应答
{
     SCL_Hi();
        DelayUS();
     if (SDA == 1)
         Flag.SUCCESS = 0;
     SCL_Lo();
    if (Flag.SUCCESS==0)
    {
        while(1)
        {
            ;
        }
    }
}
//-----------------------------------
void eStart()
{
    Flag.SUCCESS = 1;
    SCL_Hi();
        DelayUS();
    SDA_Lo();          // SDA : Hi --> Lo , when SCL = Hi
        DelayUS();
    SCL_Lo();
}
// =================================
void eStop()
{
    SCL_OUT();
    SDA_OUT();
    SDA_Lo();
    SCL_Hi();
        DelayUS();
    SDA_Hi();
        DelayUS();
    SDA_INPUT();            // SDA : Lo --> Hi , when SCL = Hi
    SCL_INPUT();
    eWP_Hi();          // write protected
    clrwdt();
}
//=================================
//(堆栈深度:2)
void eSend(unsigned char ebyte)
{
unsigned char i=8 ;    /* byte = 8 bits  */
        SCL_OUT();
        SDA_OUT();
    do
    {
        SCL_Lo();
        if((ebyte&0x80)==0)
            port_sda=0;   //发送 0
        else
            port_sda=1;    //发送 1
        SCL_Hi();
            nop();
        SCL_Hi();
            DelayUS();
        SCL_Lo();
        ebyte <<= 1;
    } while(--i);
    SDA_INPUT();       //释放总线等待应答
        DelayUS();
}
//==================================
unsigned char eReceive()
{
unsigned char ebyte=0,i=8;
    SDA_Lo();
    SDA_INPUT();
    do
    {
        ebyte = (ebyte <<1);
            DelayUS();
        SCL_Hi();       //SCL-->HIGHT,read data
            DelayUS();
        if(port_sda)             //读 1
        {
            ebyte |= 1;
        }
        SCL_Lo();       //SCL-->LOW, next bit

    }while(--i);
    return ebyte;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -