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

📄 main.c

📁 /*双龙ISP板*/ //#define SOME_CHIP /*只支持少数几种芯片*/只支持生产所用的芯片
💻 C
字号:
#include <REG2051.H>
#include <intrins.H>

#define SL_BOARD  /*双龙ISP板*/
//#define SOME_CHIP /*只支持少数几种芯片*/

#ifndef SL_BOARD
	sbit LED_RED1  = P3^3;
	sbit LED_RED2  = P3^4;
	sbit LED_GREEN = P3^5;

	sbit MOSI  = P1^6;
	sbit MISO  = P1^5;
	sbit SCK   = P1^7;
	sbit RESET = P1^4;
#else
	sbit LED_RED1  = P3^2;
	sbit LED_RED2  = P3^4;
	sbit LED_GREEN = P3^5;

	sbit MOSI  = P1^2;
	sbit MISO  = P1^3;
	sbit SCK   = P1^4;
	sbit RESET = P3^3;
#endif

#ifdef SOME_CHIP  /*  只支持生产所用的芯片,避免太多的芯片选择导至出错!!!  */
	code DeviceType[][2]=
	{
	//AT90S8515
		0x38,0,
	//ATmega8515
		0x3A,'P',
	//ATmega8515 BOOT
		0x3B,'P',
	//ATmega8
		0x76,'P',
	//ATmega8 BOOT
		0x77,'P',
	};
#else 	
	code DeviceType[][2]=
	{
	//AT90S1200 rev. A
		0x10,0,
	//AT90S1200 rev. B	
		0x11,0,
	//AT90S1200 rev. C
		0x12,0,
	//AT90S1200
		0x13,0,
	//AT90S2313
		0x20,0,
	//AT90S4414
		0x28,0,
	//AT90S4433
		0x30,0,
	//AT90S2333
		0x34,0,
	//AT90S8515
		0x38,0,
	//ATmega8515
		0x3A,'P',
	//ATmega8515 BOOT
		0x3B,'P',
	//ATmega103
		0x41,'P',
	//ATmega603
		0x42,'P',
	//ATmega128
		0x43,'P',
	//ATmega128 BOOT
		0x44,'P',
	//AT90S2323
		0x48,0,
	//AT90S2343
		0x4C,0,
	//ATtiny11
		0x50,0,
	//ATtiny10
		0x51,0,
	//ATtiny12
		0x55,0,
	//ATtiny15
		0x56,0,
	//ATtiny19
		0x58,0,
	//ATtiny28
		0x5C,0,
	//ATtiny26
		0x5E,'P',
	//ATmega161
		0x60,'P',
	//ATmega161 BOOT
		0x61,'P',
	//ATmega163
		0x64,'P',
	//ATmega83
		0x65,'P',
	//ATmega163 BOOT
		0x66,'P',
	//ATmega83 BOOT
		0x67,'P',
	//AT90S8535
		0x68,0,
	//ATmega8535??
		0x6A,'P',
	//ATmega8535 BOOT??
		0x6B,'P',
	//AT90S4434
		0x6C,0,
	//AT90C8534
		0x70,0,
	//AT90C8544
		0x71,0,
	//ATmega32
		0x72,'P',
	//ATmega32 BOOT
		0x73,'P',
	//ATmega16
		0x74,'P',
	//ATmega16 BOOT
		0x75,'P',
	//ATmega8
		0x76,'P',
	//ATmega8 BOOT
		0x77,'P',
	//AT89C1051
	//	0x80,0
	//AT89C2051
	//	0x81,0
	//AT89S8252
		0x86,0,
	//AT89S53
		0x87,0
	};
#endif

#define	SW_MAJOR '3'		/*Major SW revision number*/
#define	SW_MINOR '0'		/*Minor SW revision number*/
#define	HW_MAJOR '1'		/*Major HW revision number*/
#define	HW_MINOR '0'		/*Minor HW revision number*/

unsigned char loop,device,pgm_mode;
unsigned char Addr_H,Addr_L ;
unsigned char command;


void Delay(unsigned int time)
{
	while(time) time--;
}

void pulse_sck(void)
{
	SCK = 1;
	_nop_();
	_nop_();
	_nop_();
	SCK = 0;
}

void IncAddrAuto()
{
	Addr_L++;

	if(Addr_L == 0 )
		Addr_H++;
}

void init_serial(void)
{
     SCON = 0X50;/*Timer 1 is being used to generate baud rates.*/
     PCON = 0X80 | PCON;
     TMOD = 0X20;
     TH1 = 0XFD;
     TR1 = 1;            /*TCON.6*/
//   ES = 1;            /*IE.4      */
     RI = 0;              /*SCON.0*/
}

unsigned char getc()
{
	unsigned char buff;

	while(RI == 0);
	buff = SBUF;
	RI = 0;
	return buff;
}

void putc(unsigned char ch)
{
	SBUF = ch ;
	_nop_();
	_nop_();
	while( TI==0 );
	TI =0;
}

void showID()
{
	code char ID[]={"AVR ISP"};

	for(loop=0;loop<sizeof(ID)-1;loop++) //ID-1是不要发串末的0
		putc ( ID[loop] );
}

void show_device(void)
{
	for(	loop=0;
			loop< sizeof(DeviceType)/sizeof(DeviceType[0]);
			loop++		)
		putc ( DeviceType[loop][0] );
}

unsigned char check_device(unsigned char device)
{
	for(	loop=0;
			loop< sizeof(DeviceType)/sizeof(DeviceType[0]);
			loop++		)
	{
		if(device == DeviceType[loop][0] )
			return DeviceType[loop][1];
	}
	return '?';
}

