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

PIC16F877A 內(nèi)部EEPROM讀寫實驗

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

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

重點內(nèi)容:
內(nèi)部EEPROM的操作主要通過4個寄存器
EECON1,EECON2,EEDATA,EEADR
EEDATA寄存器存放8位讀寫數(shù)據(jù)
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寫函數(shù)
uint8 ReadEE(uint8 addr);   //EEPROM讀函數(shù)
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]; //取出數(shù)據(jù),送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) //主函數(shù)
{
   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);    //從片內(nèi)EEPROM中的地址0X10中讀出數(shù)據(jù)
 
// GIE = 1;
   while(1)
   {
  Display(0,buf/100);
  Display(1,buf/10%10);
  Display(2,buf%100%10);                         
   }}
//EEPROM寫數(shù)據(jù)函數(shù)
void WriteEE(uint8 addr,uint8 data)
{
    do{}
    while(WR == 1);//等待寫完成
   
   
    EEADR = addr;//寫入地址信息
    EEDATA = data;//寫入數(shù)據(jù)信息
    EEPGD = 0;//操作EEPROM
     WREN = 1; //寫EEPROM允許
    EECON2 = 0x55;//寫入特定時序
    EECON2 = 0xaa;
    WR = 1; //執(zhí)行寫操作
    do{}
    while(WR == 1);//等待寫完成
    WREN = 0;//禁止寫入EEPROM
}
//EEPROM讀數(shù)據(jù)函數(shù)
uint8 ReadEE(uint8 addr)
{
    uint8 num;
    do{}
    while(RD == 1);//等待讀完成
    EEADR = addr;//寫入要讀的址址
    EEPGD = 0;//操作EEPROM
    RD = 1;//執(zhí)行讀操作
    do{}
    while(RD == 1);//等待讀完成
    num = EEDATA;
    return num;//返回讀取的數(shù)據(jù)
}
關閉窗口