#include <dos.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "..\ch\ctc.ci"
#define ROMSIZE 2048
// 378 : A7..A0
// 37A : P34 RST XLAT1 P32
// for programming: Rst=1, P33|P34=1, Vpp=12V
// Read: O37A 2A I378
// RESET: O37A 2E O37A 2A
// SKIP: O37A 28 O37A 2A
// WRITE: O37A 2 O378 data [DELAY] O37A 3 O37A 2A
void writeByte(char data, int addr)
{
outportb(0x37a, 0x2e); // reset address
outportb(0x37a, 0x2a);
ctcdelay(10);
for (int i=0; i<addr; i++)
{
outportb(0x37a, 0x28);
outportb(0x37a, 0x2a);
}
outportb(0x37a, 2);
outportb(0x378, data);
outportb(0x378, data);
outportb(0x37a, 3);
ctcdelay(2);
outportb(0x37a, 2);
ctcdelay(2);
for (int n=0; n<1000; n++) if ((inportb(0x379)&0x40)!=0) break;
outportb(0x37a, 0x2A);
}
void writeData(char *buf, int count)
{
outportb(0x37a, 0x2e); // reset address
outportb(0x37a, 0x2a);
ctcdelay(10);
for (int i=0; i<count; i++)
{
int dat=buf[i];
outportb(0x37a, 2);
outportb(0x378, dat);
outportb(0x378, dat);
outportb(0x37a, 3);
ctcdelay(2);
outportb(0x37a, 2);
ctcdelay(2);
for (int n=0; n<1000; n++) if ((inportb(0x379)&0x40)!=0) break;
outportb(0x37a, 0);
}
outportb(0x37a, 0x2A);
}
int readByte(int addr)
{
outportb(0x37a, 0x2e); // reset address
outportb(0x37a, 0x2a);
ctcdelay(10);
for (int i=0; i<addr; i++)
{
outportb(0x37a, 0x28);
outportb(0x37a, 0x2a);
}
ctcdelay(5);
return inportb(0x378);
}
void readData(char *buf, int count)
{
outportb(0x37a, 0x2e); // reset address
outportb(0x37a, 0x2a);
delay(10);
for (int i=0; i<count; i++)
{
ctcdelay(5);
buf[i]=inportb(0x378);
outportb(0x37a, 0x28);
outportb(0x37a, 0x2a);
}
}
void eraseData()
{
outportb(0x37a, 0x2a); ctcdelay(10);
outportb(0x37a, 0x2b); delay(15);
outportb(0x37a, 0x2a);
}
void hideData()
{
writeByte(0, 0);
}
void main(int argc, char *argv[])
{
unsigned char buf[ROMSIZE];
unsigned char buf2[ROMSIZE];
memset(buf, 255, ROMSIZE);
memset(buf2, 255, ROMSIZE);
unsigned t0, tt;
FILE *fp;
initctc();
if (argc<2)
{
puts("AT89C2051 Programming Tools V1.00, (c)Freeman Tse, Tipware Workgroup, 98-08-11.");
puts("Usage: P2051 Read|Write|Erase|Lock [file] { G|P|T [adr] [dat]}\n");
puts(" For Read/Write, hardware set P33=0, P35=P37=1");
puts(" For Erase/Lock2, hardware set P33=1, P35=P37=0");
puts(" For Lock1, hardware set P33=1, P35=P37=1");
}
if (argv[1][0]=='E') { eraseData(); return; }
if (argv[1][0]=='L') { hideData(); return; }
if (argv[1][0]=='R')
{
t0=getclk();
readData(buf, ROMSIZE);
tt=getclk();
printf("\nRD_Time=%i ms\n", (tt-t0)*256L/1193);
for (int k=0; k<127; k++)
printf("%02hX ", buf[k] );
printf("\n");
readData(buf2, ROMSIZE);
for (int i=0, err=0; i<ROMSIZE; i++) if (buf[i]!=buf2[i]) err=1;
if (err) printf("\nRead_error!\7");
else printf("\nRead_Ok!");
if (argc<=2) return;
fp=fopen(argv[2], "wb"); if (fp==NULL) return;
fwrite(buf, ROMSIZE, 1, fp);
fclose(fp);
}
if (argv[1][0]=='T')
{
int data=0xff;
sscanf(argv[2], "%02X", &data);
for (int i=0; i<ROMSIZE; i++) buf[i]=data;
writeData(buf, ROMSIZE);
}
if (argv[1][0]=='t')
{
int data=0xff;
sscanf(argv[2], "%02X", &data);
for (int i=0; i<ROMSIZE; i++) buf[i]=i;
writeData(buf, ROMSIZE);
}
if (argv[1][0]=='W')
{
if (argc<=2) return;
fp=fopen(argv[2], "rb"); if (fp==NULL) return;
fread(buf, ROMSIZE, 1, fp);
fclose(fp);
t0=getclk();
writeData(buf, ROMSIZE);
tt=getclk();
printf("\nWR_Time=%i ms\n", (tt-t0)*256L/1193);
readData(buf2, ROMSIZE);
for (int i=0, err=0; i<ROMSIZE; i++) if (buf[i]!=buf2[i]) err=1;
if (err) printf("\nWrite_error!\7");
else printf("\nWrite_Ok!");
}
if (argv[1][0]=='G')
{
int addr=0;
sscanf(argv[2], "%02X", &addr);
printf("\n[%04X]=%02X \n", addr, readByte(addr));
}
if (argv[1][0]=='P')
{
int addr=0;
int data=0xff;
sscanf(argv[2], "%02X", &addr);
sscanf(argv[3], "%02X", &data);
writeByte(data, addr);
}
}
/*
文章请见《电子报》2000年第27期