日本久久久久曰精品免费,国产精品一级二级三级,乱子伦av无码中文字幕s,国产成人精品一区免费视频

技術熱線: 4007-888-234

技術支持

用c語言實現24LC256讀寫

更新時間: 2019-03-23

用c語言實現24LC256讀寫

#i nclude
unsigned char i=0;
unsigned char receive=0x00;

void i2c_start()
{
    SEN=1;   //啟動
    do{
    }while(SSPIF==0);
    SSPIF=0;
}

void i2c_stop()
{
    PEN=1;       //產生停止條件
    do{
    ;
    }while(SSPIF==0);
    SSPIF=0;
}

void i2c_restart()
{
    RSEN=1;  //啟動,反復啟動
    do{
    ;
    }while(SSPIF==0);
    SSPIF=0;
}

void i2c_dataout()   //數據發送等待過程
{
    do{
    ;
    }while(SSPIF==0);
    SSPIF=0;
}

void i2c_datain()   //讀取24LC256時,不是讀的最后一個字節時使用
{
    RCEN=1;
    do{
    ;
    }while(SSPIF==0);
    SSPIF=0;
    receive=SSPBUF;
    ACKDT=0;
    ACKEN=1;
    do{
    ;
    }while(SSPIF==0);
    SSPIF=0;
}

void i2c_datainlast()   //讀取最后一個字節,或只讀取24lc256中一個字節
{
    SSPIF=0;
    RCEN=1;
    do{
    ;
    }while(SSPIF==0);
    SSPIF=0;
    receive=SSPBUF;
    ACKDT=1 ;
    ACKEN=1;
    do{
    ;
    }while(SSPIF==0);
    SSPIF=0;
    
}

void i2c_error()
{
    i2c_stop();
    return;
}

void write(unsigned int addr,unsigned char data,unsigned int n)  //向iic寫入一字節數據 地址,數據,字節個數
{
    i2c_start();
    SSPBUF=0xA0;//EEPROM尋址碼和寫操作命令碼
    i2c_dataout(); //發送
    
    if(ACKSTAT)
    i2c_error();   //無應答,錯誤!
    else if(!ACKSTAT)
    SSPBUF=addr/256;
        //高eeaddr/256  ,取eeprom數據地址高字節
    i2c_dataout(); //發送
    
    if(ACKSTAT)
    i2c_error();   //無應答,錯誤!
    else if(!ACKSTAT)
    SSPBUF=addr%256;//低eeaddr%256 ,取eeprom數據地址低字節
    i2c_dataout(); //發送
    
    for(i=0;i    {
        if(ACKSTAT)//應答
        i2c_error();  //無應答,錯誤!
        else if(!ACKSTAT)
        SSPBUF=data;//eedata      入eeprom的數據
        i2c_dataout();//發送
    }
    
    if(ACKSTAT)//應答
    i2c_error();
    
    i2c_stop();   //產生停止位,啟動eeprom內部些過程
    
    do{
    i2c_start();
    SSPBUF=0xA0;
    i2c_dataout();
    i2c_stop();
    if(!ACKSTAT)break;
    }while(ACKSTAT);
}

unsigned int current_read(void)//current address read ok!
{
    i2c_start();
    SSPBUF=0xA1;//尋址命令碼0xA0 和 讀命令
    i2c_dataout();
    if(ACKSTAT)//應答
    i2c_error();
    else if(!ACKSTAT)
    i2c_datainlast();
    i2c_stop();

    return ((unsigned int)receive);
}

unsigned int random_read(unsigned int eepromaddress)
{
    i2c_start();
    SSPBUF=0xA0;//EEPROM尋址碼和寫操作命令碼
    i2c_dataout(); //發送
    
    if(ACKSTAT)
    i2c_error();   //無應答,錯誤!
    else if(!ACKSTAT)
    SSPBUF=eepromaddress/256;
        //高eeaddr/256  ,取eeprom數據地址高字節
    i2c_dataout(); //發送
    
    if(ACKSTAT)
    i2c_error();   //無應答,錯誤!
    else if(!ACKSTAT)
    SSPBUF=eepromaddress%256;//低eeaddr%256 ,取eeprom數據地址低字節
    i2c_dataout(); //發送
    
    if(ACKSTAT)
    i2c_error();   //無應答,錯誤!
    else if(!ACKSTAT)
        
    i2c_restart();
    SSPBUF=0xA1;//尋址命令碼0xA0 和 讀命令
    i2c_dataout();
    
    if(ACKSTAT)//應答
    i2c_error();
    else if(!ACKSTAT)
    i2c_datainlast();
    i2c_stop();
     return ((unsigned int)receive);
    
}

void i2c_init()
{
    SSPSTAT=0x00;
    TRISC=0xD8;
    SSPADD=19;
    SSPIE=0;
    SSPCON=0x28;    
}


//在主程序中,先i2c_init();然后開始讀/寫24LC256中數據,經多次運行
  no bug
//程序中的寄存器必須芯片內部包含,否則無法實現硬件iic讀寫。

404
返回首頁 |  返回上一頁
主站蜘蛛池模板: 舟山市| 伊吾县| 盐边县| 来凤县| 吉木萨尔县| 罗平县| 个旧市| 萨嘎县| 巩留县| 安仁县| 牙克石市| 乌恰县| 突泉县| 江北区| 延安市| 新建县| 十堰市| 永胜县| 湘潭市| 衡阳县| 温泉县| 寿宁县| 图们市| 吉林省| 镇安县| 襄汾县| 卫辉市| 枣阳市| 酉阳| 松桃| 华容县| 凤台县| 平昌县| 鄂州市| 通化县| 沈阳市| 盐边县| 长葛市| 千阳县| 永登县| 乌苏市|