📄 main.pas
字号:
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls,OleCtrls,resumo;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
MC_Type: TButton;
MC_READ: TButton;
MC_BURN: TButton;
Panel1: TPanel;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
P_Port: TRadioGroup;
Panel2: TPanel;
Dev_ID: TLabel;
Device: TStaticText;
VPP: TStaticText;
VPP_ID: TLabel;
Manufacturer: TLabel;
MFC_ID: TStaticText;
Panel3: TPanel;
Status: TLabel;
LabelStatus: TStaticText;
MC_LockBits: TButton;
Splitter1: TSplitter;
Protection: TRadioGroup;
FlashGroup: TGroupBox;
P_1: TRadioButton;
P_2: TRadioButton;
EepromGroup: TGroupBox;
Burn_Compare: TCheckBox;
MC_ERASE: TButton;
E2P_Read: TButton;
E2P_Burn: TButton;
SaveDialog2: TSaveDialog;
OpenDialog2: TOpenDialog;
procedure FormActivate(Sender: TObject);
procedure P_2Click(Sender: TObject);
procedure P_1Click(Sender: TObject);
procedure GetGranularity;
procedure MCSignature;
procedure MCReset(Apointer:pointer );
procedure SetAdfunc(Apointer:pointer;func:byte;Addr:word);
procedure EnableAddress(Apointer:pointer );
procedure EnableVpp(Apointer:pointer);
function getdata:word;
procedure delay(dly:integer);
Procedure Pulse(Apointer:pointer;Pls_Dly : Word);
Procedure MCRead(Apointer:pointer;Size:word;Compare:byte);
Procedure EEPRead(Apointer:pointer;Size:word;Compare:byte);
procedure MC_TypeClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure MC_ERASEClick(Sender: TObject);
procedure MC_READClick(Sender: TObject);
procedure CreateImgFile(BufSize:Integer);
function OpenImgFile(FileSize:Integer) : boolean;
procedure ResetBuffer;
procedure EnableData(Apointer:Pointer);
procedure Setdata(Data : Word);
procedure SysTimerTimer(Sender: TObject);
procedure MC_BURNClick(Sender: TObject);
procedure MCProgram(Apointer:pointer;count:word);
procedure EEPromProgram(Apointer:pointer;count:word);
procedure LockBits(Apointer:Pointer;LBit:Byte);
function NotBlank(Apointer:Pointer):boolean;
procedure HighResTimer;
procedure FastDelay(Fdly:Integer);
procedure MC_LockBitsClick(Sender: TObject);
function MCtype : boolean;
procedure MCErase;
procedure NOLOCKClick(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton3Click(Sender: TObject);
procedure RadioButton4Click(Sender: TObject);
procedure ProtectionClick(Sender: TObject);
procedure SendSerial(Func_Byte:Byte);
function ReceiveSerial:Byte;
function MCProg_Enable:boolean;
procedure E2P_ReadClick(Sender: TObject);
procedure E2P_BurnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
{
short _stdcall Inp32(short PortAddress);
void _stdcall Out32(short PortAddress, short data);
}
function Inp32(PortAddress : Word): Word; stdcall;external 'inpout32.DLL';
procedure Out32(PortAddress : Word ; data : Word);stdcall;external 'inpout32.DLL';
var
PData,PCtrl,PStatus : Word;
Form1: TForm1;
Port:Word;
MCID : Array[0..2] of BYTE ;
WaitTime:Cardinal;
Cptr:^Byte;
FileNameSave,FileNameOpen: String;
ImageFileSave,ImageFileLoad: file;
ImageBuffer,CompareBuffer : array[0..8191] of byte;
TimerEnd : Boolean;
SysDelay : Word;
Frequency,FastCounter : ^Int64;
ChipSize,EepromSize,NumRead:Integer;
Lock:Byte;
Data_Bit_Out,Prog_Enable: Byte;
Data:Word;
// Rslt:Boolean;
{
Pin No Signal Direction Register bit Inverted
(DB25) name
-----------------------------------------------------------------------
1 nStrobe Out Control-0 Yes
2 Data0 In/Out Data-0 No
3 Data1 In/Out Data-1 No
4 Data2 In/Out Data-2 No
5 Data3 In/Out Data-3 No
6 Data4 In/Out Data-4 No
7 Data5 In/Out Data-5 No
8 Data6 In/Out Data-6 No
9 Data7 In/Out Data-7 No
10 nAck In Status-6 No
11 Busy In Status-7 Yes
12 Paper-Out In Status-5 No
13 Select In Status-4 No
14 Linefeed Out Control-1 Yes
15 nError In Status-3 No
16 nInitialize Out Control-2 No
17 nSelect-Printer Out Control-3 Yes
18-25 Ground - - -
}
const
POWER_UP = $0;
ACTIVATE_IO = $1;
AT90S2313_SET_RST = $4;
AT90S2313_CLR_RST = $0;
PROG_ENABLE_AT90S2313 = $AC;
SELECT_VPP = $2;
WRITE_DATA = $6;
READ_DATA = $4;
WRITE_LOCK_1 = $7;
WRITE_LOCK_2 = $0b;
WRITE_LOCK_3 = $0d;
CHIP_ERASE = $9;
READ_SIGNATURE = $8;
READ_AT90S2313_SIGNATURE= $30;
READ_DATA_AT90S2313 = $20;
READ_E2PDATA_AT90S2313 = $A0;
WRITE_E2PDATA_AT90S2313 = $C0;
CHIP_ERASE_AT90S2313 = $53;
WRITE_DATA_AT90S2313 = $40;
implementation
{$R *.DFM}
procedure TForm1.FormActivate(Sender: TObject);
begin
MC_BURN.Enabled:= False;
MC_ERASE.Enabled:=False;
MC_READ.Enabled:=False;
E2P_Read.Enabled:=False;
E2P_Burn.Enabled:=False;
// MC_LockBits.Enabled:=False;
New(Cptr);
Cptr^:=0;
P_1Click(Nil);
// Timer1.Calibrate(100);
// SysTimer.Enabled:=True;
// TimerEnd:=True;
// Rslt:=QueryPerformanceFrequency(Frequency^);
// Dispose(Frequency);
New(Frequency);
New(FastCounter);
HighResTimer; // Get System frequency for acurate timing calculations
Lock:=0;
Protection.Itemindex:=0;
PData:=$378;
Out32(PData+2, $1 ); // clear data
Prog_enable := $00;
end;
procedure TForm1.P_2Click(Sender: TObject);
begin
PData:=$3bc;
PStatus:=PData+1;
PCtrl:=PData+2;
end;
procedure TForm1.P_1Click(Sender: TObject);
begin
PData:=$378;
PStatus:=PData+1;
PCtrl:=PData+2;
end;
procedure TForm1.GetGranularity;
Begin
// Timer1.Enabled:=true;
// Timer1.StartTimeMeasure;
// Timer1.Wait(1);
// Timer1.StopTimeMeasure;
// Timer1.Enabled:=false;
End;
procedure Tform1.delay(dly:integer);
var
SYST1 : Word;
begin
SYST1 := SysDelay;
while not ((Sysdelay - Syst1) < dly) do
begin
dly:=dly+1;
dly:=dly-1;
end;
end;
procedure TForm1.MC_TypeClick(Sender: TObject);
begin
MCReset( cptr );
if MCProg_Enable then
MCtype
else
MessageDlg('Programador desligado ou Microcontrolador n鉶 responde.'+#13#10+
'Verifique o sitema !!!',mtinformation,[mbOk], 0);
end;
function TForm1.MCType : boolean;
begin
MCSignature;
Case MCID[0] of
$1e: MFC_ID.Caption:= 'Atmel';
else
MFC_ID.Caption:= 'Desconhecido';
end;
Case MCID[1] of
$51: begin
Dev_id.Caption:= 'AT89C51';
ChipSize:=4096;
//SetLength(ImageBuffer,ChipSize);
end;
$52: begin
Dev_id.Caption:= 'AT89C52';
ChipSize:=8192;
//SetLength(ImageBuffer,ChipSize);
end;
$91:
begin
Dev_id.Caption:= 'AT90S2313';
ChipSize:=2048;
EepromSize:=128;
//SetLength(ImageBuffer,ChipSize);
end;
else
Dev_ID.Caption:= 'Desconhecido';
end;
Case MCID[2] of
$0FF: VPP_id.Caption:= '12 Volts';
$5: VPP_id.Caption:= '5 Volts';
$1: VPP_id.Caption:= '5 Volts';
else
VPP_ID.Caption:= 'Desconhecido';
end;
if ((MFC_ID.Caption = 'Desconhecido') or (Dev_ID.Caption= 'Desconhecido') or (VPP_ID. Caption= 'Desconhecido')) then
begin
MessageDlg('Microcontrolador desconhecido ou programador desligado.'+#13#10+
'Verifique o sitema !!!',mtinformation,[mbOk], 0);
MC_BURN.Enabled:=False;
MC_ERASE.Enabled:=False;
MC_READ.Enabled:=False;
Protection.Enabled:=False;
Burn_Compare.Enabled:=False;
E2P_BURN.Enabled:=False;
E2P_READ.Enabled:=False;
MCtype:=False;
end
else
begin
MC_BURN.Enabled:= True;
MC_ERASE.Enabled:=True;
MC_READ.Enabled:=True;
Protection.Enabled:=True;
Burn_Compare.Enabled:=True;
E2P_BURN.Enabled:=True;
E2P_READ.Enabled:=True;
MCtype:=True;
end;
end;
procedure Tform1.MCSignature;
begin
MCReset( cptr );
if MCProg_Enable then
SetAdfunc( cptr, READ_AT90S2313_SIGNATURE, $0 );
MCReset( cptr );
if MCProg_Enable then
// MCID[0]:=ReceiveSerial; // read first byte
SetAdfunc( cptr, READ_AT90S2313_SIGNATURE, $1);
// MCID[1]:=ReceiveSerial; // read second byte
MCReset( cptr );
if MCProg_Enable then
SetAdfunc( cptr, READ_AT90S2313_SIGNATURE, $2);
// MCID[2]:=ReceiveSerial; // read third byte
end;
procedure Tform1.MCReset(Apointer : pointer);
begin
Out32( PData, POWER_UP ); // Set up reset conditions
Out32( PCtrl, ACTIVATE_IO); // Activate Buffer
Out32( PData, AT90S2313_SET_RST ); // Set RST_PIN
FastDelay(20000);
Out32( PData, AT90S2313_CLR_RST ); // Clear RST_PIN
Cptr^:=0;
end;
Procedure Tform1.SetAdfunc(Apointer:pointer;func:byte;Addr:word);
var
MSG_BYTE :Byte;
begin
Case Func of
READ_AT90S2313_SIGNATURE :
Begin
SendSerial(READ_AT90S2313_SIGNATURE);
SendSerial(READ_AT90S2313_SIGNATURE);
SendSerial(READ_AT90S2313_SIGNATURE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -