STC15W系可以用的EEPROM实例 直接干货终于找到了

#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版权协议,转载请附上原文出处链接和本声明。