📄 ch11_at89cxx 刻录程序彻底公开.c
字号:
case 2:
p20_next_addr();
p20_next_addr();
c1=p20_read_byte(); /* c2 must be FFH */
break;
default:
c1=0xee;
break;
}
c1=c1 & 0xff;
return(c1);
}
int p20_reset_addr()
{
p20_rst_hi();
p20_rst_low();
p20_rst_hi();
}
int xtal1_pulse()
{
p20_xtal1_hi();
p20_xtal1_low();
p20_xtal1_hi();
}
int p20_next_addr()
{
p20_xtal1_hi();
p20_xtal1_low();
p20_xtal1_hi();
}
int p20_rst_hi() { write_XDATA(PPICTL2,0x00);
write_XDATA(PPICTL2,0x04); }
int p20_rst_low() { write_XDATA(PPICTL2,0x00);
write_XDATA(PPICTL2,0x05); }
int p20_rst_12v() { write_XDATA(PPICTL2,0x01);
write_XDATA(PPICTL2,0x04); }
int p20_prog_low() { write_XDATA(PPICTL2,0x02); }
int p20_prog_hi() { write_XDATA(PPICTL2,0x03); }
int p20_xtal1_low() { write_XDATA(PPICTL2,0x06); }
int p20_xtal1_hi() { write_XDATA(PPICTL2,0x07); }
int p20_p33_low() { write_XDATA(PPICTL2,0x08); }
int p20_p33_hi() { write_XDATA(PPICTL2,0x09); }
int p20_p34_low() { write_XDATA(PPICTL2,0x0a); }
int p20_p34_hi() { write_XDATA(PPICTL2,0x0b); }
int p20_p35_low() { write_XDATA(PPICTL2,0x0c); }
int p20_p35_hi() { write_XDATA(PPICTL2,0x0d); }
int p20_p37_low() { write_XDATA(PPICTL2,0x0e); }
int p20_p37_hi() { write_XDATA(PPICTL2,0x0f); }
int beep_on() { write_XDATA(PPICTL1,0x0f); }
int beep_off() { write_XDATA(PPICTL1,0x0e); }
int programming()
{
int result;
int p20_p37_low() { write_XDATA(PPICTIL2.0x0e); }
int p20_p37_hi() { write_XDATA(PPICTIL2.0x0f); }
int beep_on { write_XDATA(PPICTL1.0x0f); }
int beep_off { write_XDATA(PPICTL1.0x0e); }
int programming()
{
int result:
display_str(msg_pgm,1);
if (flash_type==AT2051 || flash_type==AT4051 || flash_type==AT1051)
{
p20_programming();
/* result=p20_verify(); */
}
if (flash_type==AT89C51 || flash_type==AT89C52 || flash_type==AT89S8252)
{
p40_programming();
/* result=p40_verify(); */
}
result=verify(0);
return(result);
}
int p20_programming()
{
int data;
int m;
p20_write_mode();
p20_reset_addr();
p20_rst_12v();
p20_prog_hi();
for (m=0;m<pgm_length;m++)
{
data=read_XDATA(BUFFER+m);
p20_write_byte(data);
p20_prog_low();
p20_prog_hi();
p20_next_addr();
if ((m & 0x3ff)==0) display_char('P'); /* 1 page programmed */
}
p20_rst_hi();
line_feed();
}
int p40_programming()
{
int data;
int m;
write_mode();
addr_out(0);
vpp_5v();
prog_hi();
vpp_12v();
for (m=0;m<pgm_length;m++)
{
data=read_XDATA(BUFFER+m);
addr_out(m);
/* if (data==0xff) continue; */
write_byte(data);
prog_low();
prog_hi();
/* delay_5ms(); delay 10 mS */
/* vpp_5v(); */
if ((m & 0x3ff)==0) display_char('P'); /* 1 page programmed */
}
vpp_5v();
line_feed();
}
int verify(int c)
{
int result;
display_str(msg_verify,1);
if (flash_type==AT2051 || flash_type==AT4051 || flash_type==AT1051)
result=p20_verify(c);
if (flash_type==AT89C51 || flash_type==AT89C52 || flash_type==AT89S8252)
result=p40_verify(c);
return(result);
}
int p20_verify(int mode)
{
int m,d_i,d_o;
int err=0;
p20_read_mode();
p20_reset_addr();
for (m=0;(m<pgm_length);m++)
{
d_i=p20_read_byte();
d_o=read_XDATA(BUFFER+m);
if (d_i != d_o) err=1;
p20_next_addr();
if ((m & 0x3ff)==0) display_char('V'); /* 1 page programmed */
if (err==1) break;
}
delay(10);
line_feed();
return(err);
}
int p40_verify(int mode)
{
int m,d_i,d_o;
int err=0;
read_code_mode();
if (flash_type==AT89S8252) vpp_12v();
for (m=0;m<pgm_length;m++)
{
addr_out(m);
d_i=read_byte();
d_o=read_XDATA(BUFFER+m);
if (d_i != d_o) err=1;
if ((m & 0x3ff)==0) display_char('V'); /* 1 page programmed */
if (err) break;
}
vpp_5v();
delay(10);
line_feed();
return(err);
}
int p20_write_mode()
{
init_8255(0x90,0x82);
/* p20_rst_12v(); */
p20_prog_hi();
p20_p33_low();
p20_p34_hi();
p20_p35_hi();
p20_p37_hi();
}
int write_mode()
{
init_8255(0x80,0x82);
rst_hi();
psen_low();
prog_hi();
vpp_5v();
p26_low();
p27_hi();
p36_hi();
p37_hi();
}
int chip_erase()
{
int result;
if (flash_type==AT2051 || flash_type==AT4051 || flash_type==AT1051)
{
p20_chip_erase();
result=p20_blank_check(32); /* check heading 32 bytes */
}
if (flash_type==AT89C51 || flash_type==AT89C52 || flash_type==AT89S8252)
{
p40_chip_erase();
result=p40_blank_check(32); /* check heading 32 bytes */
}
return(result);
}
int p20_chip_erase()
{
init_8255(0x90,0x82); /* 1st-PA,PB,PC output */
/* 2nd-PA out,PB & PC input */
p20_rst_12v();
p20_prog_hi();
p20_p33_hi();
p20_p34_low();
p20_p35_low();
p20_p37_low();
p20_prog_low();
delay_10ms(); /* delay 10 mS */
p20_prog_hi();
p20_rst_hi();
}
int p40_chip_erase()
{
init_8255(0x80,0x82); /* 1st-PA,PB,PC output */
/* 2nd-PA out,PB & PC input */
rst_hi();
psen_low();
prog_hi();
vpp_5v();
p26_hi();
p27_low();
p36_low();
p37_low();
if (vpp==5) vpp_5v();
else vpp_12v(); /* debug */
prog_hi();
prog_low();
delay_10ms(); /* delay 10 mS */
prog_hi();
vpp_5v();
}
int p20_lock_bit1()
{
init_8255(0x90,0x82);
p20_rst_12v();
p20_prog_hi();
p20_p33_hi(); p20_p34_hi(); p20_p35_hi(); p20_p37_hi();
p20_prog_low();
delay_10ms();
p20_prog_hi();
p20_rst_hi();
}
int p20_lock_bit2()
{
init_8255(0x90,0x82);
p20_rst_12v();
p20_prog_hi();
p20_p33_hi(); p20_p34_hi(); p20_p35_low(); p20_p37_low();
p20_prog_low();
delay_10ms();
p20_prog_hi();
p20_rst_hi();
}
int at89s8252_lock_bit(int bit)
{
init_8255(0x80,0x82);
vpp_5v();
rst_hi();
psen_low();
prog_hi();
p26_hi(); p27_low(); p36_hi(); p37_low();
vpp_12v();
switch (bit)
{
case 1: write_byte(0x7f); break;
case 2: write_byte(0xbf); break;
case 3: write_byte(0xdf); break;
}
prog_low();
delay_10ms();
prog_hi();
vpp_5v();
read_code_mode();
}
int p40_lock_bit1()
{
init_8255(0x80,0x82);
vpp_5v();
rst_hi();
psen_low();
prog_hi();
p26_hi(); p27_hi(); p36_hi(); p37_hi();
if (vpp==5) vpp_5v();
else vpp_12v();
prog_low();
delay_10ms();
prog_hi();
vpp_5v();
read_code_mode();
}
int p40_lock_bit2()
{
init_8255(0x80,0x82);
vpp_5v();
rst_hi();
psen_low();
prog_hi();
p26_hi(); p27_hi(); p36_low(); p37_low();
if (vpp==5) vpp_5v();
else vpp_12v();
prog_low();
delay_10ms();
prog_hi();
vpp_5v();
read_code_mode();
}
int p40_lock_bit3()
{
init_8255(0x80,0x82);
vpp_5v();
rst_hi();
psen_low();
prog_hi();
p26_hi(); p27_low(); p36_hi(); p37_low();
if (vpp==5) vpp_5v();
else vpp_12v();
prog_low();
delay_10ms();
prog_hi();
vpp_5v();
read_code_mode();
}
int init_8255(int c1,int c2)
{
write_XDATA(PPICTL1,c1);
write_XDATA(PPICTL2,c2);
}
int p20_write_byte(int d)
{
write_XDATA(PPIPB1,d);
}
int p20_read_byte()
{
int d;
d=read_XDATA(PPIPB1);
return(d);
}
int power_on_message()
{
line_feed();
beep_start();
display_str("Power on default type is [",0);
switch(flash_type)
{
case AT4051: display_str(msg_at89c4051,0); break;
case AT2051: display_str(msg_at89c2051,0); break;
case AT1051: display_str(msg_at89c1051,0); break;
case AT89C51: display_str(msg_at89c51 ,0); break;
case AT89C52: display_str(msg_at89c52 ,0); break;
case AT89S8252:
display_str(msg_at89s8252 ,0); break;
}
display_str("]",1);
display_str("If you want to change the FLASH AT89CXX type",1);
display_str("Please set the value at address 7FFFH of EPROM",1);
display_str("(7FFFH)=00H => AT89C2051,(7FFFH)=02H => AT89C4051",1);
display_str("(7FFFH)=01H => AT89C1051,(7FFFH)=03H => AT89C51",1);
display_str("(7FFFH)=04H => AT89C52 ,(7FFFH)=05H => AT89S8252",1);
display_str("(7FFFH)=06H => AT90S1200",1);
delay(500);
}
int display_prompt()
{
switch(flash_type)
{
case AT4051: display_str(msg_at89c4051,0); break;
case AT2051: display_str(msg_at89c2051,0); break;
case AT1051: display_str(msg_at89c1051,0); break;
case AT89C51: display_str(msg_at89c51,0); break;
case AT89C52: display_str(msg_at89c52,0); break;
case AT89S8252: display_str(msg_at89s8252,0); break;
case AT90S1200: display_str(msg_at90s1200,0); break;
}
display_str(" (",0);
display_addr_woh((unsigned int)checksum);
display_str(")>",0);
delay(20);
}
int echo_test_count()
{
line_feed();
display_str("***** Final PGM count=",0);
display_addr(test_count);
display_str(" *****",1);
}
int life_test()
{
int result;
beep_start();
switch(flash_type)
{
case AT90S1200: display_str(msg_at90s1200,0); break;
case AT4051: display_str(msg_at89c4051,0); break;
case AT2051: display_str(msg_at89c2051,0); break;
case AT1051: display_str(msg_at89c1051,0); break;
case AT89C51: display_str(msg_at89c51,0); break;
case AT89C52: display_str(msg_at89c52,0); break;
case AT89S8252: display_str(msg_at89s8252,0); break;
}
display_str("Lifetest start....(press any key to abort)",1);
while (1)
{
test_count++;
line_feed();
display_str("***** PGM count=",0);
display_addr(test_count);
display_str(" *****",0);
line_feed();
display_str(msg_erase,1);
if (flash_type!=AT90S1200)
{
chip_erase();
result=blank_check(32);
if (result==0) result=programming();
}
else
{
avr_erase();
avr_flash_programming();
result=avr_flash_verify();
}
if (result==0) beep_ok();
else beep_err();
if (result!=0)
{
show_fail_in_programming();
show_mail_box();
}
if (result!=0 || test_count>=5000) break;
if (SFB.RI==1) break;
} /* end of while */
echo_test_count();
}
int check_pgm_sw()
{
int d,ok;
int result;
ok=0;
d=(~read_XDATA(PPIPA1)) & 0x03;
if (d==0x02)
{ delay(50);
d=(~read_XDATA(PPIPA1)) & 0x03;
if (d==0x02) ok=1;
}
if (ok==1)
{
line_feed();
beep_start();
display_str(msg_erase,1);
p20_chip_erase();
result=p20_blank_check(32);
if (result==0) {
result=programming();
if (AUTOLOCK)
{
display_str("Lock bit1 + bit2 of AT89C4051/2051/1051",1);
display_str("Same as lockbit1 plus verify is disabled",1);
p20_lock_bit1();
p20_lock_bit2();
p20_show_signature(1);
}
}
if (result==0) display_str(msg_pass,1);
else display_str(msg_fail,1);
if (result==0) beep_ok();
else beep_err();
if (result!=0)
{
show_fail_in_programming();
show_mail_box();
}
display_prompt();
}
}
int check_read_and_verify_sw()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -