最近将以前15系列单片机程序直接移植过来,发现一直出现不正常,后面仔细分析查找资料,发现原来最新单片机STC8G系列EEPROM写法略有不同..........
具体不同点如下:
1、多了继存器 IAP_TPS=F5H 它是擦除等待时间继存器 而以前单片机直接将这个功能集成在IAP_CONTR中,所以直接移植会出现EEPROM无法读写
程序具体如下:
sfr DATA1=0xC2;//数据寄存器
sfr ADDRH=0xC3;//地址寄存器高八位
sfr ADDRL=0xC4;//地址寄存器低八位
sfr CMD=0xC5;//命令模式寄存器
sfr TRIG=0xC6;//命令触发寄存器
sfr CONTR=0xC7;//控制寄存器
sfr TPS=0xF5;//等待时间控制继存器
/******************************/
/********读EEPROM子函数********/
/******************************/
uchar read(uint add)//读EEPROM子函数,add为EEPROM读数地址
{
CONTR=0x82;//定义控制寄存器工作时间,打开控制寄存器,晶体为12M
TPS=12;//晶振为12MHZ
CMD=0x01;//选择读的方式
ADDRH=(add>>=8);//得到地址高八位
ADDRL=add&(0x00ff);//得到地址低八位
TRIG=0x5a;//控制码
TRIG=0xa5;//控制码
_nop_();//延时
CONTR=0x00;//复位控制寄存器
TRIG=0X00;//复位方式寄存器
return DATA1;//将值返回
}
/******************************/
/********写EEPROM子函数********/
/******************************/
void program(uint add,uchar vale)//写EEPROM子函数,add为EEPROM要写数的地址, vale为要存的数变量
{
CONTR=0x82;//定义控制寄存器工作时间,打开控制寄存器,晶体为12M
TPS=12;//晶振为12MHZ
CMD=0X02;//选择写的方式
ADDRH=(add>>=8);//得到地址高八位
ADDRL=add&(0x00ff);//得到地址低八位
DATA1=vale;//将要存的数放进存数寄存器DATA
TRIG=0x5a;//控制码
TRIG=0xa5;//控制码
_nop_();//延时
CONTR=0x00;
TRIG=0X00;
}
/******************************/
/********扇出EEPROM子函数********/
/******************************/
void sector(uint add)//扇出子函数
{
CONTR=0x82;
TPS=12;//晶振为12MHZ
CMD=0x03;//选择寄存器方式
ADDRH=(add>>=8);
ADDRL=add&(0x00ff);
TRIG=0x5a;
TRIG=0xa5;
_nop_();
CONTR=0x00;
TRIG=0X00;
}
void main()
{
dat[0]=read(0x0000);//闹钟时
while(1)
{
sector(0x0000);//先扇出
program(0x0000,dat[0]);/
}
|