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

📄 iic.c

📁 此文件是一个完整的发动机转速表,用步进电机实现指示功能,利用HOLTECK的HT46R232作为MCU.
💻 C
字号:
#include "..\includes\includes.h"
#define ERRORCOUNT  2
#define _nop_()     asm("nop")
void IICStart(void);
void IICStop(void);
INT8U IICRecAck(void);
void IICACK(void);
void IICNoAck(void);
void IICSendByte(unsigned char sendbyte);
unsigned char IICReceiveByte(void);
void IICDelay(unsigned char DelayCount);
void  Nop(void);
/***********************************************************************************/
unsigned char RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned char Address,unsigned char ControlByte,char dtk)
{
    unsigned char     errorflag;
    char jjj,iii;
    iii=ERRORCOUNT;
    errorflag=1;
    while(iii--){
        IICStart();
        IICSendByte(ControlByte&0xfe);
        if(IICRecAck()){
            continue;
        }
        IICSendByte(Address%256);
        if(IICRecAck()){
            continue;
        }
        if(!(ControlByte&0x01)){//写EE
            jjj=ByteQuantity;
            errorflag=0;                      //********clr errorflag
            while(jjj--){
                IICSendByte(*DataBuff++);
                if(!IICRecAck()){
                    continue;
                }
                errorflag=1;
                break;
            }
            if(errorflag==1){
                continue;
            }
            break;
        }else{//读EE
            IICStart();
            IICSendByte(ControlByte);
            if(IICRecAck()){
                continue;
            }
            while(--ByteQuantity){
                *DataBuff++=IICReceiveByte();
                IICACK();
            }
            *DataBuff=IICReceiveByte();        //read last byte data
            IICNoAck();
            errorflag=0;
            break;
        }
    }
    IICStop();
   	if(!(ControlByte&0x01)){
        IICDelay(255);
        IICDelay(255);
        IICDelay(255);
        IICDelay(255);
        IICDelay(255);
        IICDelay(255);
        IICDelay(255);
        IICDelay(255);
        IICDelay(255);
    }
    return(errorflag);
}
/*****************启动总线**********************/
void IICStart(void)
{
    IISCLC=0;                 //设置为输出
    IISDAC=0;
    IISDA=1;
    IISCL=1;
    Nop();
    Nop();
    IISDA=0;
    Nop();
    IISCL=0;
    
}
/*****************停止IIC总线****************/
void IICStop(void)
{
    IISCLC=0;
    IISDAC=0;
    IISCL=0;
    Nop();
    IISDA=0;
    Nop();
    IISCL=1;
    Nop();
    IISDA=1;
    Nop();
    IISDAC=1;
    IISCLC=1;
}
/**************检查应答位*******************/
INT8U IICRecAck(void)
{
    INT8U cy;
    IISCLC = 0;
    IISCL  = 0;
    IISDAC = 1;
    Nop();
    IISCL = 1;
    Nop();
    if(IISDA){                 //因为返回值总是放在CY中的
        cy=1;//失败
    }else{
        cy=0;//成功
    }
    IISCL=0;
    return(cy);
}
/***************对IIC总线产生应答*******************/
void IICACK(void)
{
    IISCLC=0;
    IISDAC=0;
    IISCL=0;
    Nop();
    IISDA=0;
    Nop();
    IISCL=1;
    Nop();
    IISCL=0;
    IISDAC=1;
    IISDA=1;
}
/*****************不对IIC总线产生应答***************/
void IICNoAck(void)
{
    IISCLC=0;
    IISDAC=0;
    IISCL=0;
    Nop();
    IISDA=1;
    Nop();
    IISCL=1;
    Nop();
    IISCL=0;
    IISDAC=1;
}
/*******************向IIC总线写数据*********************/
void IICSendByte(unsigned char sendbyte)
{
    unsigned char j;
    j=0;
    IISCLC=0;
    IISDAC=0;
    for(j=0;j<8;j++){
        Nop();
        IISCL=0;
        Nop();
        if(sendbyte&0x80){
            IISDA=1;
        }else{
            IISDA=0;
        }
        Nop();
        sendbyte=sendbyte<<1;     
        IISCL=1;   
    }
    Nop();
    IISCL=0;
    Nop();
}
/**********************从IIC总线上读数据子程序**********/
unsigned char IICReceiveByte(void)
{
    unsigned char receivebyte,i;
    i=8;
    receivebyte=0;
    IISCLC=0;
    IISDAC=1;
    Nop();
    IISCL=0;
    while(i--){
        Nop();
        receivebyte=receivebyte<<1;
        IISCL=1;
        Nop();
        if(IISDA){
            receivebyte=receivebyte+1;
        }
        IISCL=0;
    }
    Nop();
    return(receivebyte);
}

/***************一个简单延时程序************************/
void IICDelay(unsigned char DelayCount)
{
    while(DelayCount--);
}

void  Nop(void)
{
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}

⌨️ 快捷键说明

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