📄 eeprom.c
字号:
#include "REG52.H"
#define uint8 unsigned char
#define Uint8 unsigned char
#define uint16 unsigned int
#define Uint16 unsigned int
#include <intrins.h>
#include <absacc.h>
#include <math.h>
#include <string.h>
//#include "SYSTEM.H"
/*****************************************
STC单片机EEPROM操作
每个扇区512字节的空间, 只是用低128字节
58系列单片机有58个扇区
EEPROM起始地址0x8000
******************************************/
#ifndef __DATAFLASH_C__
#define __DATAFLASH_C__
#endif
//命令
#define READ_BYTE 0x01
#define WRITE_BYTE 0x02
#define EARSE_SECTOR 0x03
#define WAIT_TIME 0x0
//#define MAX_BYTE_USED 512 //每扇区最大存储空间
#define DEBUG_STC89C_LE52RC
#ifdef DEBUG_STC89C_LE58RD //STC89C58RD+, 89LE58RD+
#define EEPROM_start 0x8000 //58单片机的eepeom的起始地址
#endif
#ifdef DEBUG_STC89C_LE52RC //STC89C52RC, 89LE52RC
#define EEPROM_start 0x2000 //58单片机的eepeom的起始地址
#endif
#ifdef DEBUG_STC89C_LE54RC //STC89C54RC, 89LE54RC
#define EEPROM_start 0x8000 //58单片机的eepeom的起始地址
#endif
/************************/
sfr ISP_DATA = 0xe2;
sfr ISP_ADDR_H = 0xe3;
sfr ISP_ADDR_L = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
/************************/
Uint8 rdByte(Uint16 addr)
{
//addr = addr+EEPROM_start;
ISP_ADDR_H = (Uint8)(addr>>8);
ISP_ADDR_L = (Uint8)(addr&0x00ff);
ISP_CMD = READ_BYTE;
ISP_CONTR = (WAIT_TIME | 0x80);
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();
ISP_CONTR &= 0x7f;
ISP_TRIG = 0x00;
return(ISP_DATA);
}
/*addr-字节的地址,buffer[]-读的数据所在的数组,len-读的数据的长度*/
void rdData(unsigned int addr, unsigned char buffer[], unsigned int len)
{
Uint16 i;
EA = 0;
addr = addr+EEPROM_start;
for(i=0; i<len; i++)
{
buffer[i]=rdByte(addr++);
}
EA = 1;
}
void earseSector(unsigned int addr)
{
EA = 0;
addr = addr+EEPROM_start;
addr &= 0xfe00; /*块的起始地址*/
ISP_ADDR_H = (Uint8)(addr>>8);
ISP_ADDR_L = (Uint8)(addr&0x00ff);
ISP_CMD = EARSE_SECTOR;
ISP_CONTR = (WAIT_TIME | 0x80);
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();_nop_();_nop_();
ISP_CONTR &= 0x7f;
ISP_TRIG = 0x00;
EA = 1;
}
void wrByte(Uint16 addr, Uint8 byte)
{
ISP_ADDR_H = (Uint8)(addr>>8);
ISP_ADDR_L = (Uint8)(addr&0x00ff);
ISP_CMD = WRITE_BYTE;
ISP_DATA = byte;
ISP_CONTR = (WAIT_TIME | 0x80);
ISP_TRIG = 0x46;
ISP_TRIG = 0xb9;
_nop_();
ISP_CONTR &= 0x7f;
ISP_TRIG = 0x00;
}
/*addr-字节的地址,buffer[]-要写的数据的数组,len-写的数据的长度*/
void wrData(unsigned int addr, unsigned char buffer[], unsigned int len)
{
Uint8 i;
EA = 0;
addr = addr+EEPROM_start;
for(i=0; i<len; i++)
{
wrByte(addr+i, buffer[i]); /*写入整个数组*/
}
EA = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -