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

📄 flash.c

📁 16路巡检仪 该仪表采用c语言编写
💻 C
字号:
#include	"head.h"
#include	"AT89X52.H"

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 	ISP_BYTE_READ		  	0x01        
#define 	ISP_BYTE_PROGRAM        0x02       
#define 	ISP_SECTOR_ERASE 	    0x03        
#define 	WAIT_TIME 				0x01
#define 	FLASH_BASE_ADD 			0x8000

void flashB(uint	 dataadd	)					//读写操作
{	
	ISP_ADDRH=(uchar)(dataadd>>8);			//传递高地址
	ISP_ADDRL=(uchar)(dataadd&0x00ff);		//传递低地址
	ISP_CONTR=WAIT_TIME;					//设置等待时间			
	ISP_CONTR|=0x80;			   			//允许ISP_IAP操作 
	ISP_TRIG=0X46;							//触发			
	ISP_TRIG=0XB9;							//触发
	_nop_();
	ISP_CONTR=0;
	ISP_TRIG=0;
	ISP_ADDRH=0xff;
	ISP_ADDRL=0xff;
}

void flashByteR(uchar *buf,uchar sq,uint sta,uint len)		//字节读
{
	uint fdaadd;
	uint ty;
	fdaadd  =FLASH_BASE_ADD+sq*512+sta;
	ISP_CMD  =ISP_BYTE_READ;
	for(ty=0;ty<len;ty++)
	{
		flashB(fdaadd);
		buf[ty]=ISP_DATA;
		fdaadd++;
	}	
}
void flashWB(uchar*buf,uchar sq,uint len)//字节写
{
	uint 	dataadd;
	uint 	ty;
	uchar	t=0;
	for(ty=0;ty<len;ty++)
	{
		if(ty==512*t)
		{				
			dataadd  =FLASH_BASE_ADD+sq*0X200;
			ISP_CMD	 =ISP_SECTOR_ERASE;
			flashB(dataadd);
			sq++;
			t++;
		}
		ISP_DATA =buf[ty];
		ISP_CMD  =ISP_BYTE_PROGRAM;	
		flashB(dataadd);
		dataadd++;	
	}
		ISP_DATA =0x55;
		ISP_CMD  =ISP_BYTE_PROGRAM;
		flashB(dataadd);
		dataadd++;
		ISP_DATA =0xaa;
		ISP_CMD  =ISP_BYTE_PROGRAM;	
		flashB(dataadd);
}

void flashFByteR(float *buf,uchar sq,uint sta,uint len)	//4字节读
{
	uint fdaadd;
	uint ty;
	union ITOC
	{
		uchar cda[4];
		float  ida;	
	} crc;
	fdaadd  =FLASH_BASE_ADD+sq*512+sta;
	ISP_CMD  =ISP_BYTE_READ;
	for(ty=0;ty<len;ty++)
	{
		flashB(fdaadd);
		crc.cda[0]=ISP_DATA;
		fdaadd++;
		flashB(fdaadd);
		crc.cda[1]=ISP_DATA;
		fdaadd++;
		flashB(fdaadd);
		crc.cda[2]=ISP_DATA;
		fdaadd++;
		flashB(fdaadd);
		crc.cda[3]=ISP_DATA;
		buf[ty]=crc.ida;
		fdaadd++;
		
	}	
}

void flashW(float*buf,uchar sq,uint len)			//四个字节写
{
	uint dataadd;
	uchar tt=0;
	union ITOC
	{
		uchar cda[4];
		float  ida;	
	} crc;
	uint ty;
	for(ty=0;ty<len;ty++)
	{
		if((ty*4)==512*tt)
		{				
			dataadd  =FLASH_BASE_ADD+sq*0X200;
			ISP_CMD	 =ISP_SECTOR_ERASE;
			flashB(dataadd);
			sq++;
			tt++;
		}
		crc.ida=buf[ty];
		ISP_DATA =crc.cda[0];
		ISP_CMD  =ISP_BYTE_PROGRAM;	
		flashB(dataadd);
		dataadd++;
		ISP_DATA =crc.cda[1];
		ISP_CMD  =ISP_BYTE_PROGRAM;	
		flashB(dataadd);
		dataadd++;
		ISP_DATA =crc.cda[2];
		ISP_CMD  =ISP_BYTE_PROGRAM;	
		flashB(dataadd);
		dataadd++;
		ISP_DATA =crc.cda[3];
		ISP_CMD  =ISP_BYTE_PROGRAM;	
		flashB(dataadd);
		dataadd++;
	}
		ISP_DATA =0x55;
		ISP_CMD  =ISP_BYTE_PROGRAM;
		flashB(dataadd);
		dataadd++;
		ISP_DATA =0xaa;
		ISP_CMD  =ISP_BYTE_PROGRAM;	
		flashB(dataadd);
}


void flashtW(int *buf,uchar sq,uint len)
	{
		uint		dataadd;
		uchar	t=0;
		uint		Tn;
		union ITOC
		{
			char cda[2];
			int  ida;	
		} crc;
		for(Tn=0;Tn<len;Tn++)
		{
			if(Tn==128*t)
			{				
				dataadd  =FLASH_BASE_ADD+sq*0X200;
				ISP_CMD  =ISP_SECTOR_ERASE;//擦除一个扇区
				flashB(dataadd);//擦除
				sq++;
					
			}
			crc.ida=buf[Tn];
			ISP_DATA =crc.cda[0];
			ISP_CMD  =ISP_BYTE_PROGRAM; //写入操作
			flashB(dataadd);
			dataadd++;
			ISP_DATA =crc.cda[1];
			ISP_CMD  =ISP_BYTE_PROGRAM; //写入操作
			flashB(dataadd);
			dataadd++;	
		}
			ISP_DATA =0x55;
			ISP_CMD  =ISP_BYTE_PROGRAM; //写入操作
			flashB(dataadd);
			dataadd++;
			ISP_DATA =0xaa;
			ISP_CMD  =ISP_BYTE_PROGRAM; //写入操作
			flashB(dataadd);
	}

void	flashtR(int*buf,uchar sq,uint sta,uint len)
{
	uint fdaadd;
	uint ty;
	union ITOC
	{
		char cda[2];
		int	 ida;	
	} crc;
	fdaadd  =FLASH_BASE_ADD+sq*512+sta;
	ISP_CMD  =ISP_BYTE_READ;
	for(ty=0;ty<len;ty++)
	{
		flashB(fdaadd);
		crc.cda[0]=ISP_DATA;
		fdaadd++;
		flashB(fdaadd);
		crc.cda[1]=ISP_DATA;
		buf[ty]=crc.ida;
		fdaadd++;	
	}	
}














⌨️ 快捷键说明

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