我正在用的代码,如果需要可以添加到你的程序里,直接调用其中的相关函数即可实现读写功能,至于为什么这么写不作赘述,自己查查资料,再对照代码应该就可以理解。加油吧!:
头文件:
EEPstore.h
#ifndef _EEPSTORE_H_
#define _EEPSTORE_H_
#define USE_IAR 1 //程序中是否使用中断(1:是,0:否)
#define READPointer //连续读函数的指针指向数据类型(方便复制:idata,xdata,code,空:通用指针)
#define WRITEPointer //连续写函数的指针指向数据类型(方便复制:idata,xdata,code,空:通用指针)
/*=============【载减函数】================*/
#define USE_EROM_read_continuous 0
#define USE_EROM_write_continuous 0
#define USE_EROM_read_word 1
#define USE_EROM_write_word 1
/*=========================================*/
//进行选择编译的条件
extern UINT8 EROM_read_byte(UINT16 addr);//读制定地址一字
extern void EROM_write_byte(UINT16 addr,UINT8 dat);//向指定地址写一字
extern void EROM_erase_sector(UINT8 n);//擦除指定扇区
extern void EROM_read_continuous(UINT16 addr,UINT8 READPointer *pr,UINT8 len);//连续读出EROM内容到指定缓存
extern void EROM_write_continuous(UINT16 addr,UINT8 WRITEPointer *pr,UINT8 len);//将缓存内容连续写入EROM
extern UINT16 EROM_read_word(UINT16 addr);//读指定地址一字数据
extern void EROM_write_word(UINT16 addr,UINT16 dat);//向指定地址写一字数据
//
//************************************************************
// 【 以下宏不要修改 】
//************************************************************
//EEOPROM首址(不同STC型号有所不同)
#define EROM_START 0x0000 //STC12C5A60S2
#define IAPTRIG() IAP_TRIG = 0x5A, IAP_TRIG = 0xA5
#define EN_IAP 0x82 //系统时钟 >= 12MHz
#endif
C文件
EEPstore.c
/*******************************************************************
STC12C5A60S2扇区分布:
第一扇区(512个字节) 第二扇区(512个字节)
起始地址 结束地址 起始地址 结束地址
0000H 01FFH 0200H 03FFH
*******************************************************************/
#include"main.h"
#include"EEPstore.h"
//UINT8 num1;
//UINT16 num2;
/********************************************************************
*函数名称:command_and_close
*输入:无
*输出:无
*函数功能:IAP触发命令 + 禁止IAP操作(清IAP相关寄存器)
********************************************************************/
static void command_and_close( void )
{
//#if (USE_ISR)
// EA = 0;
//#endif
//
IAPTRIG();
_nop_();
_nop_();
_nop_();
//#if (USE_ISR)
// EA = 1;
//#endif
IAP_CONTR = 0;
IAP_CMD = 0;
IAP_TRIG = 0;
IAP_ADDRH = 0xFF;
IAP_ADDRL = 0xFF;
}
/********************************************************************
*函数名称:EROM_read_byte
*输入:(地址)
*返回:(地址内容)
*函数功能:读指定地址一字节数据
********************************************************************/
UINT8 EROM_read_byte(UINT16 addr)
{
IAP_CONTR = EN_IAP;
IAP_CMD = 1; //允许读取EEPROM
IAP_ADDRL = addr;
IAP_ADDRH = (UINT8)(addr>>8) + (UINT8)(EROM_START>>8);
command_and_close();
return IAP_DATA;
}
/********************************************************************
*函数名称:EROM_write_byte
*输入:(地址,数据)
*输出:无
*函数功能:向指定地址写一字节数据
********************************************************************/
void EROM_write_byte(UINT16 addr, UINT8 dat)
{
IAP_CONTR = EN_IAP;
IAP_CMD = 2; //允许编写EEPROM
IAP_ADDRL = addr;
IAP_ADDRH = (UINT8)(addr>>8) + (UINT8)(EROM_START>>8);
IAP_DATA = dat;
command_and_close();
}
/********************************************************************
*函数名称:
*输入:(扇区号)
*输出:无
*函数功能:擦除指定扇区
********************************************************************/
void EROM_erase_sector(UINT8 n)
{
IAP_CONTR = EN_IAP;
IAP_CMD = 3; //允许擦除EEPROM
IAP_ADDRL = 0x00;
IAP_ADDRH = (UINT8)(EROM_START>>8) + n*0x02;
command_and_close();
}
/********************************************************************
*函数名称:EROM_read_continuous
*输入:(起始地址,指针指向,字节长)
*输出:无
*函数功能:连续读数据
********************************************************************/
#if (USE_EROM_read_continuous)
void EROM_read_continuous(UINT16 addr, UINT8 READPointer *pr, UINT8 len)
{
while (len--)
{
*pr = EROM_read_byte(addr);
pr++;
addr++;
}
}
#endif
/********************************************************************
*函数名称:EROM_write_continuous
*输入:(起始地址,指针指向,字节长)
*输出:无
*函数功能:连续写数据
********************************************************************/
#if (USE_EROM_write_continuous)
void EROM_write_continuous(UINT16 addr, UINT8 WRITEPointer *pr, UINT8 len)
{
while (len--)
{
EROM_write_byte(addr, *pr);
pr++;
addr++;
}
}
#endif
/********************************************************************
*函数名称:EROM_read_word
*输入:起始地址
*输出:读取的数据
*函数功能:读指定地址一字数据
********************************************************************/
#if (USE_EROM_read_word)
UINT16 EROM_read_word(UINT16 addr)
{
UINT16 dat;
((UINT8 *)&dat)[0] = EROM_read_byte(addr++);
((UINT8 *)&dat)[1] = EROM_read_byte(addr);
return dat;
}
#endif
/********************************************************************
*函数名称:EROM_write_word
*输入:写入的地址,写入的数据
*输出:无
*函数功能:向指定地址写一字数据
********************************************************************/
#if (USE_EROM_write_word)
void EROM_write_word(UINT16 addr, UINT16 dat)
{
EROM_write_byte(addr++, ((UINT8 *)&dat)[0]);
EROM_write_byte(addr, ((UINT8 *)&dat)[1]);
}
#endif
我都是用STC12c5A60s2内部自带的eeprom。也很方便,设置下控制寄存器然后套模板,并且不用像IIC的那样还得考虑时序、晶振。官方手册上有模板程序