新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機I2C驅動子程序

        單片機I2C驅動子程序

        作者: 時間:2016-12-02 來源:網絡 收藏
        晶振11.0592M/********************************************************************/
        /*******************I2C模擬通信及AT24C02底層驅動程序****************/
        /********************************************************************/
        //AT24C02
        //delayus: 延時約5us
        void delayus()
        {
        ;;
        }
        //i2c:init I2C總線初始化
        void i2c_init()
        {
        SCL = 1;
        delayus();
        SDA = 1;
        delayus();
        }
        //lcd:start 起始信號
        void start()
        {
        SCL = 1;
        SDA = 1;
        delayus();
        SDA = 0;
        delayus();
        }
        //i2c:stop 停止信號
        void stop()
        {
        SCL = 1;
        SDA = 0;
        delayus();
        SDA = 1;
        delayus();
        }
        //i2c:ack 從機應答信號
        void ack()
        {
        uchar i = 0;
        //在SCL = 1時,讀取SDA的數據判忙
        SCL = 1;
        delayus();
        while((SDA == 1)&& i < 250)
        i++;
        //判忙之后,等待發送數據/命令
        SCL = 0;
        delayus();
        }
        //nack: 主機非應答信號
        void nack()
        {
        //主機發送非應答信號1
        SCL = 1;
        delayus();
        SDA = 1;
        delayus();
        //等待發送數據/命令
        SCL = 0;
        delayus();
        }
        //write:byte 寫一個字節數據
        void write_byte(uchar date)
        { //從最高位發送
        uchar i, temp;
        temp = date;
        for(i = 0; i < 8; i++)
        {
        temp <<= 1;
        SCL = 0;
        delayus();
        SDA = CY;
        delayus();
        SCL = 1;
        delayus();
        SCL = 0;
        delayus();
        }
        //等待從機應答
        SCL = 0;
        delayus();
        SDA = 1;//置1,等待從機應答0
        delayus();
        }
        //read:byte 讀一個字節數據
        uchar read_byte()
        {
        uchar i, j, k;
        SCL = 0;
        delayus();
        for(i =0; i < 8; i++)
        {
        SCL = 1;
        delayus();
        j = SDA;
        k = (k << 1) | j;
        delayus();
        SCL = 0;
        delayus();
        }
        delayus();
        return (k);
        }
        //write:AT24C02 寫AT24C02
        void write_c02(uchar address, uchar date)
        {
        start();
        write_byte(write_add);
        ack();
        write_byte(address);
        ack();
        write_byte(date);
        ack();
        stop();
        delay(12);
        }
        //read:AT24C02 讀AT24C02
        uchar read_c02(uchar add)
        {
        uchar date = 0;
        start();
        write_byte(write_add);
        ack();
        write_byte(add);
        ack();
        start();
        write_byte(read_add);
        ack();
        date = read_byte();
        nack();
        return (date);
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 和林格尔县| 慈溪市| 黎川县| 江北区| 盖州市| 灵山县| 柏乡县| 青州市| 郁南县| 英吉沙县| 鸡西市| 太保市| 九台市| 襄樊市| 平顶山市| 犍为县| 清新县| 南乐县| 绩溪县| 丰镇市| 巴里| 古浪县| 马尔康县| 张家界市| 梓潼县| 利津县| 平山县| 大渡口区| 淮滨县| 务川| 吉安市| 额敏县| 霍林郭勒市| 新疆| 镇安县| 汽车| 沧州市| 建瓯市| 化州市| 荆州市| 沈丘县|