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

📄 fy_plt.c

📁 ATMEL89S53 ISP 下载程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "stdio.h"
#include "time.h"
#include "math.h"
#include "conio.h"
#include "windows.h"

#include "stdafx.h"
#include "DirectPort.h"

//#define validPpt 0x378
//#define (validPpt+1) 0x379
//#define (validPpt+2) 0x37A
#define LPT1 0x378	// the search order is LPT1 then 2 then 3
#define LPT2 0x278	// first valid address found is used (re-order if needed for multiple ports)
#define LPT3 0x3bc	// hardware base address for parallel port
int	validPpt;

#define MISO 0x7	/*statu.7  pin11	*/
#define	ISCK 0x6	/*statu.6  pin10	*/

#define RESET 0x1	/*command.1	pin14	*/
#define SS 0x2		/*command.2	pin16 	*/

#define MOSI 0x1	/*data.1	pin3	*/
#define PSCK 0x0	/*data.0	pin2	*/



unsigned char clrbit(unsigned char byte_char,unsigned nbit);	
unsigned char setbit(unsigned char byte_char,unsigned nbit);
unsigned char movbit(unsigned char byte_char1,unsigned n,unsigned char byte_char2,unsigned m);
void shout(unsigned char outdata);
unsigned char shin();
unsigned char shoutin(unsigned char outdata);


unsigned char write_code(unsigned char byte,unsigned int address);
unsigned char read_code(unsigned int address);
void send_data(unsigned char byte,unsigned int address);

int hextobin(FILE *fp);
int copybin(FILE *fp);

long hval(char *str);

void clr_ss();
void set_ss();
void clr_psck();
void set_psck();
void clr_mosi();
void set_mosi();
void set_reset();
void clr_reset();
void erase_chip();
void enable_program();
void wait(long t);
void enable_outport();
void start_program();
void end_program();
int loadfile();

void program();
void terminate();
void erasechip();
void verify();
void readbin();
void testchip();
void lockbit();
void modify();
void debug();
void waitdata();
void polling();

void main()
{	char key;



	DWORD result;
	result= DP_GetVer();
	printf("DIRECTPORT VER: %08x	",result);

	if(DP_IsNTOS())
		printf("OS: WINDOWS NT 		");
	else
		printf("OS: WINDOWS 9x 		");


	if(DP_UseDirectPortMode(FALSE))
		printf("\nPORTMODE SET OK.");
	else
		printf("\nPORTMODE SET FAULT.");

// search for valid parallel port
	DP_OutpB(LPT1, 0x55);
	if((int)DP_InpB(LPT1) == 0x55)
	{    validPpt=LPT1;
	}
	else
	{	DP_OutpB(LPT2, 0x55);
		if((int)DP_InpB(LPT2) == 0x55)
		{	validPpt=LPT2;
		}
		else
		{
			DP_OutpB(LPT3, 0x55);
			if((int)DP_InpB(LPT3) == 0x55)
				validPpt=LPT3;
			else
				validPpt=0;
		}
	}
	if(validPpt)
		printf("\nValid LPT address = %x\n", validPpt);
	else
		printf("\nHave No Valid LPT address.\n");


	enable_outport();
		
redoit:
	printf("\n");
	
	printf("________________________________________");
	printf("________________________________________\n");
	printf("AT89S53 ISP PROGRAMER & DEBUG TOOLS.  Ver1.0 2007.5 FuYi WUHAN.CHINA\n");
	printf("P-program\t");
	printf("C-copy flash\t");
	printf("E-erase chip \t");
	printf("V-verify \t");
	printf("M-modify \n");
	printf("S-reset chip \t");
	printf("T-test write\t");
	printf("L-lockbit\t");
	printf("R-read ram\t");
	printf("W-wait data\n");
	printf("Q-quit\n");
	
	printf("Please press function key>");
	key=toupper(getch());
	printf("%c\n\n",key);
	switch(key)
	{	case 'P':
			program();
			break;
		case 'C':
			readbin();
			break;
		case 'Q':
			terminate();
			break;
		case 'E':
			erasechip();
			break;
		case 'T':
			testchip();
			break;
		case 'V':
			verify();
			break;	
		case 'M':
			modify();
			break;
		case 'L':
			lockbit();
			break;	
		case 'R':
			debug();
			break;						
		case 'W':
			polling();
			break;						
		case 'S':
			start_program();
			Sleep(100);
			end_program();			
			break;			
			
		default:printf("You pressed the HAVE NOT defined key.\n");break;
	}
	goto redoit;
	
	
}

