STC单片机EEPROM读写程序_第1页
STC单片机EEPROM读写程序_第2页
STC单片机EEPROM读写程序_第3页
STC单片机EEPROM读写程序_第4页
STC单片机EEPROM读写程序_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/* STC89C54RD+ 的 flash 空间从 0x40000xf3ff 共 90 个扇区,每扇区 512 字节*/ #define BaseAddr 0x1000/* 51rc */ #define EndSectoraddr 0x3d00/* 51rc */ #define EndAddr 0x3fff/* 51rc 12K eeprom */#define BaseAddr 0x4000#define EndSectoraddr 0xf200#define EndAddr0xf3ff#define UseAddr 0x1000/* 定义扇区大小 */#define PerSecto

2、r 512 /* 用户程序需要记忆的数组 , 用户实际使用了 n-1 个数据,数组长度规整到2 4 8 16 32 64 上 */ uchar Ttotal16=0x55,/* 作为判别引导头使用,用户程序请不要修改它*/* 用户保存记忆的数据 */0x01,/* 用途说明 */0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,;uint timerForDelay, i, EepromPtr;/* 专供延时用的变量 */ /* 循环变量 */ /* eeprom 读写指针*/* 命令定义#define

3、RdCommand#define PrgCommand */0x01/* 字节读*/0x02/* 字节写*/* 扇区擦除 */#define EraseCommand 0x03 /* 定义常量 */#define Error1#define Ok0/* 定义 Flash 对应于 20MHz 晶振系统的操作等待时间 */* 时钟倍频时 WaitTime 用 0x00*/#define WaitTime 0x01/* = 打开 ISP,IAP 功能 = */void ISP_IAP_enable(void)EA = 0;/*关中断 */ISP_CONTR =ISP_CONTR & 0x18;/*

4、0001,1000 */ISP_CONTR =ISP_CONTR | WaitTime;/* 写入硬件延时*/ISP_CONTR =ISP_CONTR | 0x80;/* ISPEN=1*/* = 关闭 ISP,IAP 功能 = */ void ISP_IAP_disable(void)ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */ ISP_TRIG = 0x00;EA = 1; /* 开中断 */* = 公用的触发代码 = */ void ISPgoon(void)ISP_IAP_enable();/* 打开ISP,IAP 功能 */ISP_TRI

5、G =0x46;/*触发 ISP_IAP 命令字节 1 */ISP_TRIG =0xb9;/*触发 ISP_IAP 命令字节 2 */_nop_();/* = 字节读 = */ uchar byte_read(uint byte_addr)ISP_ADDRH = (uchar)(byte_addr 8); /* 地址赋值 */ ISP_ADDRL = (uchar)(byte_addr & 0x00ff);ISP_CMD= ISP_CMD& 0xf8;/* 清除低 3 位 */ISP_CMD= ISP_CMD| RdCommand;/* 写入读命令 */ISPgoon();/* 触发执行 */

6、ISP_IAP_disable();/*关闭 ISP,IAP 功能 */return (ISP_DATA);/* 返回读到的数据*/* = 扇区擦除 = */ void SectorErase(uint sector_addr)uint iSectorAddr;iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */ISP_ADDRH = (uchar)(iSectorAddr 8);/* 清空低 3 位*/ISP_ADDRL = 0x00;ISP_CMD = ISP_CMD & 0xf8;ISP_CMD= ISP_CMD | EraseCommand

7、;/* 擦除命令 3*/ISPgoon();ISP_IAP_disable();触发执行/* 关闭 ISP,IAP 功能 */*/* =字节写= */void byte_write(uint byte_addr, uchar original_data)= */ISP_ADDRH = (uchar)(byte_addr 8); /* 取地址 */ ISP_ADDRL = (uchar)(byte_addr & 0x00ff);ISP_CMDISP_CMDISP_DATA = ISP_CMD & 0xf8;= ISP_CMD | PrgCommand; original_data; /*/* 清

8、低/* 写命令 2 写入数据准备 */3 位 */ */ISPgoon();ISP_IAP_disable(); /*/* 触发执行 关闭 IAP 功能 */*/uchar byte_write_verify(uint byte_addr, uchar original_data)ISP_ADDRH= (uchar)(byte_addr 8);/* 取地址*/ISP_ADDRL =(uchar)(byte_addr & 0xff);/* =字节写并校验ISP_CMD= ISP_CMD & 0xf8;/* 清低 3 位*/ISP_CMD= ISP_CMD | PrgCommand;/* 写命令

9、2*/ISP_DATA =original_data;ISPgoon();/* 触发执行*/*/* 开始读,没有在此重复给地址,地址不会被自动改变ISP_DATA = 0x00;/* 清数据传递寄存器 */* 清低 3 位 */* 读命令 1 */ISP_CMD = ISP_CMD & 0xf8;ISP_TRIG= 0x46;/* 触发 ISP_IAP 命令字节 1 */ISP_TRIG= 0xb9;/* 触发 ISP_IAP 命令字节 2 */_nop_();/*延时 */ISP_IAP_disable();/* 关闭 IAP 功能*/if(ISP_DATA= original_data)/

