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