新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC16F877A單片機 I2C模塊 24CXXX存儲器實現路徑記憶

        PIC16F877A單片機 I2C模塊 24CXXX存儲器實現路徑記憶

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

        本文引用地址:http://www.104case.com/article/201611/321068.htm

        該過程的部分程序:


        void delay(uint x)
        {
        uint a,b;
        for(a=x;a>0;a--)
        for(b=110;b>0;b--);
        }
        void init() //端口初始化
        {
        TRISB=0X00;
        PORTB=0X00;
        TRISD=0x00;
        PORTD=0x00;
        TRISC=0XFF; //TRISC<4:3>=11即可
        // PORTC=0X00;
        SSPSTAT=0X80;
        SSPCON=0X38;
        SSPCON2=0X00;
        SSPADD=0x09;

        }
        void didi(uchar num) //蜂鳴器,檢測讀寫是否完成
        {
        uchar di_num;
        for(di_num=num;di_num>0;di_num--)
        {
        RD0=1;
        delay(500);
        RD0=0;
        delay(500);
        }
        }
        void write() //寫函數
        {
        uchar i;
        SSPIF=0;
        SEN=1; //啟動信號
        while(!SSPIF); //1的時候是真 0的時候是假 !SSPIF為非真,為假退出語句
        SSPIF=0; //軟件清零 不會自動清零
        SSPBUF=0XA0; //發送設備片選地址 即1010 A0 A1 A2 R/W
        while(!SSPIF); //判斷是否發送完畢
        SSPIF=0;
        SSPBUF=add; //發送E2PROM內存儲地址00~FF
        while(!SSPIF); //監測數據是否發完
        SSPIF=0;
        //此處似乎缺ACK應答
        for(i=0;i<6;i++) //寫入數據
        {
        SSPBUF=ee_data[i];//每發送一個數據都要檢測是否成功
        while(!SSPIF); //判斷
        SSPIF=0;
        }
        PEN=1; //發送停止信號
        while(!SSPIF);//如果收到停止信號同樣會置位
        SSPIF=0;
        didi(1); //如果寫成功發出兩聲嘀嘀 此處可有可無

        }
        void read() //讀函數
        {
        uchar i;
        SSPIF=0;
        SEN=1; // 啟動信號
        while(!SSPIF);//如果啟動成功 置位
        SSPIF=0; //同樣清零
        SSPBUF=0XA0; //發送片選地址 即1010 A0 A1 A2 R/W
        while(!SSPIF); //判斷是否發送完畢
        SSPIF=0;
        //此處似乎也需要應答ACK
        SSPBUF=add; //E2PROM片內寫數據地址從00到FF中的任意一個
        while(!SSPIF); //監測數據是否發完
        SSPIF=0;
        SSPIF=0;
        //又一個ACK應答
        RSEN=1; //重啟信號
        while(!SSPIF); //監測數據是否發完
        SSPIF=0;
        SSPBUF=0XA1; //傳輸方向即開始讀取數據
        while(!SSPIF); //監測數據是否發完
        SSPIF=0;
        for(i=0;i<6;i++) //接受的數據
        {
        RCEN=1;
        while(!SSPIF);
        read_data[i]=SSPBUF;//read_data[i]為SSPBUF中讀回來的數 每讀一次IIC地址自動加1
        while(!SSPIF);
        SSPIF=0; //等待read_data[i]將數據讀走標志位清零

        if(i>=5)
        { ACKDT=1;} //應答標志
        else { ACKDT=0;}

        ACKEN=1;
        while(!SSPIF);
        SSPIF=0;
        }
        //此處好像有一個ACK應答
        PEN=1; //讀操作完畢
        while(!SSPIF); //監測
        SSPIF=0;
        didi(3);
        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 原阳县| 安庆市| 麻城市| 扎囊县| 长宁县| 平邑县| 方城县| 庄浪县| 通州市| 瑞昌市| 黄平县| 容城县| 康平县| 滕州市| 黄山市| 婺源县| 宾阳县| 民县| 青州市| 远安县| 江都市| 德州市| 新郑市| 临颍县| 大连市| 靖远县| 正宁县| 正阳县| 巴楚县| 隆昌县| 富锦市| 澄江县| 湖州市| 马关县| 乐亭县| 宁陕县| 乐东| 达拉特旗| 峡江县| 德庆县| 柳江县|