【PIC学习第18例】PIC16F877A 内部EEPROM读写实验

 

代码
/******************************************
******PIC16F877A 内部EEPROM读写实验*******
Author:hnrain
Date:2010-12-25
Version:V0.1
Email:hnrain1004@gmail.com
Forum:http://bbs.cepark.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写操作中断标志位
1 = 写操作完成(必须软件清零)
0 = 写操作未完成或还未开始
bit3 WRERR:EEPROM错误标志位
1 = 写操作过早终止
0 = 写操作已完成
bit2 WREN:EEPROM写使能位
1 = 允许写入
0 = 禁止写入EEPROM
bit1 WR:写操作控制位
1 = 启动写周期,一旦写入完成,该位将被硬件清零
写操作控制位只能用软件置"1"
0 = EEPROM的写周期已完成
bit0 RD:读控制位
1 = 启动EEPROM读操作。读需要一个周期,RD由硬件清零
RD只能用软件置“1”
0 = 未启动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;
//定义全局变量

void main(void) //主函数
{
uint8 k;
PORTD
= 0xff; //PORTD赋FF
TRISD = 0x00;//PORTD为输出

for(k = 0;k < 7; k++)
{
WriteEE(k,k
+1); //循环调用EEPROM写函数,向地址为0~7的写入1~8
}
while(1)
{

cydata
= ReadEE(0);//读取EEPROM的地址0数据

if(cydata == 1)
{
RD0
= 0; //判断EEPROM地址0里的数据是不是为1,为1则点亮LED0
}
}
}

//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;//返回读取的数据
}


 

 

posted @ 2010-12-25 01:44  hnrainll  阅读(4103)  评论(0编辑  收藏  举报