unsigned char wrser(unsigned char dat)
{
	unsigned char indat = 0;
	for(loop = 0;loop<8;loop++)
	{
		if( dat & 0x80 )
			MOSI = 1;
		else
			MOSI = 0;

		dat <<=1;

		indat <<= 1;

		if(MISO)
			indat |= 1;

		pulse_sck();
	}

	return indat;
}

void spiinit()
{
	unsigned char count;

	SCK = 0;
	RESET = 1;
	Delay(10);
	RESET = 0;
	Delay(10);

	wrser(0xac);		// SPI write (byte 1)
	wrser(0x53);		// SPI write (byte 2)
	if ( (device >= 0x20) && (device <= 0x7F) )
	{
		count = 32;
		do {
			if (wrser(0) == 0x53)	// SPI read (byte 3)
				break;
			wrser(0x00);		// SPI write (byte 4)
			pulse_sck();
			wrser(0xac);		// SPI write (byte 1)
			wrser(0x53);		// SPI write (byte 2)

		} while(--count);
	}else wrser(0x00);		// SPI write (byte 3)

	wrser(0x00);	// SPI write (byte 4)
	Delay(100);
}

void writeFLASHdelay(void)
{ //根据芯片类型,决定是否延时
	if(pgm_mode == 0)
	{
#ifndef SL_BOARD
		Delay(100);
#else 
		Delay(250);
#endif
	}
}

unsigned char w17call(unsigned char param1)
{
	wrser(0x30);
	wrser(0x00);
	wrser(param1);
	return wrser(0);
}


unsigned char device;
unsigned char LedData;

void main(void)
{
	LED_GREEN = 0;
	Delay(60254);
	LED_GREEN = 1;
	init_serial( );
	while(1)
	{
		_nop_();
		switch(getc())
		{
		case 0x1b:
			LED_GREEN = 0;
			break;

		case 'T':
			device = getc();
			putc(0x0d);
			break;

		case 'S':
			showID();
			break;

		case 'V':
			putc(SW_MAJOR);
			putc(SW_MINOR);
			break;

		case 'v':
			putc(HW_MAJOR);
			putc(HW_MINOR);
			break;

		case 't':
			show_device();//Show supported devices
			break;

		case 'p':
			putc('S');
			break;

		case 'a':
			putc('Y');
			break;

		case 'x':
			LedData = getc();
			if(LedData == 1)
				LED_GREEN = 0 ;
			else 
				LED_GREEN = 1 ;
			putc(0x0d);
			break;
		
		case 'y':
			LedData = getc();
			if(LedData == 1)
				LED_RED2 = 0 ;
			else 
				LED_RED2 = 1 ;
			putc(0x0d);
			break;

		case 'P':
			spiinit();
			LED_RED1 = 0;
			pgm_mode = check_device(device);
			if ( pgm_mode != '?' )
				putc(0x0d);
			else 
				putc('?');
			break;

		case 'C':	//Write program memory, high byte
			wrser(0x48);
			wrser(Addr_H);
			wrser(Addr_L);
			wrser(getc());

			IncAddrAuto();

			writeFLASHdelay();
			putc(0x0d);
			break;

		case 'c':	//Write program memory, low byte
			wrser(0x40);
			wrser(Addr_H);
			wrser(Addr_L);
			wrser(getc());

			writeFLASHdelay();
			putc(0x0d);
			break;

		case 'R'://Read program memory
			wrser(0x28);
			wrser(Addr_H);
			wrser(Addr_L);
			putc( wrser ( 0 ) );

			wrser(0x20);
			wrser(Addr_H);
			wrser(Addr_L);
			putc( wrser( 0 ) );

			IncAddrAuto();
			break;

		case 'A':
			Addr_H = getc();
			Addr_L = getc();
			putc( 0x0d );
			break;

		case 'D':		//Write data memory
			wrser(0xC0);
			wrser(Addr_H);
			wrser(Addr_L);
			wrser(getc() );
			Delay(250);
			IncAddrAuto();
			putc(0x0d);
			break;

		case 'd':	//Read data memory
			wrser(0xA0);
			wrser(Addr_H);
			wrser(Addr_L);
			putc( wrser( 0 ) );
			IncAddrAuto();
			break;

		case 'L':		//Leave programming mode

			MOSI = 1;
			MISO = 1;
			SCK  = 1;
			LED_RED1 = 1;
			putc(0x0d);
			RESET = 1;
			break;

		case 'e':		//Chip erase
			wrser(0xAC);
			wrser(0x80);
			wrser(0x04);
			wrser(0x00);
			Delay(10);
			putc(0x0d);

			break;

		case 'l':		//Write lock bits
			wrser(0xAC);
			wrser( (getc() & 0x6) | 0xe0 );
			wrser(0x00);
			wrser(0x00);
			Delay(10);
			putc(0x0d);
			break;

		case 's':		//Read signature bytes
			putc (w17call(2) );
			putc (w17call(1) );
			putc (w17call(0) );
			break;

		case 'm':		//Write Program Memory Page
			wrser(0x4c);
			wrser(Addr_H);
			wrser(Addr_L);
			wrser(0);

			Delay(10);
			putc(0x0d);
			break;

		case ':':		//Universal Command
			wrser(getc());
			wrser(getc());
			wrser(getc());
			putc( wrser(0));
			Delay(10);
			putc(0x0d);
			break;

		case '.':		//New Universal Command
			wrser( getc() );
			wrser( getc() );
			wrser( getc() );
			putc(wrser ( getc() ) );
			Delay( 10 );
			putc( 0x0d );
			break;

		default:
			putc('?');
		}
	}	
}

⌨️ 快捷键说明

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