📄 stc_eep.c
字号:
#include "config.h"
/*
STC12C2052AD:
1扇区: 1000H-11FFH 2扇区: 1200H-13FFH
STC12C5410AD:
1扇区: 2800H-29FFH 2扇区: 2A00H-2BFFH
3扇区: 2C00H-2DFFH 4扇区: 2E00H-2FFFH
STC89C51RC:
1扇区: 2000H-21FFH 2扇区: 2200H-23FFH 3扇区: 2400H-25FFH 4扇区: 2600H-27FFH
5扇区: 2800H-29FFH 6扇区: 2A00H-2BFFH 7扇区: 2C00H-2DFFH 8扇区: 2F00H-2FFFH
STC89C52RC:
1扇区: 2000H-21FFH 2扇区: 2200H-23FFH 3扇区: 2400H-25FFH 4扇区: 2600H-27FFH
5扇区: 2800H-29FFH 6扇区: 2A00H-2BFFH 7扇区: 2C00H-2DFFH 8扇区: 2F00H-2FFFH
*/
//typedef unsigned char uint8;
//typedef unsigned int uint16;
//typedef unsigned long uint32;
uint16 xdata FLASH_ADDRESS=0x2800; //STC12C2052 1000 EEPROM 测试起始地址
/*******************************************************************************/
//-----------------------延时大约10ms---------------------------------------
void Delay_ms(uint16 delay) //带参数延时(delay=10,大约10ms,24MHz,1CLK)
{
uint16 i;
for (; delay>0; delay--)
for (i=0;i<10;i++);
}
/*******************************************************************************/
//------------------------IAP操作--------------------------------------------
void Do_IAP() //IAP操作
{
ISP_CONTR=0x82; //打开 IAP 功能, 设置 Flash 操作等待时间
ISP_ADDRH=FLASH_ADDRESS/0x100;//起始地址
ISP_ADDRL=FLASH_ADDRESS%0x100;
ISP_TRIG=0x46; //先送46h,再送B9h 到ISP/IAP 触发寄存器
ISP_TRIG=0xb9; //送完B9h 后,ISP/IAP 命令立即被触发起动
ISP_CONTR=0; //关闭 IAP 功能
ISP_CMD=0; //清命令寄存器,使命令寄存器无命令,此句可不用
ISP_TRIG=0; //清命令触发寄存器,使命令触发寄存器无触发,此
}
/*******************************************************************************/
//------------------------- 字节读--------------------------------------------
void Byte_Read()
{
ISP_CMD=0x1; //设置为IAP/ISP/EEPROM 字节读模式命令
Do_IAP(); //IAP操作
}
/*******************************************************************************/
//-------------------------字节编程--------------------------------------------
void Byte_Program()
{
ISP_CMD=0x02; //设置为IAP/ISP/EEPROM 字节编程模式命令
//ISP_DATA=DEBUG_DATA; //待编程的数据先送进ISP_DATA 寄存器
Do_IAP(); //IAP操作
}
/*******************************************************************************/
//-------------------------擦除扇区 -----------------------------------------
void Sector_Erase()
{ ISP_CMD=0x03; //设置为IAP/ISP/EEPROM 扇区擦除模式命令
Do_IAP(); //IAP操作
}
/*******************************************************************************/
//-------------------------读addx地址起的num哥数值到地址*p-------------------
void Read_eep_all(uint16 addx,uint8 num,uint8 *p)
{
uint8 xdata i=0;
FLASH_ADDRESS=addx;
for(i=0;i<num;i++)
{
Byte_Read();
*p=ISP_DATA;
Delay_ms(1);
FLASH_ADDRESS=FLASH_ADDRESS+1;
p++;
}
}
/*******************************************************************************/
//--------------------------读一个地址的数值------------------------------------
uint8 Read_eep_Byte(uint16 X)
{
uint8 DD;
FLASH_ADDRESS = X;
Byte_Read();
DD = ISP_DATA;
Delay_ms(1);
return (DD);
}
/********************************************************************************/
void write_eep_all(uint16 addx,uint8 num,uint8 *p)
{
uint8 xdata i=0;
FLASH_ADDRESS=addx; //存入EEPROM
Sector_Erase();
Delay_ms(10);
for(i=0;i<num;i++)
{
ISP_DATA=*p;
Byte_Program();
Delay_ms(1);
FLASH_ADDRESS=FLASH_ADDRESS+1;
p++;
}
}
/*******************************************************************************/
void write_eep_Byte(uint16 X,uint8 p)
{
uint8 xdata i=0;
FLASH_ADDRESS=X; //存入EEPROM
Sector_Erase();
Delay_ms(10);
ISP_DATA=p;
Byte_Program();
Delay_ms(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -