新聞中心

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

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

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

        //---------------------------------------------------------------
        //向器件指定地址按頁寫函數(這里雖然是說按頁,其實原理是一樣的~~,要是不明白可以看上一篇我整理的)
        //入口參數有4個:器件地址碼、器件單元地址、寫入的數據串的指針、寫入的字節個數
        //寫入成功,返回1;不成功,返回0,使用后必須結束總線
        bit mcu_send_string(uchar add,uchar rom_add,uchar *s,uchar num)
        {
        uchar i;
        IIC_start();
        send_byte(add);//發送器件地址碼
        IIC_ack_acc();
        if(ack==0)
        return(0);//有應答,發送ROM的單元地址
        send_byte(rom_add);
        IIC_ack_acc();
        if(ack==0)
        return(0);
        for(i=0;i //連續發送num個字節數據
        {
        send_byte(*s);
        IIC_ack_acc();
        if(ack==0)
        return(0);
        s++;
        }
        IIC_stop();
        return(1);
        }

        4)從被控器件讀取n個字節數據子程序MCU_RDN_BYTE

        ;--------------------------------------------------------------------------------
        ;從器件地址讀取N個數據
        ;入口參數:器件從地址,器件子地址SUBA,接收字節數NUM_BYTE
        ;出口參數:接收數據緩沖區
        ;占用:A,R0,R1,R2,R3,CY
        MCU_RDN_BYTE:
        MOVR3,NUM_BYTE
        LCALLSTART
        MOVA,SLA
        LCALLWR_BYTE;發送器件地址
        LCALLCACK
        JNBACK,RET_RDN
        MOVA,SUBA;指定子地址
        LCALLWR_BYTE
        LCALLCACK
        LCALLSTART
        MOVA,SLA
        INCA;準備進行讀操作
        LCALLWR_BYTE
        LCALLCACK
        JNBACK,MCU_RDN_BYTE
        MOVR1,#MRD
        RDN1:
        LCALLRD_BYTE;讀操作開始
        MOV@R1,A
        DJNZR3,SACK
        LCALLMNACK;最后一個字節發非應答位
        RET_RDN:
        LCALLSTOP
        RET
        SACK:
        LCALLMACK;發送應答位
        INCR1
        SJMPRDN1

        //-------------------------------------------------------------------------------
        //從器件指定地址讀多個字節
        //入口參數有4個:器件地址碼、器件單元地址、讀出的數據串、讀出的字節個數,寫入成功返回1,不成功返回0
        bit mcu_rec_string(uchar add,uchar rom_add,uchar *s,uchar num)
        {
        uchar i;
        IIC_start();
        send_byte(add); //發送器件的地址碼,這里最低位為0,寫
        IIC_ack_acc();
        if(ack==0)
        return(0);
        send_byte(rom_add);//發送器件的單元地址
        IIC_ack_acc();
        if(ack==0)
        return(0);
        IIC_start(); //重新發送開始信號,開始讀取數據
        send_byte(add+1);//發送器件的地址碼,這里最后一位為1,讀
        IIC_ack_acc();
        if(ack==0)
        return(0);
        for(i=0;i{
        *s=rec_byte();
        IIC_ack_send(0); //送應答信號
        s++;
        }
        *s=rec_byte();
        IIC_ack_send(1); //送非應答信號
        IIC_stop();
        return(1);

        }

        總算是好了~~呵呵,哦了,整理好了~~要是哪里不對~~我就shit了



        上一頁 1 2 3 4 下一頁

        關鍵詞: 51單片機IIC軟件通用

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 开化县| 偃师市| 尖扎县| 德清县| 浦城县| 延津县| 安乡县| 南投市| 同江市| 彭州市| 中牟县| 图木舒克市| 永宁县| 南丰县| 辰溪县| 姚安县| 苗栗市| 汉沽区| 平谷区| 西乌珠穆沁旗| 西乌| 莎车县| 大厂| 湘潭市| 汶上县| 玉环县| 阿坝| 灵川县| 根河市| 应用必备| 崇文区| 灵璧县| 高碑店市| 澄江县| 溧水县| 芦山县| 铜山县| 即墨市| 普兰县| 阿克陶县| 滕州市|