历史上的今天
返回首页

历史上的今天

今天是:2024年11月07日(星期四)

正在发生

2019年11月07日 | PIC单片机内部EEPROM的操作

2019-11-07 来源:51hei

//--------------------------------------------------------

//EEPROM字节写程序

//功能: 写一个字节到内部EEPROM

//入口: EEADR =地址

// EEDATA =数据

//--------------------------------------------------------

void write_eeprom ( void )

{

// while ( WR )     //等待上一次写操作结束

// {

//  asm ("clrwdt");    //喂狗

// }

EEPGD = 0 ;      //设置访问目标为EEPROM

WREN = 1 ;     //允许进行写操作

GIE = 0 ;        //禁止中断

EECON2 = 0x55 ;

EECON2 = 0xAA ;

WR = 1 ;         //启动一次写操作

GIE = 1 ;        //使能中断

WREN = 0 ;     //关闭写操作

}

//--------------------------------------------------------

//EEPROM字节读程序

//功能: 从内部EEPROM读一个字节

//入口: EEADR =地址

//出口: EEDATA =数据

//--------------------------------------------------------

void read_eeprom( void )

{

EEPGD = 0 ;      //设置访问目标为EEPROM

RD = 1 ;        //启动一次读操作

}


//--------------------------------------------------------

//FLASH字节写程序

//功能: 写一个字节到内部FLASH

//入口: EEADRH,EEADR =地址

// EEDATH,EEDATA =数据

//--------------------------------------------------------

void write_flash ( void )

{

EEPGD = 1 ;      //设置访问目标为FLASH

WREN = 1 ;     //允许进行写操作

GIE = 0 ;        //禁止中断

EECON2 = 0x55 ;

EECON2 = 0xAA ;

WR = 1 ;         //启动一次写操作

asm ("nop") ;

asm ("nop") ;

GIE = 1 ;        //使能中断

WREN = 0 ;     //关闭写操作

}

//--------------------------------------------------------

//FLASH字节读程序

//功能: 从内部FLASH读一个字节

//入口: EEADRH,EEADR =地址

//出口: EEDATH,EEDATA =数据

//--------------------------------------------------------

void read_flash( void )

{

EEPGD = 1 ;      //设置访问目标为FLASH

RD = 1 ;        //启动一次读操作

asm ("nop") ;

asm ("nop") ;

}


2.方法二:

void WriteEE(unsigned char addr,unsigned char data)        //写EEPROM

   {

    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;                                //禁止写操作

   }

//

unsigned char ReadEE(unsigned char addr)                //读EEPROM

   {

    unsigned char num;

    do{;}

    while(RD==1);                        //上一次读操作是否完成

    EEADR=addr;                            //EEPROM地址为00H

    EEPGD=0;                            //指向EEPROM数据储存器

    RD=1;                                //开始读

    do{;}

    while(RD==1);                        //等待读操作完成

    num=EEDATA;                            //读出

    return(num);                        //返回读出的数

   }

说明:两个程序基本步骤是一致的。个中的差别是:

1、一程序中更严密,其中增加了对WR和RD标志位的判别,缺点是实时性较差。

2、而二程序中没有这个对WR和RD标志位的判别。那是因二将该判别的动作放在了上级程序中。也就是说,二在调用write_eeprom 函数之前,会先行判断WR。确信上次写操作已经结束后,才去调用新一次的写操作。这样做的目的是为了系统的实时性。


3.方法三:

PICC系统自带“ PIC.H”文件中,已经内嵌了这两个函数。!

以下是“ PIC.H”文件中的内容:

/***********************************************************************/

/****** EEPROM memory read/write macros and function definitions *******/

/***********************************************************************/

/* NOTE WELL:

   The macro EEPROM_READ() is NOT safe to use immediately after any

   write to EEPROM, as it does NOT wait for WR to clear.  This is by

   design, to allow minimal code size if a sequence of reads is

   desired.  To guarantee uncorrupted writes, use the function

   eeprom_read() or insert

while(WR)continue;

   before calling EEPROM_READ().

*/

#if EEPROM_SIZE > 0

#ifdef __FLASHTYPE

// macro versions of EEPROM write and read

#define EEPROM_WRITE(addr, value)

do{

while(WR)continue;EEADR=(addr);EEDATA=(value);

EECON1&=0x7F;CARRY=0;if(GIE)CARRY=1;GIE=0;

WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0;

if(CARRY)GIE=1;

}while(0)

