#ifndef __EEPROM_H__
#define __EEPROM_H__
#include "stc8hxx.h"
#include "intrins.h"
union u16_2char
{
unsigned char p[2];
unsigned int num;
};
//从某扇区读取一个2字节数据
unsigned int Read_EEPROM_u16(unsigned int add);
//在某个地址所在扇区保存一个2字节数据
void Save_EEPROM_u16(unsigned int add,unsigned int dat);
//在EEPROM里面一次性写入20个数据
void Wr_20_Long(unsigned int addr,long *dat);
//在EEPROM里面一次性读取20个数据
void Re_20_Long(unsigned int addr,long *dat);
#endif
#include "EEPROM.h"
void IapIdle()
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0; //清徐IAP地址
}
//读取某地址一个字节
unsigned char Read_One_Byte(unsigned int addr) //读IAP数据
{
unsigned char dat;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数12MHz
IAP_CMD = 1; //设置IAP读命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); // 延时等待发送完成
dat = IAP_DATA; //读IAP数据
IapIdle(); //关闭IAP功能
return dat;
}
//在某地址写入一个字节
void Write_One_Byte(unsigned int addr,unsigned char dat) //写IAP数据
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数12MHz
IAP_CMD = 2; //设置IAP写命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写IAP数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); // 延时等待发送完成
IapIdle(); //关闭IAP功能
}
//擦除某地址所在的扇区
void Erase_IAP(unsigned int addr) //IAP擦除
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数12MHz
IAP_CMD = 3; //设置IAP擦除命令
IAP_ADDRL = addr; //设置IAP低8位地址
IAP_ADDRH = addr >> 8; //设置IAP高8位地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); // 延时等待发送完成
IapIdle(); //关闭IAP功能
}
//在某个地址所在扇区保存一个2字节数据
void Save_EEPROM_u16(unsigned int add,unsigned int dat)
{
unsigned int addr = 0;
union u16_2char dat1;
addr = add;
dat1.num = dat;
addr = add * 256 + 1;//非IAP系列单片机,直接输入扇区地址用的
Erase_IAP(addr);//擦除当前扇区
Write_One_Byte(addr,dat1.p[0]);//保存的高字节在前
Write_One_Byte(addr+1,dat1.p[1]);
// Write_One_Byte(addr+2,dat1.p[2]);
// Write_One_Byte(addr+3,dat1.p[3]);
}
//从某扇区读取一个2字节数据
unsigned int Read_EEPROM_u16(unsigned int add)
{
unsigned int addr = 0;
union u16_2char dat1;
addr = add;
dat1.p[0] = Read_One_Byte(addr);
dat1.p[1] = Read_One_Byte(addr+1);
// dat1.p[2] = Read_One_Byte(addr+2);
// dat1.p[3] = Read_One_Byte(addr+3);
return dat1.num;
}
//在EEPROM里面一次性写入20个数据
void Wr_20_unsignedint(unsigned int addr,unsigned int *dat)
{
unsigned int addr2=0;
unsigned char a=0;
addr2 = addr;
Erase_IAP(addr2);//擦除当前扇区
for(a=0;a<20;a++)
{
Save_EEPROM_u16 (addr2,dat[a]);
addr2 += 2;
}
}
//在EEPROM里面一次性读取20个数据
void Re_20_unsignedint(unsigned int addr,unsigned int *dat)
{
unsigned int addr2=0;
unsigned char a=0;
addr2 = addr;
for(a=0;a<20;a++)
{
dat[a] = Read_EEPROM_u16(addr2);
addr2 += 2;
}
}
这样改好像不对呀?请高人指点! |