⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stc_eeprom.c

📁 stc单片机具有在应用编程
💻 C
字号:
/*----------------------------------------------------------------    
*File Name: STC_EEPROM.c                                    -
*Description: IAP/ISP 功能                     - 
*Project:                                                       -
*MCU type: STC12C5410AD                                       -
                                                                     -
*Company: WY                                                   -
*Compiler: KEIL C51                                             -
*DESINER:        郭准 06.2.7                                          -
-----------------------------------------------------------------------*/

#include <global.h>    //定义的 系统头文件和全局变量

/*IAP有关功能寄存器*/
sfr ISP_DATA  = 0xE2;
sfr ISP_ADDRH = 0xE3;
sfr ISP_ADDRL = 0xE4;
sfr ISP_CMD   = 0xE5;
sfr ISP_TRIG  = 0xE6;
sfr ISP_CONTR = 0xE7;
//----------------------------定义常量
#define ENABLE_ISP 0x82  //<20MHz
//#define ENABLE_ISP 0x83  //<12MHz

#define DEBUG_DATA 0x5A

//----------------------------flash 存储的起始地址
#define DATA_FLASH_START_ADDRESS  0x2800  //stc12c2052ad  ////////////???????????

uchar tx_buf[3] = {0,0,0};

extern void Delay(uint number);//晶振=11059200,机器周期=1.085069444us,"加"的机器周期=1
extern void send_char_com(uchar ch); 
extern void send_string_com(uchar *str,uchar strlen);

uchar Byte_Read(uint address);
void Sector_Erase(uint address);
void Byte_Program(uint address,uchar ch);
/*
void Eeprom_Start(void)
{
	P1 = 0xf0; //开始工作
    	Delay(2); //22us..原13us
	// SP = 0xE0;  //堆栈指针指向0E0H单元
}
*/
//------------------------------------------------------
//功能:读一字节;调用前需打开IAP功能
//入口:uint address=页地址0~512,为了提高处理速度,最好用0~256的范围
//出口:
//设计:郭准,伟业,2006/2/7
//------------------------------------------------------
uchar Byte_Read(uint address)
{
	uchar data ch;
    
	ISP_CONTR = ENABLE_ISP;    //打开IAP功能,设置Flash操作等待时间
	ISP_CMD = 0x01;                //选择读AP模式
	//--------------------------
	address = DATA_FLASH_START_ADDRESS+address;
	ISP_ADDRH = (uchar)(address>>8);      //填页地址
	ISP_ADDRL = (uchar)(address);      //填页地址

	EA = 0;

	ISP_TRIG = 0x46;      //出发ISP处理器
	ISP_TRIG = 0xB9;

    	nop();

	ch = ISP_DATA;   //保存数据
	EA = 1;
	/------------------------在处理器完成之前,CUP将暂停
	//------------------------关闭IAP功能,清与ISP有关的特殊功能寄存器
	ISP_CONTR = 0;
	ISP_CMD = 0;
	ISP_TRIG = 0;

	// send_char_com(ch + 0x30);
	return ch;
}
//------------------------------------------------------
//功能:擦除扇区
//入口:uint address=页地址0~512,为了提高处理速度,最好用0~256的范围
//出口:
//设计:郭准,伟业,2006/2/7
//------------------------------------------------------
void Sector_Erase(uint address)
{
	ISP_CONTR = ENABLE_ISP;    //打开IAP功能,设置Flash操作等待时间
	ISP_CMD = 0x03;                //选择页擦除模式
	//--------------------------
	address = DATA_FLASH_START_ADDRESS+address;
	ISP_ADDRH = (uchar)(address>>8);      //填页地址
	ISP_ADDRL = (uchar)(address);      //填页地址

	EA = 0;

	ISP_TRIG = 0x46;      //出发ISP处理器
	ISP_TRIG = 0xB9;

    	nop();
	EA = 1;

	//------------------------关闭IAP功能,清与ISP有关的特殊功能寄存器
	ISP_CONTR = 0;
	ISP_CMD = 0;
	ISP_TRIG = 0;

}

//------------------------------------------------------
//功能:字节编程,写
//入口:uint address=页地址0~512,为了提高处理速度,
//      最好用0~256的范围;uchar ch=要写的数据
//出口:
//设计:郭准,伟业,2006/2/7
//------------------------------------------------------
void Byte_Program(uint address,uchar ch)
{   
 	//   Sector_Erase(address);

	ISP_CONTR = ENABLE_ISP;    //打开IAP功能,设置Flash操作等待时间
	ISP_CMD = 0x02;                //选择字节编程模式
	//--------------------------
	address = DATA_FLASH_START_ADDRESS+address;
	ISP_ADDRH = (uchar)(address>>8);      //填页地址
	ISP_ADDRL = (uchar)(address);      //填页地址

	ISP_DATA = ch;

	EA = 0;

	ISP_TRIG = 0x46;      //出发ISP处理器
	ISP_TRIG = 0xB9;

	nop();
 
	EA = 1;

	//------------------------关闭IAP功能,清与ISP有关的特殊功能寄存器
	ISP_CONTR = 0;
	ISP_CMD = 0;
	ISP_TRIG = 0; 
}

//------------------------------------------------------
//功能:字节编程,写字符串
//入口:uint address=页地址0~512,为了提高处理速度,
//      最好用0~256的范围;uchar ch=要写的数据
//      len=字符串的长度
//出口:
//设计:郭准,伟业,2006/2/7
//------------------------------------------------------
void Morebyte_Program(uint address,uchar *ch,uchar len)
{ 
	uchar k = 0;

	Sector_Erase(address);
	do{
		Byte_Program(address,*(ch + k));
		address++;
        	k++;
	}while(k < len);

}

//------------------------------------------------------
//功能:读多字节;调用前需打开IAP功能
//入口:uint address=页地址0~512,为了提高处理速度,最好用0~256的范围
//出口:
//设计:郭准,伟业,2006/2/7
//------------------------------------------------------
void Moreyte_Read(uint address)
{
	uchar k = 0;
	do{
		tx_buf[k] = Byte_Read(address);
		address++;
        	k++;
	}while(k < 3);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -