STC的具体什么型号。因为04和12的 要写入的CMD不一样。
我先贴个 11F04E
//目标IC: STC-11F04E
//功能: EEPROM使用
//硬件:
// P10-P12外接3个LED到正级
#include
sfrIAP_DATA = 0xC2;
// 对对DATA FLASL/EEPROM读或者写的时候 数据全暂放的地方
sfrIAP_ADDRH = 0xC3;
// 读写 地址的高8位
sfrIAP_ADDRL = 0xC4;
// 读写 地址的底8位
sfrIAP_CMD = 0xC5;
//命令模式寄存器
//0x00待机模式
//0x01对DATA FLASL/EEPROM 字节读
//0x02对DATA FLASL/EEPROM 字节写
//0x03对DATA FLASL/EEPROM 扇区搽
sfrIAP_TRIG = 0xC6;
//命令触发寄存器
sfrIAP_CONTR = 0xC7;
//IAP_CONTR.7IPEN:读写功能允许为 1:允许0:禁止
//IAP_CONTR.6SWBS:。。。。。
#define uchar unsigned char
#define uint unsigned int
ucharDATA;
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
void _delay_ms(uint time)
{
uint sj;
for(;time>0;time--)
{
for(sj=115;sj>0;sj--);
}
}
voidIAP_Disable()//关闭IAP
{
IAP_CONTR=0;//关闭IAP
IAP_CMD=0; //命令模式清0 可以不要
IAP_TRIG=0; //可以不要
IAP_ADDRH=0x80; // 之向高地址 非EEPROM区域
IAP_ADDRL=0x00; //防止误操作
}
uchar IAP_read(ucharaddr) ///IAP 读 程序//读addr地址的数据 返回
{
IAP_CONTR=0x82;//使能IAP 660个时钟的速度
IAP_CMD=0x01;//命令模式是扇区读
IAP_ADDRH = (uchar)(addr >> 8);
IAP_ADDRL = (uchar)(addr & 0x00ff);
EA=0;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_delay_ms(1);
EA=1;
IAP_Disable();//关IAP
return (IAP_DATA); //读数据
}
void IAP_SectorErase(uchar addr) ///IAP察除 程序//察除addr地址数据
{
IAP_CONTR=0x82;//使能IAP 660个时钟的速度
IAP_CMD=0x03;//命令模式是扇区搽除
IAP_ADDRH = (uchar)(addr >> 8);
IAP_ADDRL = (uchar)(addr & 0x00ff);
EA=0;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_delay_ms(1);
EA=1;
IAP_Disable();//关IAP
}
voidIAP_Program(uint addr, uchar dat) ///IAP 写 程序在addr地址 写入 dat数据
{
IAP_CONTR=0x82;//使能IAP 660个时钟的速度
IAP_CMD=0x02;//命令模式是扇区写
IAP_ADDRH = (uchar)(addr >> 8);
IAP_ADDRL = (uchar)(addr & 0x00ff);
IAP_DATA=dat;// 写dat数据
EA=0;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_delay_ms(1);
EA=1;
IAP_Disable();//关IAP
}
voidmain()
{
IAP_SectorErase(0);///察除0地址内容
IAP_SectorErase(1);///察除0地址内容
IAP_SectorErase(2);///察除0地址内容
IAP_Program(0,0x56);//在0 1 2地址写如2个数据
IAP_Program(1,0x66);
IAP_Program(2,0x76);
if(IAP_read(0)==0x56) led3=0;//读3个数据 用LED判断数据有错误没/
if(IAP_read(1)==0x66) led2=0;
if(IAP_read(2)==0x76) led1=0;
while(1);
}