📄 at89c2051 刻录程序.c
字号:
{
data=p20_read_byte();
write_XDATA(BUFFER+m,data);
sum+=data;
next_addr();
if (m%1024==0) display_char_no_wait('R'); /* 1 page programmed */
}
line_feed();
return(sum);
}
int p40_chip_read()
{
int m;
int data,sum;
sum=0;
read_code_mode();
for (m=0;m<pgm_length;m++)
{
addr_out(m);
data=read_byte();
write_XDATA(BUFFER+m,data);
sum+=data;
if (m%1024==0) display_char_no_wait('R'); /* 1 page programmed */
}
line_feed();
return(sum);
}
int p20_read_code_mode()
{
init_8255(0x92,0x82);
p20_rst_hi();
p20_prog_hi();
p20_p33_low();
p20_p34_low();
p20_p35_hi();
p20_p37_hi();
}
int p20_read_signature(int addr)
{
int c1;
init_8255(0x92,0x82);
p20_rst_hi();
p20_prog_hi();
p20_p33_low();
p20_p34_low();
p20_p35_low();
p20_p37_low();
reset_addr();
switch(addr)
{
case 0:
c1=p20_read_byte(); /* c1 must be 1EH */
break;
case 1:
next_addr();
c1=p20_read_byte(); /* c2 must be 21H */
break;
case 2:
next_addr();
next_addr();
c1=p20_read_byte(); /* c2 must be FFH */
break;
default:
c1=0xee;
break;
}
c1=c1 & 0xff;
return(c1);
}
int reset_addr()
{
p20_rst_hi();
p20_rst_low();
p20_rst_hi();
}
int 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;
display_str(msg_pgm,1);
if (flash_type==AT2051 || flash_type==AT1051)
{
p20_programming();
/* result=p20_verify(); */
}
if (flash_type==AT89C51 || flash_type==AT89C52)
{
p40_programming();
/* result=p40_verify(); */
}
result=verify(0);
return(result);
}
int p20_programming()
{
int data;
int m;
p20_write_mode();
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();
next_addr();
if (m%1024==0) display_char_no_wait('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();
for (m=0;m<pgm_length;m++)
{
if (vpp==5) vpp_5v();
else vpp_12v();
addr_out(m);
data=read_XDATA(BUFFER+m);
/* if (data==0xff) continue; */
write_byte(data);
prog_low();
prog_hi();
/* delay_5ms(); delay 10 mS */
vpp_5v();
if (m%1024==0) display_char_no_wait('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==AT1051) result=p20_verify(c);
if (flash_type==AT89C51 || flash_type==AT89C52) result=p40_verify(c);
return(result);
}
int p20_verify(int mode)
{
int m,d_i,d_o;
int err=0;
int sum=0;
p20_read_code_mode();
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;
sum+=d_i;
next_addr();
if (m%1024==0) display_char_no_wait('V'); /* 1 page programmed */
if (mode==0 && err==1) break;
}
delay(10);
line_feed();
if (mode==1)
{
display_str("Readback Checksum = ",0);
display_addr((unsigned int)sum);
line_feed();
}
return(err);
}
int p40_verify(int mode)
{
int m,d_i,d_o;
int err=0;
int sum=0;
read_code_mode();
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;
sum+=d_i;
if (m%1024==0) display_char_no_wait('V'); /* 1 page programmed */
if (mode==0 && err==1) break;
}
delay(10);
line_feed();
if (mode==1)
{
display_str("Readback Checksum = ",0);
display_addr((unsigned int)sum);
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==AT1051)
{
p20_chip_erase();
result=p20_blank_check(32); /* check heading 32 bytes */
}
if (flash_type==AT89C51 || flash_type==AT89C52)
{
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 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 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;
}
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 => AT89C51",1);
display_str("(7FFFH)=01H => AT89C1051,(7FFFH)=03H => AT89C52",1);
delay(500);
}
int display_prompt()
{
switch(flash_type)
{
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;
}
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 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;
}
display_str(" lifetest start....",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);
chip_erase();
result=blank_check(32);
if (result==0) result=programming();
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 AT89C2051/AT89C1051",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)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -