<address id="tnvjh"></address>
    <form id="tnvjh"><listing id="tnvjh"><meter id="tnvjh"></meter></listing></form>

      <form id="tnvjh"></form>

      <address id="tnvjh"><th id="tnvjh"></th></address>

        專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        PIC16F877A 內部EEPROM讀寫實驗

        作者:佚名   來源:不詳   點擊數:  更新時間:2014年08月31日   【字體:

        /******************************************
        ******PIC16F877A 內部EEPROM讀寫實驗*******好象還有點問題,沒有寫進去?
        Author:hnrain
        Date:2010-12-25
        Version:V0.1
        Email:hnrain1004@gmail.com
        _______________________________
        實驗現象:先給內部EEPROM的0~7字節寫數據1~8,再讀出第0字節的
        內容,并判斷讀出來的數據是不是1,如果是1則點亮RD0口的LED。

        重點內容:
        內部EEPROM的操作主要通過4個寄存器
        EECON1,EECON2,EEDATA,EEADR
        EEDATA寄存器存放8位讀寫數據
        EEADR存放EEPROM被訪問過的地址
        EECON1寄存器定義:
        bit7:5 未用;讀為0
        bit4   EEIF:EEPROM寫操作中斷標志位
         = 寫操作完成(必須軟件清零)
         = 寫操作未完成或還未開始
        bit3   WRERR:EEPROM錯誤標志位
         = 寫操作過早終止
         = 寫操作已完成
        bit2   WREN:EEPROM寫使能位
         = 允許寫入
         = 禁止寫入EEPROM
        bit1   WR:寫操作控制位
         = 啟動寫周期,一旦寫入完成,該位將被硬件清零
                    寫操作控制位只能用軟件置"1"
         = EEPROM的寫周期已完成
        bit0   RD:讀控制位
         = 啟動EEPROM讀操作。讀需要一個周期,RD由硬件清零
                   RD只能用軟件置“1”
         = 未啟動EEPROM讀操作
        寫入EEPROM有一個特定的過程:將55H寫入EECON2,將AAH寫入EECON2
        然后將WR位置1
        *******************************************/
        #include <pic.h>
        #include "../head/config.h"
        __CONFIG(HS&WDTDIS&LVPDIS&PWRTEN);   
        //HS振蕩,禁止看門狗,低壓編程關閉,啟動延時定時器

        void WriteEE(uint8 addr,uint8 data);//EEPROM寫函數
        uint8 ReadEE(uint8 addr);   //EEPROM讀函數
        uint8 cydata;   //定義全局變量
        oid DelayMs(unsigned int t)
        {
         unsigned int i,j;
         for(i=0;i<t;i++)
         {
          for(j=0;j<10;j++);
         }
        }
        void Display(unsigned char num,unsigned char data)             
        {
         PORTD = TABLE[data]; //取出數據,送D口顯示
         PORTC = 0x01;
         switch(num)
         {
          case 0:
           PORTA = 0x01;
           break;
          case 1:
           PORTA = 0x02;
           break;
          case 2:
           PORTA = 0x04;
           break;
          case 3:
           PORTA = 0x06;
           break;
          case 4:
           PORTA = 0x08;
           break;
          case 5:
           PORTA = 0x0A;
           break;
          case 6:
           PORTA = 0x0C;
           break;
          case 7:
           PORTA = 0x0E;
           break;
          
          default:
           PORTA = 0x00; 
         }
         DelayMs(2);
        }
        void main(void) //主函數
        {
           unsigned char buf;
         GIE =0;
         TRISD = 0;     //portd 輸出
           TRISA = 0;     //porta 輸出
         TRISC = 0;     //porta 輸出
         PORTC = 0x01;     //74HC138控制端口
         DelayMs(50);
         buf=232;
        // writeByte(0x15,buf);
         eeprom_write(0x30,buf);   
         buf = 0;
            DelayMs(50);
        // buf = 0;
        // buf = readByte(0x15);
         buf=eeprom_read(0x30);    //從片內EEPROM中的地址0X10中讀出數據
         
        // GIE = 1;
           while(1)
           {
          Display(0,buf/100);
          Display(1,buf/10%10);
          Display(2,buf%100%10);                         
           }}
        //EEPROM寫數據函數
        void WriteEE(uint8 addr,uint8 data)
        {
            do{}
            while(WR == 1);//等待寫完成
           
           
            EEADR = addr;//寫入地址信息
            EEDATA = data;//寫入數據信息
            EEPGD = 0;//操作EEPROM
             WREN = 1; //寫EEPROM允許
            EECON2 = 0x55;//寫入特定時序
            EECON2 = 0xaa;
            WR = 1; //執行寫操作
            do{}
            while(WR == 1);//等待寫完成
            WREN = 0;//禁止寫入EEPROM
        }
        //EEPROM讀數據函數
        uint8 ReadEE(uint8 addr)
        {
            uint8 num;
            do{}
            while(RD == 1);//等待讀完成
            EEADR = addr;//寫入要讀的址址
            EEPGD = 0;//操作EEPROM
            RD = 1;//執行讀操作
            do{}
            while(RD == 1);//等待讀完成
            num = EEDATA;
            return num;//返回讀取的數據
        }
        關閉窗口
        和老头做爰很舒服,JK白丝裤袜开裆自慰喷水,在线天堂www在线...中文

          <address id="tnvjh"></address>
          <form id="tnvjh"><listing id="tnvjh"><meter id="tnvjh"></meter></listing></form>

            <form id="tnvjh"></form>

            <address id="tnvjh"><th id="tnvjh"></th></address>