<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)—再論IIC—軟件通用包(匯編、c語(yǔ)言)—03

          51單片機(jī)—再論IIC—軟件通用包(匯編、c語(yǔ)言)—03

          作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏

          1)發(fā)送一字節(jié)數(shù)據(jù)WR_BYTE

          該子程序是向虛擬的IIC總顯得數(shù)據(jù)線SDA上發(fā)送一字節(jié)數(shù)據(jù)的操作。調(diào)用該子程序前,將要發(fā)送的數(shù)據(jù)送入A中。

          還是先匯編,然后c代碼:

          ;-----------------------------------------------------------------
          ;發(fā)送字節(jié)子程序
          ;字節(jié)數(shù)據(jù)放入ACC
          ;每發(fā)送一個(gè)字節(jié)筪掉用一次CACK(檢測(cè)應(yīng)答子程序),取應(yīng)答位
          WR_BYTE:
          MOVR0,#08H;8位數(shù)據(jù)長(zhǎng)度送R0
          W_LP:
          RLCA;發(fā)送數(shù)據(jù)左移,使發(fā)送位入c
          JCW_R1;判讀發(fā)送1,還是發(fā)送0,發(fā)送1,轉(zhuǎn)入W_R1
          SJMPW_R0;發(fā)送0轉(zhuǎn)入W_R0
          W_LP1:
          DJNZR0,W_LP
          NOP
          RET
          W_R1: ;發(fā)送1
          SETBSDA
          NOP
          SETBSCL
          NOP
          NOP
          NOP
          NOP
          NOP
          CLRSCL
          SJMPW_LP1
          W_R0: ;發(fā)送0
          CLRSDA
          NOP
          SETBSCL
          NOP
          NOP
          NOP
          NOP
          NOP
          CLRSCL
          SJMPW_LP1

          //----------------------------------------------------------------------
          //寫(xiě)一個(gè)字節(jié)函數(shù)
          void send_byte(uchar c)
          {
          uchar bit_cnt;
          for(bit_cnt=0;bit_cnt<8;bit_cnt++)//循環(huán)傳送8位
          {
          if((c< //取當(dāng)前發(fā)送位
          sda=1;
          else
          sda=0;
          _nop_();
          scl=1;//發(fā)送到數(shù)據(jù)線上
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          scl=0;
          }
          }

          2)接收一字節(jié)數(shù)據(jù)RD_BYTE(這個(gè)的匯編感覺(jué)并不肯定,有可能有錯(cuò)~~,當(dāng)然c語(yǔ)言還是沒(méi)問(wèn)題的,呵呵)

          ;----------------------------------------------------------------------
          ;讀取字節(jié)子程序
          ;讀出的值再ACC中
          ;每取一個(gè)字節(jié)要發(fā)送一個(gè)應(yīng)達(dá)或者非應(yīng)答信號(hào)(要知道你讀取就成了從機(jī),就要發(fā)送一個(gè)信號(hào)告訴主機(jī))
          RD_BYTE:
          MOVR0,#08H;8位數(shù)據(jù)長(zhǎng)度
          R_LP:
          SETBSDA;置SDA為輸入方式
          NOP
          CLRSCL;置時(shí)鐘線為低電平,準(zhǔn)備接收數(shù)據(jù)
          NOP
          NOP
          NOP
          NOP
          NOP
          SETBSCL
          NOP
          MOVC,SDA;讀取數(shù)據(jù)位
          RLCA;進(jìn)行數(shù)據(jù)位的處理
          NOP
          DJNZR0,R_LP;沒(méi)有到8位,再來(lái)一次
          RET

          //------------------------------------------------------------------------
          //接收一個(gè)字節(jié)函數(shù)
          //返回接收的8位數(shù)據(jù)
          uchar rec_byte()
          {
          uchar temp;
          uchar bit_cnt;
          temp=0;
          sda=1; //置數(shù)據(jù)線為輸入方式
          for(bit_cnt=0;bit_cnt<8;bit_cnt++)
          {
          _nop_();
          scl=0; //置時(shí)鐘線為低電平,準(zhǔn)備接收數(shù)據(jù)
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          scl=1;
          _nop_();
          _nop_();
          temp<<=1;
          if(sda==1)//接收當(dāng)前數(shù)據(jù)位,接收內(nèi)容放入temp中
          temp+=1;
          _nop_();
          _nop_();
          }
          scl=0;
          _nop_();
          _nop_();
          return(temp);
          }

          3)向被控器件發(fā)送n個(gè)字節(jié)數(shù)據(jù)子程序MCU_WRN_BYTE

          ;-----------------------------------------------------------------------
          ;向器件指定地址寫(xiě)入N個(gè)數(shù)據(jù)
          ;入口參數(shù):器件從地質(zhì)SLA,器件子地址SUBA、發(fā)送數(shù)據(jù)緩沖區(qū)MTD、發(fā)送字節(jié)數(shù)NUMBYTE
          ;占用:A,R0,R1,R3,CY
          MCU_WRN_BYTE:
          MOVA,NUM_BYTE
          MOVR3,A
          LCALLSTART;啟動(dòng)總線
          MOVA,SLA
          LCALLWR_BYTE;發(fā)送器件地址
          LCALLCACK
          JNBACK,RET_WRN
          MOVA,SUBA;指定子地址,并發(fā)送
          LCALLWR_BYTE
          LCALLCACK
          MOVR1,#MTD
          WRN_DA:
          MOVA,@R1
          LCALLWR_BYTE;開(kāi)始寫(xiě)入數(shù)據(jù)
          LCALLCACK
          JNBACK,MCU_WRN_BYTE
          INCR1
          DJNZR3,WRN_DA;判斷寫(xiě)完沒(méi)有
          RET_WRN:
          LCALLSTOP
          RET



          關(guān)鍵詞: 51單片機(jī)IIC軟件通用

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();