📄 isp64k.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 + -