#include <STC15F2K60S2.H> //通用头文件
#include <intrins.h> //库头文件
#define uint unsigned int //宏定义数据类型uint
#define uchar unsigned char //宏定义数据类型uchar
//宏定义ISP的操作命令
#define CMD_IDLE 0 //空闲模式
#define CMD_READ 1 //IAP字节读命令
#define CMD_PROGRAM 2 //IAP字节编程命令
#define CMD_ERASE 3 //IAP扇区擦除命令
#define ENABLE_IAP 0x82 //CPU的等待时间
#define IAP_ADDRESS 0x0000 //测试地址
/*----------------------------
关闭IAP功能
----------------------------*/
void IapIdle()
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0;
}
/*----------------------------
从ISP/IAP/EEPROM区域读取一字节
----------------------------*/
uchar IapReadByte(uint addr)
{
uchar dat; //数据缓冲区
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_READ; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
dat = IAP_DATA; //读ISP/IAP/EEPROM数据
IapIdle(); //关闭IAP功能
return dat; //返回
}
/*-------------------------------
写一字节数据到ISP/IAP/EEPROM区域
--------------------------------*/
void IapProgramByte(uint addr, uchar dat)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_PROGRAM; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写ISP/IAP/EEPROM数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle(); //关闭IAP功能
}
/*----------------------------
ISP/IAP/EEPROM扇区擦除
----------------------------*/
void IapEraseSector(uint addr)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_ERASE; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle(); //关闭IAP功能
}
/**ms延时子程序(11.0592MHz 1T)****/
void delayms(uint k)
{
uint i,j;
for(i=k;i>0;i--)
for(j=829;j>0;j--);
}
void main()
{
uchar i;
uchar a[5]={0x01,0x02,0x04,0x08,0x10};
uchar b[5];
//写EEPROM前不管多少字节(最多512字节)要先擦除整个扇区
IapEraseSector(IAP_ADDRESS);//擦除EEPROM整个扇区,一个扇区512个字节
for(i=0;i<5;i++)
{
IapProgramByte(IAP_ADDRESS+i,a[i]);//连续写入5个字节
}
for(i=0;i<5;i++)
{
b[i]=IapReadByte(IAP_ADDRESS+i);//连续读取EEPROM中数据另存到b[]
}
while(1)
{
for(i=0;i<5;i++)
{
P1=b[i];//验证b[]中保存的数据
delayms(1000);
}
}
}
版权声明:本文为qq_40286628原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。