色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

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

          作者: 時間:2011-02-16 來源:網(wǎng)絡 收藏


          #include
          unsignedchari=0;
          unsignedcharreceive=0x00;

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

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

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

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

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

          voidi2c_datainlast()//讀取最后一個字節(jié),或只讀取24lc256中一個字節(jié)
          {
          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寫入一字節(jié)數(shù)據(jù)地址,數(shù)據(jù),字節(jié)個數(shù)
          {
          i2c_start();
          SSPBUF=0xA0;//EEPROM尋址碼和寫操作命令碼
          i2c_dataout();//發(fā)送

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

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

          for(i=0;i{
          if(ACKSTAT)//應答
          i2c_error();//無應答,錯誤!
          elseif(!ACKSTAT)
          SSPBUF=data;//eedata入eeprom的數(shù)據(jù)
          i2c_dataout();//發(fā)送
          }

          if(ACKSTAT)//應答
          i2c_error();

          i2c_stop();//產(chǎn)生停止位,啟動eeprom內(nèi)部些過程

          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();//發(fā)送

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

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

          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中數(shù)據(jù),經(jīng)多次運行
          nobug
          //程序中的寄存器必須芯片內(nèi)部包含,否則無法實現(xiàn)硬件iic讀寫。



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




          評論


          相關推薦

          技術專區(qū)

          關閉