新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用c語言實現24LC256讀寫(非軟件模擬方式)

        用c語言實現24LC256讀寫(非軟件模擬方式)

        作者: 時間:2011-02-16 來源:網絡 收藏


        #include
        unsignedchari=0;
        unsignedcharreceive=0x00;

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

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

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

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

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

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

        }

        voidi2c_error()
        {
        i2c_stop();
        return;
        }

        voidwrite(unsignedintaddr,unsignedchardata,unsignedintn)//向iic寫入一字節數據地址,數據,字節個數
        {
        i2c_start();
        SSPBUF=0xA0;//EEPROM尋址碼和寫操作命令碼
        i2c_dataout();//發送

        if(ACKSTAT)
        i2c_error();//無應答,錯誤!
        elseif(!ACKSTAT)
        SSPBUF=addr/256;
        //高eeaddr/256,取eeprom數據地址高字節
        i2c_dataout();//發送

        if(ACKSTAT)
        i2c_error();//無應答,錯誤!
        elseif(!ACKSTAT)
        SSPBUF=addr%256;//低eeaddr%256,取eeprom數據地址低字節
        i2c_dataout();//發送

        for(i=0;i{
        if(ACKSTAT)//應答
        i2c_error();//無應答,錯誤!
        elseif(!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);
        }

        unsignedintcurrent_read(void)//currentaddressreadok!
        {
        i2c_start();
        SSPBUF=0xA1;//尋址命令碼0xA0和讀命令
        i2c_dataout();
        if(ACKSTAT)//應答
        i2c_error();
        elseif(!ACKSTAT)
        i2c_datainlast();
        i2c_stop();

        return((unsignedint)receive);
        }

        unsignedintrandom_read(unsignedinteepromaddress)
        {
        i2c_start();
        SSPBUF=0xA0;//EEPROM尋址碼和寫操作命令碼
        i2c_dataout();//發送

        if(ACKSTAT)
        i2c_error();//無應答,錯誤!
        elseif(!ACKSTAT)
        SSPBUF=eepromaddress/256;
        //高eeaddr/256,取eeprom數據地址高字節
        i2c_dataout();//發送

        if(ACKSTAT)
        i2c_error();//無應答,錯誤!
        elseif(!ACKSTAT)
        SSPBUF=eepromaddress%256;//低eeaddr%256,取eeprom數據地址低字節
        i2c_dataout();//發送

        if(ACKSTAT)
        i2c_error();//無應答,錯誤!
        elseif(!ACKSTAT)

        i2c_restart();
        SSPBUF=0xA1;//尋址命令碼0xA0和讀命令
        i2c_dataout();

        if(ACKSTAT)//應答
        i2c_error();
        elseif(!ACKSTAT)
        i2c_datainlast();
        i2c_stop();
        return((unsignedint)receive);

        }

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


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



        c語言相關文章:c語言教程




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 泸定县| 合阳县| 运城市| 淮阳县| 麟游县| 德令哈市| 西丰县| 瑞安市| 江陵县| 丹江口市| 上高县| 察隅县| 东源县| 招远市| 灵武市| 襄汾县| 焉耆| 阿荣旗| 汨罗市| 仙居县| 揭东县| 襄汾县| 琼结县| 永嘉县| 宜州市| 望都县| 磐安县| 随州市| 观塘区| 华安县| 广东省| 边坝县| 天祝| 高碑店市| 宁南县| 昌吉市| 屏边| 克拉玛依市| 临潭县| SHOW| 东港市|