stc eeprom字符型数组写操纵子法度模范(带扇区擦除爱惜)[精彩]
#include "STC_NEW_8051.H" //需要上stc官网下载此头文件
#include /* use _nop_() function */ #include /* use _nop_() function */ //sfr16 DPTR = 0x82;
/* 新增特殊功能寄存器定义 */ sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
/* 定义命令 */
#define ENABLE_ISP 0x84 /* IAP功能使能 */
#define READ_Command 0x01 /* 字节读数据存储区 */
#define PROGRAM_Command 0x02 /* 字节编程数据存储区 */
#define ERASE_Command 0x03 /* 扇区擦除数据存储区 */
typedef unsigned char INT8U; /* 8 bit 无符号整型 */ typedef unsigned int INT16U; /* 16 bit 无符号整型 */
void IAP_Disable();
void Sector_Erase(INT16U add);
void Array_Program(INT16U add,INT8U Array[],INT8U n,INT8U m);
INT8U Byte_Read(INT16U add);
void IAP_Disable()
{
//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
IAP_CONTR = 0; //关闭IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用
IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}
//擦除扇区, 入口:DPTR = 扇区地址
void Sector_Erase(INT16U add)
{
IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = ERASE_Command ; //IAP/ISP/EEPROM 扇区擦除命令
IAP_ADDRH = (add>>8); //设置目标单元地址的高8 位地址
IAP_ADDRL = add&0xff; //设置目标单元地址的低8 位地址
//EA = 0;
IAP_TRIG = 0x46; //先送 46h,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xB9; //送完B9h 后,ISP/IAP 命令立即被触发起动
_nop_();
//EA = 1;
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}
//数组编程,add是数组首地址, array是数组内容,n是数组在eeprom中的第一位,
//m是数组在eeprom中的最后一位
void Array_Program(INT16U add,INT8U Array[],INT8U n,INT8U m) { INT8U i, Protect_Array[16];
for(i=0;i<16;i++)//该例子只使用到地址0x2E00到0x2E00+15
{
IAP_DATA = 0x00;
IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = READ_Command; //IAP/ISP/EEPROM 字节读命令
IAP_ADDRH = ((0x2E00+i)>>8); //设置目标单元地址的高8 位地址
IAP_ADDRL = (0x2E00+i)&0xff; //设置目标单元地址的低8 位地址
IAP_TRIG = 0x46; //先送 46h,再送b9h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xB9; //送完b9h 后,ISP/IAP 命令立即被触发起动
_nop_();
Protect_Array[i]=IAP_DATA;//将EEPROM中的数据存入Protect_Array中
}
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
Sector_Erase(add);//删除EEPROM中地址为add所在的扇区
for(i=n;i<=m;i++){ Protect_Array[i]=Array[i-n];}//将要写入的数组Array存入到Protect_Array的n到m位中,
IAP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置Flash操作等待时间
IAP_CMD = PROGRAM_Command; //IAP/ISP/EEPROM 字节编程命令
for(i=0;i<16;i++)
{
IAP_ADDRH = ((0x2E00+i)>>8); //设置目标单元地址的高8 位地址
IAP_ADDRL = (0x2E00+i)&0xff; //设置目标单元地址的低8 位地址
IAP_DATA = Protect_Array[i]; //要编程的数据先送进IAP_DATA 寄存器
IAP_TRIG = 0x46; //先送 46h,再送b9h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xB9; //送完b9h 后,ISP/IAP 命令立即被触发起动
_nop_();
}
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}
//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
INT8U Byte_Read(INT16U add)
{
IAP_DATA = 0x00;
IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD = READ_Command; //IAP/ISP/EEPROM 字节读命令
IAP_ADDRH = (add>>8); //设置目标单元地址的高8 位地址
IAP_ADDRL = add&0xff; //设置目标单元地址的低8 位地址
//EA = 0;
IAP_TRIG = 0x46; //先送 46h,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG = 0xB9; //送完B9h 后,ISP/IAP 命令立即被触发起动
_nop_();
//EA = 1;
IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
return (IAP_DATA);
本文档为【stc eeprom字符型数组写操纵子法度模范(带扇区擦除爱惜)[精彩]】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。