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

📄 stcisp.c

📁 转载的
💻 C
字号:
/********************************************************************
		本程序功能调试通过
		
		注: 本程序只供学习使用,未经作者允许,不能用于其它任何用途
		
//模 块 名:STC单片机内部FLASH读写程序
//创 建 者:电子伙伴					日期:2006-4-11 16:13
//修 改 者: 									日期:
//功能描述:
//其他说明:参考宏晶提供的C源代码再减肥一下
//芯片型号:	STC89C58RD	50MHz晶振,双倍数振荡频率 单指令周期为0.12us
//配    置: 
//版    本:V1.0
********************************************************************/
//#include "STC89C51.h"
//#include <intrins.h>

/* 定义常量 */
#define ERROR   0
#define OK      1

/* 定义Flash 操作等待时间 */
//#define WAIT_TIME		0x00				//mcu clock 40mhz
#define WAIT_TIME		0x01				//mcu clock 20mhz
//#define WAIT_TIME		0x02				//mcu clock 10mhz
//#define WAIT_TIME		0x03				//mcu clock 5mhz


/* 定义几个数据存储的位置 *//* MCU: STC89C58RD */
#define HOUR		0x8000
#define MINUTE	0x8001


/* 打开 ISP,IAP 功能 */
void ISP_EN(void)
{
	EA	=	0;															// 	关中断 		
	ISP_CONTR	=	ISP_CONTR & 0x18;       	// 0001,1000 
	ISP_CONTR	=	ISP_CONTR | WAIT_TIME;
	ISP_CONTR	=	ISP_CONTR | 0x80;       	// 1000,0000 
}

/* 关闭 ISP,IAP 功能 */
void ISP_DI(void)
{
	ISP_CONTR	=	ISP_CONTR & 0x7f;					// 0111,1111
	ISP_TRIG	=	0x00;
	EA			=   1;                				// 开中断 
}

/* 字节读 *//* 程序执行时间15us,指令周期为0.12us */
unsigned char Byte_read(unsigned int byte_addr)
{
	ISP_ADDRH	=	(unsigned char)(byte_addr >> 8);
	ISP_ADDRL	=	(unsigned char)(byte_addr & 0x00ff);

	ISP_CMD		=	ISP_CMD	&	0xf8;       		// 1111,1000 
	ISP_CMD		=	ISP_CMD	|	0x01;        		// 0000,0001  字节读数据存储区

	ISP_EN();

	ISP_TRIG	=	0x46;
	ISP_TRIG	=	0xb9;
	_nop_();

	ISP_DI();
	return (ISP_DATA);
}

/* 扇区擦除 *//* 程序执行时间10ms,指令周期为0.12us */
void Sector_erase(unsigned int Sector_addr)
{
	unsigned char addre;
	addre			=	(unsigned char)(Sector_addr >> 8); 	// 1111,1110,0000,0000; 取扇区地址 */
	ISP_ADDRH =	addre&0xfe;
	ISP_ADDRL	=	0x00;
	
	ISP_CMD	=	ISP_CMD	&	0xf8;							// 1111,1000
	ISP_CMD	=	ISP_CMD	|	0x03;							// 0000,0011  扇区擦除数据存储区
	
	ISP_EN();
	
	ISP_TRIG	=	0x46;        							// 触发ISP_IAP命令
	ISP_TRIG	=	0xb9;       							// 触发ISP_IAP命令
	 _nop_();

	ISP_DI();
}

/* 字节编程 *//* 程序执行时间64us,指令周期为0.12us */
void Byte_program(unsigned int byte_addr, unsigned char DataBuf)
{
	ISP_ADDRH	=	(unsigned char)(byte_addr >> 8);
	ISP_ADDRL	=	(unsigned char)(byte_addr & 0x00ff);

	ISP_CMD		=	ISP_CMD	&	0xf8;       		// 1111,1000 
	ISP_CMD		=	ISP_CMD	|	0x02;						// 0000,0010  字节编程数据存储区
	ISP_DATA	=	DataBuf;

	ISP_EN();
	
	ISP_TRIG	=	0x46;        							// 触发ISP_IAP命令
	ISP_TRIG	=	0xb9;        							// 触发ISP_IAP命令
	_nop_();

	ISP_DI();
}

/* 字节编程并校验 */
unsigned char ByteProgramVerify(unsigned int byte_addr, unsigned char DataBuf)
{
	ISP_ADDRH	=	(unsigned char)(byte_addr >> 8);
	ISP_ADDRL	=	(unsigned char)(byte_addr & 0x00ff);

	ISP_CMD		=	ISP_CMD	&	0xf8;        		// 1111,1000
	ISP_CMD		=	ISP_CMD	|	0x02;						// 0000,0010	 字节编程数据存储区
	ISP_DATA	=	DataBuf;

	ISP_EN();

	ISP_TRIG	=	0x46;
	ISP_TRIG	=	0xb9;
	_nop_();

	ISP_DATA	=	0x00;

	ISP_CMD		=	ISP_CMD	&	0xf8;        		// 1111,1000
	ISP_CMD		=	ISP_CMD	|	0x01;        		// 0000,0001

	ISP_TRIG	=	0x46;        							// 触发ISP_IAP命令
	ISP_TRIG	=	0xb9;        							// 触发ISP_IAP命令
	_nop_();

	ISP_DI();

	if(ISP_DATA==DataBuf)	return	OK;
	else	return	ERROR;
}

⌨️ 快捷键说明

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