最近將以前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]);/
}
|