|
#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期 |