10、* 读写数据校验*/returnOk;/* 返回校验结果 */ISP_CMD = ISP_CMD | RdCommand;elsereturn Error;/* = 数组写入 = */ uchar ArrayWrite(uint begin_addr, uint len, uchar *array)uint i;uint in_addr;/* 判是否是有效范围 , 此函数不允许跨扇区操作 */if(len PerSector)return Error;in_addr = begin_addr & 0x01ff; /* 扇区内偏移量 */ if(in_addr + len) PerSector)

11、return Error;in_addr = begin_addr;/* 逐个写入并校对 */ISP_IAP_enable(); /* 打开 IAP 功能 */for(i = 0; i 8);ISP_ADDRL = (uchar)(in_addr & 0x00ff);ISP_DATA = arrayi; /* 取数据 */ISP_CMD = ISP_CMD & 0xf8;/* 清低 3 位 */ISP_CMD = ISP_CMD | PrgCommand; /* 写命令 2 */ISP_TRIG = 0x46;ISP_TRIG = 0xb9; _nop_();/* 读回来 */ISP_DATA

12、 = 0x00;/* 触发 ISP_IAP 命令字节 1 */* 触发 ISP_IAP 命令字节 2 */ISP_CMD = ISP_CMD & 0xf8;ISP_CMD = ISP_CMD | RdCommand;/* 清低 3 位 */* 读命令 1 */ISP_TRIG = 0x46;/* 触发 ISP_IAP 命令字节 1 */ISP_TRIG = 0xb9;/* 触发 ISP_IAP 命令字节 2 */_nop_();/* 比较对错 */ if(ISP_DA TA != arrayi) ISP_IAP_disable(); return Error; in_addr+;ISP_IAP

13、_disable(); return Ok;/* 指向下一个字节 */* = 扇区读出 = */ /* 程序对地址没有作有效性判断,请调用方事先保证他在规定范围内 */ void ArrayRead(uint begin_addr, uchar len)/ uchar xdata data_buffer; /* 整个扇区读取缓存区 */uint iSectorAddr;uint i;iSectorAddr = begin_addr; / & 0xfe00;/* 取扇区地址 */ISP_IAP_enable(); for(i = 0; i 8);(uchar)(iSectorAddr & 0x0

14、0ff);ISP_CMD =ISP_CMD& 0xf8;/* 清低 3 位 */ISP_CMD =ISP_CMD | RdCommand; /* 读命令 1 */ISP_DATA = 0;ISP_TRIG = 0x46;/* 触发 ISP_IAP 命令字节 1 */ISP_TRIG = 0xb9;/* 触发 ISP_IAP 命令字节 2 */_nop_();Ttotali = ISP_DA TA; iSectorAddr+;/* 关闭 IAP 功能 */ISP_IAP_disable();/* = 从 eeprom 中读取数据= */ void DataRestore()/* 指向 eepro

15、m 的起始点 */* 在 eeprom 的可用区域内 */找到了上一次有效纪录 */* 寻找完成*/* 指向下一个小区*/* 如果照遍都没有 ,是新片 */* 指向 eeprom 的起始点 */EepromPtr = BaseAddr; while(EepromPtr = EndAddr) EepromPtr = BaseAddr; for(i=0;i90;i+)SectorErase(EepromPtr+0x200*i); /* 全部扇区擦除 */while(ArrayWrite(EepromPtr, 0x10, Ttotal) /* 写默认值 */ /* 写入失败才运行的部分 */ byte_w

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论