void debug()
{	unsigned x,indata,data,pre_x,pre_y;
	int y;
	int i;
	char str[32],*pstr;
//	int tempdata;
	pstr=str;

//	clrscr();
	printf("\n\r");

	printf("\nThis function need 89s53 program support.");
	printf("\nAnd the 89s53 SPI should working on slave mode.");
	x=0;
	y=0x100;
	
start:	
	printf("\nPlese input ram address[0-ffhex]['r'read pre]:");
	i=0;
RETDX:	
	data=getch();
	if (isxdigit(data))
	{
	printf("%c",data);
	str[i++]=data;
	}

	if ((data==0x72)||(data==0x52)) goto READRAM;

	if (data==0x1b)
	{end_program();
	printf("\n");
	return;
	};
	
	if(data==0x0d)
	{	
		str[i]='\0';
		x=hval(pstr);
		goto length;	
	};

	goto RETDX;


length:
	printf("\nPlese input length[0-100hex]:");
	i=0;
RETDY:	
	data=getch();
	if (isxdigit(data))
	{
	printf("%c",data);
	str[i++]=data;
	}

	if (data==0x1b)
	{end_program();
	printf("\n");
	return;
	};
	
	if(data==0x0d)
	{	
		str[i]='\0';
		y=hval(pstr);
		goto READRAM;	
	};

	goto RETDY;


READRAM:
	pre_x=x;
	pre_y=y;

	indata=shoutin((unsigned char)(x++));
	printf("\n");
	printf(" pre read byte:%3x\n",indata);
	
	printf("%6s%3x%3x%3x%3x%3x%3x%3x%3x%3x%3x%3x%3x%3x%3x%3x%3x\n","tab ",0,1,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf);
	printf("------------------------------------------------------\n");
	wait(1000);
	
	
	
	printf("%3xH :",(x-1));
	

	
	for (i=0;i<y;i++)
	{
		indata=shoutin((unsigned char)(x++));
		wait(1000);
		printf("\%3x",indata);
		if (((i+1)%0x10==0)&&((i+1)!=y)) 
		{printf("\n");
		printf("%3xH :",x-1);}
	};

	printf("\n");
	
	printf("rear send byte:%3x\n",x);
	x=pre_x;
	y=pre_y;

	goto start;
}





int hextobin(FILE *fp)
{	char hexrec[256],char2[3],char4[5];
	unsigned char ch,sum;
	unsigned int i,j,prerecordlen=0,recordlen;
	unsigned long preaddress=0,address;

	FILE *fptemp;


	if((fptemp=fopen("temp.bin","wb"))==NULL)
	{	printf("\n Sorry,can't open the temp file.");
		return(0);
	};

nextrecord:	
	i=0;
	ch=0;
	while((i<256)&&(!feof(fp))&&(ch!=0x0a))
	{ch=fgetc(fp);
	 hexrec[i++]=ch;
	};


	sum=0;
	j=0;
	if (hexrec[j++]!=':')
	{	printf("\n Sorry,can't find hex record head \':\'.");
		fclose(fptemp);
		return(0);
	};
	
	char2[0]=hexrec[j++];
	char2[1]=hexrec[j++];
	char2[2]='\0';
	
	recordlen=hval(char2);
	sum=sum+recordlen;
	
	
	char4[0]=hexrec[j++];
	char4[1]=hexrec[j++];
	char4[2]=hexrec[j++];
	char4[3]=hexrec[j++];
	char4[4]='\0';

	address=hval(char4);
	
	sum=(unsigned char)(sum+(address%0x100));	
	sum=(unsigned char)(sum+(address/0x100));
		
	
	for(i=preaddress+prerecordlen;i<address;i++)fputc(0xff,fptemp);

	char2[0]=hexrec[j++];
	char2[1]=hexrec[j++];
	char2[2]='\0';
	ch=(unsigned char)hval(char2);
	sum=sum+ch;
	
	if (ch==0x01)
	{	fclose(fptemp);
		return(1);
	};


	for(i=0;i<recordlen;i++)
	{	char2[0]=hexrec[j++];
		char2[1]=hexrec[j++];
		char2[2]='\0';
		ch=(unsigned char)hval(char2);
		sum=sum+ch;
		
		fputc(ch,fptemp);
	};
	
		char2[0]=hexrec[j++];
		char2[1]=hexrec[j++];
		char2[2]='\0';
		ch=(unsigned char)hval(char2);
		sum=sum+ch;
	if(!(sum==0))
	{	printf("\n Sorry,hex record sum wrong. \n");
		fclose(fptemp);
		return(0);
	};
	
	prerecordlen=recordlen;
	preaddress=address;
	
	goto nextrecord;	
	
		
}


