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


  • 相关阅读:
    poj 3436 (最大流)
    C#.NET学习笔记11,12---布尔表达式2组合,if语句
    C++编程规范和标准总结
    hdu 4627 水数学题
    jquery第二期:三个例子带你走进jquery
    Java核心技术,让计算机"一芯多用"的多线程技术
    leetcode_question_73 Set Matrix Zeroes
    Frame动画
    HDU 4602 Partition
    Linux Kernel代码艺术——系统调用宏定义
  • 原文地址:https://www.cnblogs.com/hnrainll/p/1916439.html
Copyright © 2020-2023  润新知