⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 Host software written in Delphi-pascal for programming, reading and erasing of Atmel s AT90S23X fami
💻 PAS
📖 第 1 页 / 共 3 页
字号:
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 + -