int copybin(FILE *fp)
{
	unsigned char x;
	FILE *fptemp;
	

	if((fptemp=fopen("temp.bin","wb"))==NULL)return(0);

	
	while(!feof(fp))
	{
		x=fgetc(fp);
		fputc(x,fptemp);
	};
	
	fclose(fptemp);
	return(1);

}


int loadfile()
{
	static char inifile[]="set.ini";
	unsigned char x;
	int i,j;
	char *filename,*pstr,*pstr1,*ptype,string[256],temp[256],temp1[256],type[4];
	FILE *fp,*fpini;

	pstr=inifile;
	pstr1=temp1;
	filename=string;
	
	if((fpini=fopen(pstr,"r"))!=NULL)
	{
		fscanf(fpini,"%s",pstr1);
		fclose(fpini);
	}
	else
	{pstr1="";};
	
	
	for(j=0;j<=4;j++)
	{
	printf("\nInput filename to be load[%s]",pstr1);
	for (i=0;i<256;i++) temp[i]='\0';
	x=0;
	for (i=0;x!=0x0a;i++)
	{x=getchar();temp[i]=x;};
	temp[i--]='\0';	temp[i--]='\0';
	if (temp[0]!='\0') 
	{filename=temp;}
	else filename=pstr1;
	if((fp=fopen(filename,"rb"))==NULL)
	{printf("Can not open this file:%s\n",filename);}
	else {printf("\n\n");break;};
	if (j==2)return(0);
	};
	
	
	ptype=strchr(filename,'.');
	ptype++;
	type[0]=toupper(*ptype++);
	type[1]=toupper(*ptype++);
	type[2]=toupper(*ptype++);
	type[3]='\0';
	
	if (strcmp(type,"HEX")==0)
	{printf("Begin program hex file.%s\n\n",filename);
		if (!hextobin(fp)) 
		{	printf("\nConver Hex to Bin failt!!!");
			return(0);
		};
	} 
	else
	{printf("Begin program bin file.%s\n\n",filename);
		if(!copybin(fp))
		{	printf("\nCreate temp.bin failt!!!");
			return(0);
		};	
	};
	
	fclose(fp);
	
	pstr=inifile;
	if((fpini=fopen(pstr,"w"))!=NULL)
	{fprintf(fpini,"%s",filename);
	fclose(fpini);
	};
	return(1);			/*good return 1*/
}


void program()
{	
	int i,j;
	unsigned char x;
	FILE *fp;
	char *filename,temp[]="temp.bin";
	long start, end; 


	start = clock();
//	clrscr();
	printf("\n\r");
		
	if (!loadfile()) return;
	
	filename=temp;
	
	if((fp=fopen(filename,"rb"))==NULL)
	{printf("\nCannot open the temp file.\n");
	return;
	};
	

	start_program();
	enable_program();
	erase_chip();
	
	
	i=0;j=0;
	while(!feof(fp))
	{
		x=fgetc(fp);
		
		if(!write_code(x,i))
		{
			printf(" xxx");
			j++;
			if (j>=0x80) break;
		}
		else
		{
			printf("%4x",x);
		};
		i++;
	};
	fclose(fp);
	end = clock(); 
	
	if (j) {printf("\n\nSomeAdress program failed!!!\n");}
	else{printf("\n\nProgram OK!\n");};
	
	printf("\nTotal program %x bytes\n",i);
	printf("Programed failt %x bytes.\n",j);
	printf("Total spend time %d mS\n",end-start);
	

	end_program();
	
}
void readbin()
{
	int i;
	unsigned char x;
	FILE *fp;
	char *filename,temp[]="chip.bin";
	long start, end; 
	start = clock();
	
//	clrscr();
	printf("\n\r");
		
	filename=temp;
	
	if((fp=fopen(filename,"wb"))==NULL)
	{printf("\nCannot open the temp file.\n");
	return;
	};
	

	start_program();
	enable_program();
	
	
	i=0;
	for (i=0;i<0x3000;i++)
	{
		x=read_code(i);
		printf("%4x",x);
		fputc(x,fp);
	};

	fclose(fp);
	end = clock(); 
	
	
	printf("\nTotal read %x bytes.Have write to \"chip.bin\"\n",i);
	printf("Total spend time %d mS\n",end-start);
	

⌨️ 快捷键说明

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