#define EEPROM_READ(addr) ((EEADR=(addr)),(EECON1&=0x7F),(RD=1),EEDATA)

#else // else doesn't write flash

#define EEPROM_WRITE(addr, value)

do{

while(WR)continue;EEADR=(addr);EEDATA=(value);

CARRY=0;if(GIE)CARRY=1;GIE=0;

WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0;

if(CARRY)GIE=1;

}while(0)

#define EEPROM_READ(addr) ((EEADR=(addr)),(RD=1),EEDATA)

#endif

/* library function versions */

extern void eeprom_write(unsigned char addr, unsigned char value);

extern unsigned char eeprom_read(unsigned char addr);

#endif // end EEPROM routines





#include "pic.h"

unsigned char ReadEE(unsigned char addr);

void WriteEE(unsigned char addr,unsigned char data);

#define INTCONIT(adr,bit) ((unsigned)(&adr)*8+(bit))

static bit INTCON_7 @ INTCONIT(INTCON,7);

unsigned char data = 0x9;

void main()

{

data = 0;

WriteEE(0x01,0x99);

data = ReadEE(0x01);

while(1)

{

}


}

//读EEPROM

unsigned char ReadEE(unsigned char addr)                //读EEPROM

  {

    unsigned char num;

GIE=0;

    while(RD==1);                        //上一次读操作是否完成

    EEADR=addr;  //0x01                  //EEPROM地址为00H

    EEPGD=0;                             //指向EEPROM数据储存器

    RD=1;                                //开始读

    while(RD==1);                        //等待读操作完成

    num=EEDATA;                          //读出

    return(num);                         //返回读出的数

  }

//写EEPROM

void WriteEE(unsigned char addr,unsigned char data)        //写EEPROM

  {

   while(WR==1);                         //上一次写操作是否完成

   EEADR=addr;//0X02                     //EEPROM地址

   EEDATA=data; //0X05                   //准备写入EEPROM的数据

   EEPGD=0;                              //指向EEPROM数据储存器

   WREN=1;                               //使能写操作

   GIE=0;                                //禁止中断                               

   EECON2=0x55;                          //设置通用参数

   EECON2=0xAA;                          //设置通用参数

   WR=1; 

   GIE=1;                                //开始写

   while(WR==1);                         //等待写操作完成

   if(EEIF==1)

     {

       EEIF=0;

     }                    

   WREN=0;                               //禁止写操作

  }


推荐阅读

史海拾趣

Daniel Woodhead公司的发展小趣事

Daniel Woodhead公司在电子行业的起点可以追溯到创始人Daniel Woodhead对先进半导体技术的热情。在当时,半导体技术正逐渐崭露头角,Daniel看到了其中的巨大潜力。他带领团队日夜研发,成功开发出了一款性能卓越的微处理器,这款处理器凭借其高效能和低功耗在市场上脱颖而出,为公司赢得了第一桶金。

Embedded Planet公司的发展小趣事

Embedded Planet公司自成立之初就注重技术创新和与业界领导者的合作。通过持续研发,公司成功开发出一款革命性的嵌入式系统解决方案,这一解决方案能够显著提升设备的性能和效率。同时,Embedded Planet积极与卓联半导体公司合作,共同推出了一款伪线模块,该模块能够大幅度降低通过分组网络传送TDM业务的网络设备的复杂性,并缩短开发时间。这一创新产品得到了市场的广泛认可,也为公司赢得了更多的合作机会。

DEMMELPRODUCTS公司的发展小趣事

在追求技术创新和市场拓展的同时,DEMMELPRODUCTS公司始终将品质管理放在首位。公司建立了严格的质量管理体系,从原材料采购到产品生产的每一个环节都进行严格的质量控制。此外,公司还积极引入先进的生产设备和技术,不断提高生产效率和产品质量。通过持续改进和优化,DEMMELPRODUCTS公司的产品品质得到了客户和行业的广泛认可。

Formosa MS公司的发展小趣事

在追求技术创新和市场拓展的同时,DEMMELPRODUCTS公司始终将品质管理放在首位。公司建立了严格的质量管理体系,从原材料采购到产品生产的每一个环节都进行严格的质量控制。此外,公司还积极引入先进的生产设备和技术,不断提高生产效率和产品质量。通过持续改进和优化,DEMMELPRODUCTS公司的产品品质得到了客户和行业的广泛认可。

