51 EEPROM操作模板
各个型号容量及扇区请查datasheet
#include <reg52.h>
#include "intrins.h" typedef unsigned char byte;
typedef unsigned int word; /* Declare SFR associated with the IAP */
sfr IAP_DATA = 0xC2; //Flash data register
sfr IAP_ADDRH = 0xC3; //Flash address HIGH
sfr IAP_ADDRL = 0xC4; //Flash address LOW
sfr IAP_CMD = 0xC5; //Flash command register
sfr IAP_TRIG = 0xC6; //Flash command trigger
sfr IAP_CONTR = 0xC7; //Flash control register /* Define ISP/IAP/EEPROM command */
#define CMD_IDLE 0 //Stand-By
#define CMD_READ 1 //Byte-Read
#define CMD_PROGRAM 2 //Byte-Program
#define CMD_ERASE 3 //Sector-Erase /* Define ISP/IAP/EEPROM operation const for IAP_CONTR */
#define ENABLE_IAP 0x80 //if SYSCLK < 30MHz
#define ENABLE_IAP 0x81 //if SYSCLK < 24MHz
#define ENABLE_IAP 0x82 //if SYSCLK < 20MHz
#define ENABLE_IAP 0x83 //if SYSCLK < 12MHz
#define ENABLE_IAP 0x84 //if SYSCLK < 6MHz
#define ENABLE_IAP 0x85 //if SYSCLK < 3MHz
#define ENABLE_IAP 0x86 //if SYSCLK < 2MHz
#define ENABLE_IAP 0x87 //if SYSCLK < 1MHz //Start address for STC12C5201AD series EEPROM
#define IAP_ADDRESS 0x0000 void Delay(byte n)
{
word x;
while(n--)
{
x = 0;
while(++x);
}
} /* Disable ISP/IAP/EEPROM function Make MCU in a safe state */ void IapIdle()
{
IAP_CONTR = 0; //close IAP function
IAP_CMD = 0; //clear command to standby
IAP_TRIG = 0; //clear tirgger register
IAP_ADDRH = 0x80; //data ptr point to non EEPROM area
IAP_ADDRL = 0; //clear IAP address to prevent mususe
} /* read one byte from isp/iap/eeprom area input:addr(isp iap eeprom address) output:flash data */
byte IapReadByte(word addr)
{
byte dat; IAP_CONTR = ENABLE_IAP; //Open IAP function and set wait time
IAP_CMD = CMD_READ; //Set ISAP READ command
IAP_ADDRL = addr; //Set ISP address low
IAP_ADDRH = addr >> 8; //Set IAP address high
IAP_TRIG = 0x5a; //Send trigger command1(0x5a)
IAP_TRIG = 0xa5; //Send trigger command2(0xa5)
_nop_(); //MCU will hold here until IAP operation complete dat = IAP_DATA; //Read IAP EEPROM data
IapIdle(); //Close ISP function return dat; //Return Flash data
} /* Program one byte to ISP area Input:addr (address) dat(data) Output:- */
void IapProgramByte(word addr, byte dat)
{
IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
IAP_CMD = CMD_PROGRAM; //Set EEPROM PROGRAM command
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_DATA = dat;
IAP_TRIG = 0x5a;
IAP_TRIG = 0xa5;
_nop_(); IapIdle();
} /* Erase one sector area Input:addr */
void IapEraseSector(word addr)
{
IAP_CONTR = ENABLE_IAP;
IAP_CMD = CMD_ERASE;
IAP_ADDRL = addr;
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x5a;
IAP_TRIG = 0xa5;
_nop_(); IapIdle();
} int main()
{
word i; P1 = 0xfe;
Delay(10);
IapEraseSector(IAP_ADDRESS); for(i = 0; i < 512; ++i)
{
if(IapReadByte(IAP_ADDRESS + i) != 0xff)
{}
} P1 = 0xfc;
Delay(10);
for(i = 0; i < 512; ++i)
{
IapProgramByte(IAP_ADDRESS + i, (byte)i);
} P1 = 0xf8;
Delay(10);
for(i = 0; i < 512; ++i)
{
if(IapReadByte(IAP_ADDRESS + i) != (byte)i)
{}
} P1 = 0xf0;
while(1); return 0;
}
51 EEPROM操作模板的更多相关文章
- PIC XC8 EEPROM操作
要做一个报警功能的东东,要求可以通过遥控来改变遥控内容.由于对系统的稳定性要求很高,所以用了看门狗. 可是看门狗复位会引起所有寄存器重置,恢复到默认状态.遥控要改变的内容也被复位了,所以只能借助EEP ...
- C语言链表操作模板(添加,删除,遍历,排序)
C语言链表操作模板,摘自郝斌的C语言视频教程,简单的修改成了纯C格式.当年照着视频学习的时候记录下来的,在使用的时候直接拿来修改修改修改能节约不少时间的. /********************* ...
- 像51一样操作STM32的IO(转)
源:像51一样操作STM32的IO //-------------------------------------------------------------------------------- ...
- 子树大小平衡树(Size Balanced Tree,SBT)操作模板及杂谈
基础知识(包括但不限于:二叉查找树是啥,SBT又是啥反正又不能吃,平衡树怎么旋转,等等)在这里就不(lan)予(de)赘(duo)述(xie)了. 先贴代码(数组模拟): int seed; int ...
- python 外键用法 多对多关系 ORM操作 模板相关
一.app/models中写类(设计表结构) 1.普通类 class A(models.Model): id=modles.AutoField(primary_key=True) name=mode ...
- Jaba_Web--JDBC 删除记录操作模板
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...
- STM8S EEPROM 操作
STM8S 内置EEPROM,对于非常大须要带记忆的产品来说,是个非常好的资源,下面是我个人摸索出来的,而且验证OK,大家如须要可放心使用. #define EEPROMADDR0X000 ((u32 ...
- jeecg入门操作—模板配置(录入界面)
点击online表单的模板配置,进入模板设计列表页面,点击创建模板 点击创建模板 点击激活 设计完成,点击激活(表单模板可以多个,激活状态只能有一个) 激活后,重新加入功能测试,点击添加页面,效果如下 ...
- 51: Luogu 2485 模板
$des$ 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最小非负整数x: 3.给定y.z.p,计算满足y^x ≡z(mod p)的最小非负 ...
随机推荐
- Intent.ACTION_TIME_TICK 广播
Intent.ACTION_TIME_TICK 广播需要动态注册,不能在清单文件配置. TimeReceiver mBroadcastReceiver = new TimeReceiver(); In ...
- 13.1.17 CREATE TABLE Syntax
13.1.17 CREATE TABLE Syntax 13.1.17.1 CREATE TABLE ... LIKE Syntax 13.1.17.2 CREATE TABLE ... SELECT ...
- java.lang.OutOfMemoryError: GC overhead limit exceeded 问题分析和解决(转)
在项目历史数据导入过程中,出现了应用无法访问的情况.立刻对Weblogic进行分析,发现Weblogic的内存.线程等性能良好,Server也是Running的状态.随后查看了Weblogic日志,在 ...
- (转)fastcgi协议的简单实现
FastCgi不仅可以用于webserver与PHP的交互,也可用于任何两个应用之间的交互,PHPer用的比较多的应该就是用于两个子系统之间的交互. 比如A系统和B系统分部独立的部署在两台机器上,其之 ...
- Walls and Gates 解答
Question You are given a m x n 2D grid initialized with these three possible values. -1 - A wall or ...
- 【转】Linux系统调用列表
一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtablesize 进程所能打开的最 ...
- JQuery 动画之 广告
html页面: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head&g ...
- struts——拦截器
什么是拦截器 拦截器(Interceptor)是Struts 2的一个强有力的工具,有许多功能都是构建于它之上,如国际化(前两篇博客介绍过).转换器,校验等. 拦截器是动态拦截Action调用的对象. ...
- Gradle Tips#1-tasks
原文链接 以这篇博客開始,我将写一系列关于Gradle的文章,用来记录接触Gradle构建脚本以来我所理解的Gradle. 今天要讲的就是Gradle tasks以及task的配置和运行.可能有的读者 ...
- Spring (二) OOP V.S AOP
介绍 这是两种不同的编程思想就好比初中数学中学习的横纵坐标,一种是横向的一种是纵向,OOP是代表X轴而AOP代表Y轴,如下图: 数学几乎可以解释生活中所有的现象,无论是物体运动还是静止,也可以通过数学 ...