打印
[其他产品]

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

[复制链接]
944|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sensitivity|  楼主 | 2020-2-11 15:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/******************************************
******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
******************************************
*/

使用特权

评论回复
沙发
sensitivity|  楼主 | 2020-2-11 15:06 | 只看该作者
#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;   //定义全局变量

使用特权

评论回复
板凳
sensitivity|  楼主 | 2020-2-11 15:06 | 只看该作者
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
    }
}
}

使用特权

评论回复
地板
sensitivity|  楼主 | 2020-2-11 15:06 | 只看该作者
//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
}

使用特权

评论回复
5
sensitivity|  楼主 | 2020-2-11 15:07 | 只看该作者
//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;//返回读取的数据
}

使用特权

评论回复
6
sensitivity|  楼主 | 2020-2-11 15:07 | 只看该作者
作者:Leo Chin
出处:http://www.cnblogs.com/hnrainll/
本博客**,大多系网络中收集,转载请注明出处
相关标签:嵌入式培训、嵌入式开发、嵌入式学习

使用特权

评论回复
7
幸福小强| | 2020-2-13 10:47 | 只看该作者
好多教材就是用这个型号讲的

使用特权

评论回复
8
王东东| | 2020-2-29 21:46 | 只看该作者
还不错哦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

216

帖子

0

粉丝