飞翼科技(FEIYI)公司的发展小趣事

DEMMELPRODUCTS公司深知人才是企业发展的根本。因此,公司始终注重人才培养和团队建设。通过制定科学的培训计划和激励机制,公司吸引了一批优秀的研发、生产和销售人才。同时,公司还鼓励员工之间进行知识和经验的分享与交流,形成了积极向上的团队氛围。这些优秀的人才和团队为公司的发展提供了有力的支持。

Chemi-Con公司的发展小趣事

Chemi-Con公司的历史可以追溯到XXXX年,当时铝电解电容器在日本首次成功实现产品化。这不仅是电子行业的一个里程碑,也是Chemi-Con公司传奇故事的起点。公司创始人凭借对技术的深刻理解和市场的前瞻性,敏锐地捕捉到了铝电解电容器的巨大潜力,并决定将其作为公司的主营业务。在创业初期,Chemi-Con面临着资金、技术和市场等多方面的挑战,但创始人凭借着坚定的信念和不懈的努力,带领公司逐步攻克难关,奠定了在铝电解电容器领域的领先地位。

问答坊 | AI 解惑

谷歌CEO施密特:与雅虎合作计划有望10月落实

北京时间9月1日消息 据国外媒体报道,谷歌CEO埃里克·施密特在接受彭博电视台采访时称,希望美国政府能批准谷歌与雅虎的合作]计划,使该计划能在今年10月开始实施。 据彭博电视台在科罗拉多州丹佛市进行的一次采访,美国政府正在审查两家公司的网 ...…

查看全部问答>

我对SDRAM的深入理解

我了解事物喜欢从底层根本去了解,而不是你说什么我照做就行了,我会形成一些探寻究竟的念头,也会产生很多疑问。 讨论之前当然要先看过某厂的datasheet,我看的是Micron。 按上面说,terminate和precharge都能掐断burst读或写。我也是第一次用Sd ...…

查看全部问答>

自动测试系统的原理、应用与发展

自动测试系统(ATS)广泛应用于各类产品(器件、部件、电路板、设备或系统)从设计、生产到使用维护的各个阶段,对提高产品性能及生产率,降低生产成本及整个生命周期成本,起着重要作用。对于飞机、导弹、舰船或武器系统,自动测试系统更是这些它 ...…

查看全部问答>

有经验者进来说说吧!英语四级很重要吗?

    对于计算机专业的人来说,英语四级很重要吗?现在很忙,根本顾及不了英语,而老师也把它说得很重要。当然,我忙是因为自己的专业,而不是去浪费时间。    对于已经在社会工作的前辈们,你们认为英语四级重要吗?  & ...…

查看全部问答>

请教一个EBoot下载地址问题

在DownloadImage函数中,有如下的一段代码,我搞不明白这里为什么给地址赋的是接收长度,而不是地址呢?             if (*(UINT32 *)(pCurDownloadFile->dwRegionStart + ROM_SIGNATURE_OFFSET) == ROM_SIGN ...…

查看全部问答>

最新的STM8L选型手册手册哪有?

最新的STM8L选型手册手册哪有?…

查看全部问答>

STM8的标准库头文件包含是不是有点问题?

在stm8s_conf.h中有如下语句: /* Includes ------------------------------------------------------------------*/ #include "stm8s.h" 在stm8s.h中有如下语句: #ifdef USE_STDPERIPH_DRIVER #include "stm8s_conf.h" #endi ...…

查看全部问答>

基于51的无线多点粮仓温湿度监控系统 (初次发贴多多关照)

                                      &n ...…

查看全部问答>

430launchpad G2553 定时器A模拟串口困惑

定时器A模拟串口发送时,DEMO里有这么一句:       if (RXTXData & 0x01)                  //判断最低位是否为1       CCTL0 &= ~ OUTMO ...…

查看全部问答>

WEBENCH设计大赛上传数量排行榜(截止至7月11日下午4:30)

我们看看哪些网友离平板电脑、微单、电子书、固态硬盘或者移动硬盘这些大奖越来越近了呢?(截止到7月11日下午4点30的数据) 如果你也想获得下列奖品,那也赶紧提交设计吧!活动详情:https://bbs.eeworld.com.cn/TI/201307_webench/index.html ...…

查看全部问答>