贴上EEPROM读写程序
/*------------------------------------------------------------------------------
** 函数原型: void EEPROM_Erase(void)
** 功能描述: 擦除扇区
** 参数说明:
**
** 返回值:
**
** 全局变量:
** 调用模块:
** 作 者:
** 日 期:
**----------------------------------------------------------------------------*/
void EEPROM_Erase(uchar PAGE)
{
bit CY;
CY = EA; // 保存中断状态
EA = 0; // 关闭中断
FLASHCON = 0x01; // 访问eeprom
XPAGE = PAGE; // 选择扇区0
IB_CON1 = 0xE6; // 扇区擦除
IB_CON2 = 0x05; // 关键字
IB_CON3 = 0x0A; // 关键字
IB_CON4 = 0x09; // 关键字
IB_CON5 = 0x06; // 启动擦除
_nop_();
_nop_();
_nop_();
_nop_();
XPAGE = 0X00; // 扇区清0
FLASHCON = 0x00; // 清0
EA = CY; // 中断恢复
}
/*------------------------------------------------------------------------------
** 函数原型: void EEPROM_Read_data(void)
** 功能描述: 读EEPROM数据
** 参数说明:
**
** 返回值:
**
** 全局变量:
** 调用模块:
** 作 者:
** 日 期:
**----------------------------------------------------------------------------*/
void EEPROM_Read_data(uint addr )
{
bit CY;
uchar i;
uchar code * EEPROM_Addr;
uchar * RAM_Addr;
CY = EA; // 保存中断状态
EA = 0; // 关闭中断
FLASHCON = 0x01; // 访问eeprom
EEPROM_Addr = (uchar code *) addr; // 保存EEPROM起始地址
RAM_Addr = (uchar *)0x70; // 需要保存的变量起始地址 );
for(i=0;i<29;i++)
{
*(RAM_Addr++) = *(EEPROM_Addr++) ; // 读EEPROM数据
}
XPAGE = 0X00; // 扇区清0
FLASHCON = 0x00;
EA = CY; // 中断恢复
}
/*------------------------------------------------------------------------------
** 函数原型: void EEPROM_Write_data(void)
** 功能描述: 写EEPROM数据
** 参数说明:
**
** 返回值:
**
** 全局变量:
** 调用模块:
** 作 者:
** 日 期:
**----------------------------------------------------------------------------*/
void EEPROM_Write_data(uchar PAGE)
{
bit CY;
uchar i;
uchar * RAM_Addr;
uchar EEPROM_Addr;
CY = EA; // 保存中断状态
EA = 0; // 关闭中断
FLASHCON = 0x01; // 访问eeprom
EEPROM_Addr = 0; // 保存EEPROM起始地址
RAM_Addr =(uchar *)0x70; // 需要保存的变量起始地址
for(i=0;i<29;i++) // 所有变量加起来29个字节
{
XPAGE = PAGE; // 选择扇区0
IB_OFFSET = EEPROM_Addr; // 要写入EEPROM偏移地址
IB_DATA = *(RAM_Addr++); // 要写入的数据
EEPROM_Addr++; // 地址+1
IB_CON1 = 0x6E; // 扇区编程
IB_CON2 = 0x05; // 关键字
IB_CON3 = 0x0A; // 关键字
IB_CON4 = 0x09; // 关键字
IB_CON5 = 0x06; // 启动编程
_nop_();
_nop_();
_nop_();
_nop_();
}
XPAGE = 0X00; // 扇区清0
FLASHCON = 0x00;
EA = CY; // 中断恢复
}
利用内部EEPROM保存仪表的校准参数,1000台中发现有几台参数变成0不知道怎么回事? |