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

📄 isp64k.c

📁 可以从计算机向WINBOND516直接下载程序的源码
💻 C
字号:
		  ////////////////////////////////////
////       ISP v2.0 4K LDROM        /////
///   2002.6.19 write by CHWH  /////
////////////////////////////////////
#include  <reg51.h>
#include  "demo.h"
//////////////
#define AUTO        0x11
#define READ_4K    0x22
#define ERASE_4K   0x33
#define BLANK_CHECK 0x44
#define PROGRAM_4K 0x55
#define REST_MCU    0x66
//////////////
///////////////////function declare////////////////////////////

                
BYTE prg_times=0;                     
/////////////main ///////////////////  
void Isp_64K_4K(void)        
{  
	BYTE recchar;
	EA=0;     //disable interrupt 
	do_F04KBOOT();
	set_rs232();   //set rs232 and 
	while(1)
	{
		while(RI==0);  RI=0; 	  
		recchar=SBUF; 
		switch(recchar)
		{case AUTO: 
		while(prg_times<3)   //max can fireware 3 times
		{
			Erase_4k(); 
			while(!blank_check())Erase_4k();
			SBUF='s';   //send for singel(pc)              
			while(TI==0);TI=0 ;
			program_4k();
		} 
		
		break;
		case READ_4K:
			read_4k();
			SBUF=READ_4K;   //send for singel(pc)              
			while(TI==0);TI=0 ;
			break;
		case  ERASE_4K:
			Erase_4k();
			SBUF=ERASE_4K;   //send for singel(pc)              
			while(TI==0);TI=0 ;
			break;
		case	BLANK_CHECK:
			if(blank_check())
			{	
				SBUF=BLANK_CHECK;   //send for singel(pc)              
				while(TI==0);TI=0 ;
			}
			else 
			{
				SBUF=BLANK_CHECK+1;   //send for singel(pc)              
				while(TI==0);TI=0 ;
			}
			break;
		case PROGRAM_4K:
			program_4k();					   
			break;
		case 0xfb:
                     {
            SBUF=0xfb;
			while(TI==0);TI=0;
            ET0=1;
            IP=0X02;
            EA=1;
            TR0=0;
            CHPENR=0x87;    
            CHPENR=0x59;
            CHPCON=0x03;
            TR0=1;
            TH0=0xff;
            TL0=0xf0;                                   
            PCON=0x01; 
           }
		}//end switch
	} //end while(1)  
}
//////////////////////////////////////////////
void do_F04KBOOT()
{

	 CHPENR=0x87;    
     CHPENR=0x59;
     CHPCON=0x01; 
	 CHPENR=0x00;
}
//////////////////
void set_rs232()   //set rs232 and send 's' to pc
{
	TMOD=0x21;//T1 is mode 1
	TL1=0xfd; //set buad rate is 9600
	TH1=0xfd;
	TR0=0;
	IE=0X82; ///== ET0=1;  EA=1;
	SCON=0x50;   //set rs232 is mode 1 and enable receive
	TR1=1;  //start count T1;   
}         
////////////////////
void Erase_4k() 
{
	
	TR0=0;
	TL0=0X3C;
	TH0=0XB0;
	SFRCN=0X62;  ///////////ERASE 4K FLASH ROM
	TR0=1;
	PCON=0X01;
}   
///////////////////////////////////
bit blank_check()
{
	SFRCN=0x40;  //READ 4K APROM MODE
	SFRAH=0X00;	  //START ADDRESS=0X0000
	SFRAL=0X00;    
	do
    {
		do
		{ 
			TL0=0XFB;
			TH0=0XFF;
			TR0=1;
			PCON=0X01;
			if(SFRFD!=0xff)return 0;// IF IS NOT 0XFF THERN RETURN error
			else SFRAL++;
		} while(SFRAL);
		SFRAH++;
	} while(SFRAH<0x10);
	return 1;
}
                             
void program_4k()
{  
	BYTE filesizeH,filesizeL;
	WORD filesize;
	WORD checksum=0,rec_checksum;
	BYTE checksumH,checksumL; 
	while(RI==0);  RI=0; 	  
	filesizeH=SBUF;
    while(RI==0);  RI=0; 	  
	filesizeL=SBUF; 
	filesize=((WORD)filesizeH<<8)+(WORD)filesizeL;
	SFRCN=0x61; // Program 4k flash rom
	SFRAH=0X00;	  //START ADDRESS=0X0000
	SFRAL=0X00;
	do{ 
		do
        {  
			while(RI==0);  RI=0; 
            SFRFD=SBUF;
			checksum+=SBUF; 
			TL0=0X5A;
            TH0=0XFF;
			TR0=1;
			PCON=0X01;
			SFRAL++;
			filesize--;
		}while(SFRAL&&filesize);
		SFRAH++; 
    }while(filesize);		
	
	while(RI==0);  RI=0;  
    checksumH=SBUF;	    //read verify sum high 8bit 	   
	while(RI==0);  RI=0; 
    checksumL=SBUF;		  //read verify sum low 8bit	
	rec_checksum=((WORD)checksumH<<8)+(WORD)checksumL;//calculate receive sum	 
	if(rec_checksum==checksum)
	{ 
		prg_times=4;  
		SBUF='o';   //is fireware success (send 'o' to pc)            
		while(TI==0);TI=0 ;
	} 
	else
	{  
		prg_times++; 
		SBUF='E';   //no fireware success (send 'E' to pc)            
        while(TI==0);TI=0 ; 
		
	}   
	
}  
void read_4k()
{ 
	SFRCN=0x40;  //READ 64K APROM MODE
	SFRAH=0X00;	  //START ADDRESS=0X0000
	SFRAL=0X00;   
	do
    {
		do
		{ 
			TL0=0XFB;
			TH0=0XFF;
			TR0=1;
			PCON=0X01;
			SBUF=SFRFD;
			while(TI==0);TI=0;
			SFRAL++;
		} while(SFRAL);
		
		SFRAH++;
	} while(SFRAH<0x10);    
}                                     



⌨️ 快捷键说明

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