专注电子技术学习与研究
当前位置:单片机教程网 >> 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;//返回读取的数据
}
关闭窗口