单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7002|回复: 3
打印 上一主题 下一主题
收起左侧

PIC单片机读内部EEPROM的读写操作子程序

[复制链接]
跳转到指定楼层
楼主
wendi 发表于 2013-7-11 02:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//********************************************************************************
//********************************************************************************
//     pic16f917
//********************************************************************************
unsigned char read_eeprom(unsigned char);
void write_eeprom(unsigned char,unsigned char);
void write_work();
//********************************************************************************

//********************************************************************************
unsigned char read_eeprom(unsigned char addr)
{
     unsigned char num;
     do{;}
     while(RD==1);                        //上一次读操作是否完成
     EEADR=addr;                            //EEPROM地址为00H
     EEPGD=0;                            //指向EEPROM数据储存器
     RD=1;                                //开始读
     do{;}
     while(RD==1);                        //等待读操作完成
     num=EEDATA;                            //读出
     return(num);                        //返回读出的数
}
//********************************************************************************
void write_work()
{
     if((write_dt&0x1) == 0x1)
     {
          write_eeprom(0,sdy_dt);
     }
     if((write_dt&0x2) == 0x2)
     {
          write_eeprom(1,sdy_set);
     }
     if((write_dt&0x4) == 0x4)
     {
          write_eeprom(2,power_dt);
     }
     write_dt=0;
}
//********************************************************************************
void write_eeprom(unsigned char addr,unsigned char data)
{
     do{;}
     while(WR==1);                        //上一次写操作是否完成
     EEADR=addr;                            //EEPROM地址
     EEDATA=data;                        //准备写入EEPROM的数据
     EEPGD=0;                            //指向EEPROM数据储存器
     WREN=1;                                //使能写操作
     EECON2=0x55;                        //设置通用参数
     EECON2=0xAA;                        //设置通用参数
     WR=1;                                //开始写
     do{;}
     while(WR==1);                        //等待写操作完成
     WREN=0;                                //禁止写操作
}
//********************************************************************************
//********************************************************************************
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
sunhaitao 发表于 2013-8-13 17:24 | 只看该作者
单片机讨论群87496842,目前有100多人。

回复

使用道具 举报

板凳
libiaoha 发表于 2013-9-1 11:04 | 只看该作者
我也来凑个热闹:
#define        ReadRomString_CALL
#define        WriteRomString_CALL

//*************************************
// 函数名称:ReadRomByte
// 函数功能:从ROM的某一地址读数据
// 入口参数:所读数据的地址
// 出口参数:所读地址的数据
//***************************************
uint8 ReadRomByte(uint8 addr)
{
    uint8 num;

    while(RD==1);//等待读完成
    EEADR=addr;//写入要读的址址
    EEPGD=0;//操作EEPROM
    RD=1;//执行读操作
    while(RD==1);//等待读完成
    num=EEDATA;
    return num;//返回读取的数据
}
//*************************************
// 函数名称:WriteRomByte
// 函数功能:从RAM的某一地址写数据
// 入口参数:所写数据的地址及数据
// 出口参数:无
//***************************************
void WriteRomByte(uint8 addr,uint8 data)
{
        uint8 Tmp ;
        uint8 i ;

        Tmp = ReadRomByte(addr) ;
        if(Tmp == data) return ; //如果读出数据与要写的数一样 直接返回

        for(i=3;i>0;i--)//最多写三次
        {
            while(WR==1);//等待写完成               
            EEADR=addr;//写入地址信息
            EEDATA=data;//写入数据信息
            EEPGD=0;//操作EEPROM
            WREN=1; //写EEPROM允许
            EECON2=0x55;//写入特定时序
            EECON2=0xaa;
            WR=1; //执行写操作
            while(WR==1);//等待写完成
            WREN=0;//禁止写入EEPROM
               
                Tmp = ReadRomByte(addr) ;
                if(Tmp == data)
                {
                        break ;       
                }
        }
}

//*************************************
// 函数名称:ReadRomString
// 函数功能:从RAM读一连串的数据
// 入口参数:所读数据的首地址 读得的数据的存放首地址 读数据 长度
// 出口参数:所读地址的数据
/***************************************/
#ifdef        ReadRomString_CALL

void ReadRomString(uint8 InAddr,uint8 *OutAddr,uint8 DataLong)
{       
        uint8 i ;
       
        for(i=DataLong;i>0;i--)
        {       
                while(RD==1);//等待读完成
                EEADR = InAddr;//写入要读的址址
                EEPGD = 0;//操作EEPROM
                RD = 1;//执行读操作
                while(RD==1);//等待读完成
                *OutAddr = EEDATA;

                InAddr ++ ;        //存储地址加1
                OutAddr ++ ; //数据地址加1
        }               
}
#endif        //ReadRomString_CALL
//*************************************
// 函数名称:WriteRomString
// 函数功能:从RAM写一连串的数据
// 入口参数:要写进RAM的首地址 要写的数据 写数据的长度
// 出口参数:无
/***************************************/
#ifdef        WriteRomString_CALL
void WriteRomString(uint8 InAddr,uint8 *InData,uint8 DataLong)
{
        uint8 i,j;
        uint8 Tmp ;
       
        for(i=DataLong;i>0;i--)
        {
                //读出的和要写的数据一致 直接写下一个数据                       
                Tmp = ReadRomByte(InAddr) ;
                if(Tmp != (*InData))  //读数据与要写数据不一至 进行写 操作
                {
                        for(j=3;j>0;j--)//最多写三次
                        {
                            while(WR==1);//等待写完成               
                            EEADR = InAddr;//写入地址信息
                            EEDATA = *InData;//写入数据信息
                            EEPGD = 0;//操作EEPROM
                            WREN = 1; //写EEPROM允许
                            EECON2 = 0x55;//写入特定时序
                            EECON2 = 0xaa;
                            WR = 1; //执行写操作
                            while(WR==1);//等待写完成
                            WREN = 0;//禁止写入EEPROM
                               
                                Tmp = ReadRomByte(InAddr) ;
                                if(Tmp == (*InData))
                                {
                                        break ;       
                                }
                        }                                         
                }
                InAddr ++ ; //存储地址加1
                InData ++ ; //数据地址加1
        }
}
#endif        //WriteRomString_CALL

// 结束  本文源自  http://blog.csdn.net/libiaojs/article/details/9418357



回复

使用道具 举报

地板
gzpenglin 发表于 2014-6-10 17:09 | 只看该作者
辛苦了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51hei电子论坛2群 联系QQ:125739409;技术交流QQ群219535678

Powered by 单片机教程网

快速回复 返回顶部 返回列表