新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC單片機訪問鐵電存儲器的程序模塊

        PIC單片機訪問鐵電存儲器的程序模塊

        作者: 時間:2016-11-13 來源:網絡 收藏
        //此子程序用于PIC系列單片機鐵電存儲器FM24C04交換數據

        #define bitset(var,bitno) ((var)|=(1<<(bitno)))
        #define bitclr(var,bitno) ((var)&=((1<
        //定義鐵電的寫地址和讀地址
        //用高256字節,則為A2 A3
        //用低256字節,則為A0 A1

        #define WriteDeviceAdd 0xa2 //用高256字節
        #define ReadDeviceAdd 0xa3 //用高256字節

        #define SDA RC3
        #define SCL RC2

        /********************************************************************/
        void I2C_Start()
        {
        SDA=1;
        SCL=1;
        SDA=0;
        SCL=0;
        }

        /********************************************************************/
        void I2C_Stop()
        {
        SCL=0;
        SDA=0;
        SCL=1;
        SDA=1;
        }

        /********************************************************************/
        bit I2C_WaitAck()
        {
        uchar ErrorTime=255;
        SDA=1;
        SCL=1;
        bitset(TRISC,3);
        while(SDA)
        {
        ErrorTime--;
        if(ErrorTime==0)
        {
        bitclr(TRISC,3);
        I2C_Stop();
        return(0);
        }
        }
        bitclr(TRISC,3);
        SCL=0;
        return(1);
        }

        /********************************************************************/
        void I2C_SendNotAck()
        {
        SDA=1;
        SCL=1;
        SCL=0;
        }

        /*******************************************************************/
        void I2C_SendAck()
        {
        SDA=0;
        SCL=1;
        SCL=0;
        }

        /********************************************************************/
        void I2C_WriteByte(uchar input)
        {
        uchar i=8;
        while(i--)
        {
        SCL=0;
        if(input&0x80) SDA=1;
        else SDA=0;
        input=input<<1;
        SCL=1;
        }
        SCL=0;
        }

        /********************************************************************/
        uchar I2C_ReceiveByte()
        {
        uchar i=8,rbyte=0;
        SDA=1;
        bitset(TRISC,3);
        while(i--)
        {
        rbyte=rbyte<<1;
        SCL=1;
        if(SDA) rbyte++;
        SCL=0;
        }
        bitclr(TRISC,3);
        return(rbyte);
        }


        /********************************************************************/
        void I2C_Wr24c04(uchar *Wdata,uchar FmAdd,uchar bytes)
        {
        I2C_Start();
        I2C_WriteByte(WriteDeviceAdd);
        I2C_WaitAck();
        I2C_WriteByte(FmAdd);
        I2C_WaitAck();
        for(;bytes!=0;bytes--)
        {
        I2C_WriteByte(*Wdata);
        I2C_WaitAck();
        Wdata++;
        }
        I2C_Stop();
        }

        /********************************************************************/
        void I2C_Rd24c04(uchar *RamAdd,uchar FmAdd,uchar bytes)
        {
        I2C_Start();
        I2C_WriteByte(WriteDeviceAdd);
        I2C_WaitAck();
        I2C_WriteByte(FmAdd);
        I2C_WaitAck();
        I2C_Start();
        I2C_WriteByte(ReadDeviceAdd);
        I2C_WaitAck();
        while(bytes!=1)
        {
        *RamAdd=I2C_ReceiveByte();
        I2C_SendAck();
        RamAdd++;
        bytes--;
        }
        *RamAdd=I2C_ReceiveByte();
        I2C_SendNotAck();
        I2C_Stop();
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 柯坪县| 新巴尔虎左旗| 孟连| 阿拉善左旗| 双辽市| 苏州市| 瑞丽市| 禹城市| 曲沃县| 忻州市| 云龙县| 板桥市| 颍上县| 靖安县| 五常市| 江西省| 德兴市| 安吉县| 闵行区| 芜湖市| 房产| 延川县| 海口市| 丹阳市| 平山县| 泾川县| 孝昌县| 淮安市| 天柱县| 河西区| 丘北县| 偏关县| 平阴县| 旺苍县| 沙田区| 灵丘县| 遂昌县| 新乡市| 枝江市| 扎囊县| 开江县|