PIC之内部E2PROM的读写操作

发布者:superstar10最新更新时间:2016-11-01 来源: eefocus关键字:PIC之  内部E2PROM  读写操作 手机看文章 扫描二维码
随时随地手机看文章
//--------------------------------------------------------

//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") ;

}

这是网上找来的程序:

用我写的这个吧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。确信上次写操作已经结束后,才去调用新一次的写操作。这样做的目的是为了系统的实时性。

其实,事后匠人才发现自己写EEPROM读写程序,这样做是没有太大的必要的。因为在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

关键字:PIC之  内部E2PROM  读写操作 引用地址:PIC之内部E2PROM的读写操作

上一篇:TMR0定时实验
下一篇:超声波PIC程序

推荐阅读最新更新时间:2024-03-16 15:18

PIC单片机MPLAB IDE v8.92 只能支持英文目录
MPLAB IDE v8.92 只能支持英文目录,所以一般而言是把相应的工程拷到D盘中,然后打开编译,最后如果想要保存工程,应该拷回想要保存的位置 当在中文目录中会出现“找不到指定路径”的错误,如下:
[单片机]
<font color='red'>PIC</font>单片机<font color='red'>之</font>MPLAB IDE v8.92 只能支持英文目录
S3C2440 Linux下的I2C驱动以及I2C体系下对EEPROM进行读写操作
这篇文档算上期末复习这段时间其实拖了有好久了,因为从一开始接触linux的i2c驱动体系我就各种凌乱,因为起初脑海中既没有整体框架也不熟悉相关体系下的结构,所以四处乱看,经常性的在看内核代码时看着看着就把自己看飞了。结果就总是无功而返。现在我决定当前阶段把结构熟悉,知道大致的驱动体系框架。日后真正做到此类项目时再来深入理解、巩固、总结。 因为我所要操作的EEPROM使用的是I2C接口。那么自然要先了解一下I2C总线协议。对于I2C总线协议我的理解:两条线“SCL和SDA”,一个数据信号一个时钟脉冲信号。俩线都是高电平时,SDA从高到低发出一个跳变,便是开始信号;然后就是发送数据。若SDA从低到高再跳变一次就是结束信号。这期间,SC
[单片机]
PIC单片机开发板独立键盘扫描C语言代码
/* 为自已写的独立键盘扫描 犯的错:unsigned密写成了unsigner一直提示找不到a,b PORTD0=1;不行,要写成PORTD=0x01;才可以,如果一定要写,应写为RD0=1; PORTD=0x03;不是第三个灯亮,而是0000 0011是两个灯亮 PORTD=0x8则是0000 1000是第4个灯亮。。。。。出错因原进制转化,刚开始写程序进制转化混掉了。 */ #include pic.h #define uchar unsigned char #define uint unsigned int __CONFIG(0x3B31); const unsigned char table = {0x3f,0
[单片机]
<font color='red'>PIC</font>单片机开发板<font color='red'>之</font>独立键盘扫描C语言代码
MSP430 SD卡SPI读写操作(3) —— SD卡读写实现(以MSP430F5438A为例)
本节提供了MSP430F5438A SPI读写SD卡的示例代码,使用官方函数库msp430_driverlib_2_60_00_02,使用IAR for msp430 6.3通过编译。 本节代码未对SD卡进行区分,因此只针对SDHC卡进行操作,程序在金士顿 8GB SDHC microSD卡经过验证可以正常运行。 sdhc.h #ifndef _SDHC_H_ #define _SDHC_H_ #define SDHC_INIT_CLK 125000 #define SDHC_HIGH_CLK 3125000 #define SDHC_CS_PORT GPIO_PORT_P9 #define SDHC_CS_PIN
[单片机]
PIC单片机16C84单片机介绍(二)
五 I/O端口   PIC16C84具有两个I/O端口,PORTA,PORTB。某些端口的引脚用来与另外一些功能复用。   5-1 PORTA和TRISA寄存器   PIC16C84的 PORTH是5位宽度的锁存器。RA4是施密特触发器输入,一个集电极开路输出。端口A的所有其它的引脚为TTL电平输入,含CMOS输出驱动。所有引脚有数据方向位(TRISA寄存器),可通过TRI SA来配置PORTA的引脚是输入式输出。设置TRISA的某位为1,则对应的 PORTA的位为输入,若设置为0,对应的PORTA的某位为输出。   读PORTA寄存器,读入引脚的状态,向PORTA写入,则写到PORTA的锁存器。所有的写操作都是读--
[模拟电子]
MSP430F149单片机驱动DS2762读写操作C语言程序
基于MSP430F149单片机驱动DS2762读写操作C语言程序,能够对按键或着其他信号响应,读出电流以及电压量,并进行相应处理。 //#include msp430x14x.h #define uchar unsigned char #define uint unsigned int uint A,B,C,D,E,F,G,H,I,J;//此处对io430x14x中的宏定义C进行了注释,需注意 #define IO_OUT P3DIR |= BIT0; #define IO_INP P3DIR &= ~BIT0; uint data; /*****************************************
[单片机]
PIC单片机AD框架
/******************************** *1 ADCON1 选择参考电压和模拟输入引脚 * ADCON0 选择通道,时钟 打开AD模式 *2 清楚 ADIF 设置 ADIE PEIE GIE *3 等待一定的时间 *4 开始A/D转化 GO/DONE=1 *5 1扫描方式开始扫描 GO/DONE 并清零 2响应中断清中断标志位 *6 读取寄存器的值 *********************************/ #include pic.h #include string.h #include STDIO.H __CONFIG(0x00A); #define inter_flag
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved