找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

stc单片机eeprom模块化程序.

[复制链接]
admin 发表于 2012-9-2 05:48:32 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本程序封装了stc系列单片机的EEPRROM操作程序.只需一行,就可以完成eeprom的读写操作.前言: stc单片机在中国大陆在中低端市场中占有大半壁江山.片内EEPROM是掉电保存数据的最理想选择.stc单片机的片内eeprom以扇区

为单位,每个扇区大小是512 字节.以下是我亲自编写的对stc单片机(89系列除外)操作子函数,可以模块化使用,欢迎电子爱好者与我多多交流.
本人QQ704157083 tel :18676778006 .工作地点:深圳..南山区. 从事软件和电子这行,爱好交朋友,一起开发有创意的产品.
过目请留言!


//增加寄存器
sfr IAP_CONTR =0xC7; // ;软复位寄存器
sfr IAP_DATA =0xC2 ; //数据寄存器 ;寄存器的地址不能改
sfr IAP_adrRH =0xC3; // 地址高8位寄存器
sfr IAP_adrRL = 0xC4; //命令触发器
sfr IAP_CMD=0xC5; //;命令寄存器
sfr IAP_TRIG=0xC6; //;命令触发器
//*********************************************************************************
//增加通用函数 .
//(1) eeprom 函数 写一个数据 eg1: rom_writearea(1,100,0x99,12); 在片区1 地址100 中写入0x99 晶振12M
// 读一个数据: eg2: rom_readarea(1,100,12); 在片区1 地址100 中读出数据 晶振12M
// 写一个数组:eg3: rom_write_array(1,100,a,10,12); 在片区1,起始地址100, 写入数组a ,数组大小10,晶振12M
xdata char xram[512] ; // 定义一个备份片区的数组.
rom_readbyte(unsigned int adr,unsigned char fso);
rom_readarea(unsigned int area,unsigned int adr_toread,unsigned char fso);
void rom_writebyte(unsigned int adr,unsigned char dat,unsigned char fso);
void rom_clear(unsigned int adr,unsigned char fso) ;
void iap_disable();
void rom_writearea(unsigned int area,unsigned int adr,unsigned char dat,unsigned char fso); // 写之前备份 ,扇区地址,字节地址,数据内容
void rom_write_array(unsigned int area,unsigned int adr_towrite,unsigned char *p,unsigned int num,unsigned char fso);
choose_area(unsigned char area); //选择片区
//^^^^^^^^^^^^^^^^^^^^^^^^
rom_readbyte(unsigned int adr,unsigned char fso)
{
DPH=adr>>8; //取高字节
DPL=adr; //取低字节
if(fso==6)
{
IAP_CONTR=0X84 ;
}
else if(fso==12)
{
IAP_CONTR=0X8B; //;,<=12m晶振 固定写法 允许改变rom <=6M IAP_CONTR=0X84
}

IAP_CMD=0X01; //;01h为读取命令
IAP_adrRH=DPH; //获取指针高八位
IAP_adrRL=DPL; //获取指针低八位
//EA=0;
IAP_TRIG=0X5A; //两条触发命令,使命令执行
IAP_TRIG=0XA5;
// a=IAP_DATA; //;获取数据
iap_disable();
return(IAP_DATA);
}
//^^^^^^^^^^^^^^^^^^^^^^^^
rom_readarea(unsigned int area,unsigned int adr_toread,unsigned char fso)
{
unsigned int adr ; //扇区首地址
adr=choose_area(area);
IAP_DATA= rom_readbyte(adr+adr_toread,fso);//读取数据
return(IAP_DATA);
}
//^^^^^^^^^^^^^^^^^^^^^^^^
void rom_writebyte(unsigned int adr,unsigned char dat,unsigned char fso)
{
DPH=adr>>8; //取高字节
DPL=adr; //取低字节
if(fso==6)
{
IAP_CONTR=0X84 ;
}
else if(fso==12)
{
IAP_CONTR=0X8B; //;,<=12m晶振 固定写法 允许改变rom <=6M IAP_CONTR=0X84
}
IAP_CMD=0X02; //;02h为写入命令
IAP_adrRH=DPH; //获取指针高八位
IAP_adrRL=DPL; //获取指针低八位
IAP_DATA=dat; //把数据放入数据寄存器中,用于写
//EA=0;
IAP_TRIG=0X5A; //两条触发命令,使命令执行
IAP_TRIG=0XA5;
iap_disable();
}
//^^^^^^^^^^^^^^^^^^^^^^^^
void rom_writearea(unsigned int area,unsigned int adr_towrite,unsigned char dat,unsigned char fso)
{
unsigned int i,j ; //循环变量
unsigned int adr ; //扇区首地址
adr=choose_area(area);

for (i=0;i<512;i++) //读扇区的所有数据,进行备份.
{
xram[i]=rom_readbyte(adr+i,fso);
}
rom_clear(area,fso); //清除要写入的扇区
xram[adr_towrite]=dat ; //要写入的数据先放到数组中来

for (j=0;j<512;j++) //将数组中的数据写入扇区中..
{
rom_writebyte(adr+j,xram[j],fso);
}
}
//^^^^^^^^^^^^^^^^^^^^^^^^
void rom_write_array(unsigned int area,unsigned int adr_towrite,unsigned char *p,unsigned int num,unsigned char fso)
{
unsigned int i,j ; //循环变量
unsigned int adr ; //扇区首地址
adr=choose_area(area);


for (i=0;i<512;i++) //读扇区的所有数据,进行备份.
{
xram[i]=rom_readbyte(adr+i,fso);
}
rom_clear(area,fso); //清除要写入的扇区
for(i=0;i<num;i++)
{
xram[adr_towrite+i]=*(p+i); //将数组的内容写入备份数组XRAM中
}
for (j=0;j<512;j++) //将数组中的数据写入扇区中..
{
rom_writebyte(adr+j,xram[j],fso);
}
}
//^^^^^^^^^^^^^^^^^^^^^^^^
void rom_clear(unsigned int area,unsigned char fso) //清除一片扇区
{
unsigned int adr ; //扇区首地址
adr=choose_area(area);
DPH=adr>>8; //取高字节
DPL=adr; //取低字节
if(fso==6)
{
IAP_CONTR=0X84 ;
}
else if(fso==12)
{
IAP_CONTR=0X8B; //;,<=12m晶振 固定写法 允许改变rom <=6M IAP_CONTR=0X84
}
IAP_CMD=0X03; //;03h为擦除命令
IAP_adrRH=DPH; //获取指针高八位
IAP_adrRL=DPL; //获取指针低八位
//EA=0;
IAP_TRIG=0X5A; //两条触发命令,使命令执行
IAP_TRIG=0XA5;
iap_disable();
}
//^^^^^^^^^^^^^^^^^^^^^^^^
void iap_disable() // 关闭iap编程
{
IAP_CONTR=0X00; //关闭rom控制器命令
IAP_CMD=0X00; //清除 读写擦 命令
}
choose_area(unsigned char area)
{
unsigned int adr;
switch (area) //扇区编号从1开始到16扇区.
{
case 1: adr=0x0000;break;
case 2: adr=0x0200;break;
case 3: adr=0x0400;break;
case 4: adr=0x0600;break;
case 5: adr=0x0800;break;
case 6: adr=0x0A00;break;
case 7: adr=0x0C00;break;
case 8: adr=0x0E00;break;
case 9: adr=0x1000;break;
case 10: adr=0x1200;break;
case 11: adr=0x1400;break;
case 12: adr=0x1600;break;
case 13: adr=0x1800;break;
case 14: adr=0x1A00;break;
case 15: adr=0x1C00;break;
case 16: adr=0x1E00;break;
}
return (adr);
}
//**********************************************************end
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 02:21 , Processed in 0.057172 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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