新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機—再論IIC—軟件通用包(匯編、c語言)—03

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

        作者: 時間:2016-11-25 來源:網絡 收藏

        1)發送一字節數據WR_BYTE

        該子程序是向虛擬的IIC總顯得數據線SDA上發送一字節數據的操作。調用該子程序前,將要發送的數據送入A中。

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

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

        //----------------------------------------------------------------------
        //寫一個字節函數
        void send_byte(uchar c)
        {
        uchar bit_cnt;
        for(bit_cnt=0;bit_cnt<8;bit_cnt++)//循環傳送8位
        {
        if((c< //取當前發送位
        sda=1;
        else
        sda=0;
        _nop_();
        scl=1;//發送到數據線上
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        scl=0;
        }
        }

        2)接收一字節數據RD_BYTE(這個的匯編感覺并不肯定,有可能有錯~~,當然c語言還是沒問題的,呵呵)

        ;----------------------------------------------------------------------
        ;讀取字節子程序
        ;讀出的值再ACC中
        ;每取一個字節要發送一個應達或者非應答信號(要知道你讀取就成了從機,就要發送一個信號告訴主機)
        RD_BYTE:
        MOVR0,#08H;8位數據長度
        R_LP:
        SETBSDA;置SDA為輸入方式
        NOP
        CLRSCL;置時鐘線為低電平,準備接收數據
        NOP
        NOP
        NOP
        NOP
        NOP
        SETBSCL
        NOP
        MOVC,SDA;讀取數據位
        RLCA;進行數據位的處理
        NOP
        DJNZR0,R_LP;沒有到8位,再來一次
        RET

        //------------------------------------------------------------------------
        //接收一個字節函數
        //返回接收的8位數據
        uchar rec_byte()
        {
        uchar temp;
        uchar bit_cnt;
        temp=0;
        sda=1; //置數據線為輸入方式
        for(bit_cnt=0;bit_cnt<8;bit_cnt++)
        {
        _nop_();
        scl=0; //置時鐘線為低電平,準備接收數據
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        scl=1;
        _nop_();
        _nop_();
        temp<<=1;
        if(sda==1)//接收當前數據位,接收內容放入temp中
        temp+=1;
        _nop_();
        _nop_();
        }
        scl=0;
        _nop_();
        _nop_();
        return(temp);
        }

        3)向被控器件發送n個字節數據子程序MCU_WRN_BYTE

        ;-----------------------------------------------------------------------
        ;向器件指定地址寫入N個數據
        ;入口參數:器件從地質SLA,器件子地址SUBA、發送數據緩沖區MTD、發送字節數NUMBYTE
        ;占用:A,R0,R1,R3,CY
        MCU_WRN_BYTE:
        MOVA,NUM_BYTE
        MOVR3,A
        LCALLSTART;啟動總線
        MOVA,SLA
        LCALLWR_BYTE;發送器件地址
        LCALLCACK
        JNBACK,RET_WRN
        MOVA,SUBA;指定子地址,并發送
        LCALLWR_BYTE
        LCALLCACK
        MOVR1,#MTD
        WRN_DA:
        MOVA,@R1
        LCALLWR_BYTE;開始寫入數據
        LCALLCACK
        JNBACK,MCU_WRN_BYTE
        INCR1
        DJNZR3,WRN_DA;判斷寫完沒有
        RET_WRN:
        LCALLSTOP
        RET



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 洪雅县| 兴国县| 井冈山市| 磴口县| 靖州| 富蕴县| 饶河县| 娄底市| 海南省| 平山县| 河间市| 福清市| 无棣县| 武夷山市| 利津县| 苍南县| 元氏县| 芦山县| 定南县| 和硕县| 古蔺县| 陆川县| 兴安盟| 沾益县| 涟水县| 伊宁市| 夏邑县| 阳城县| 东明县| 赫章县| 呼伦贝尔市| 怀来县| 安丘市| 六枝特区| 平乡县| 房山区| 闻喜县| 龙井市| 汉寿县| 信宜市| 襄城县|