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

📄 main1.pas

📁 PC Host used for controlling and command exchanging to the SPI flash memory controller which enables
💻 PAS
字号:
unit Main1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, CPDrv,
  ExtCtrls, Mask, Math;

type
  TForm1 = class(TForm)
    CommPortDriver1: TCommPortDriver;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Timer1: TTimer;
    Button2: TButton;
    Button3: TButton;
    Entrada: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    Label3: TLabel;
    Label6: TLabel;
    Button4: TButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Button5: TButton;
    Label7: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure CommPortDriver1ReceiveData(Sender: TObject; DataPtr: Pointer;
      DataSize: Cardinal);
    procedure Timer1Timer(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure EntradaChange(Sender: TObject);
    procedure EntradaKeyPress(Sender: TObject; var Key: Char);
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure CreateImgFile(BufSize:Integer);
    function OpenImgFile : boolean;
    procedure Button5Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  offset,loop,count,incount : integer;
  func_type: byte;
  TempChar:Pchar;
  InpFileSize,NumRead,pause:Cardinal;
  FileNameSave,FileNameOpen: String;
  ImageFileSave,ImageFileLoad: file;
  ImageBuffer,CompareBuffer : array[0..4*1024*1024] of byte;
  S_block_L , S_block_H : Byte;
  s: string;
  value: Array of String;
  Index: Integer;
  Next_Block,Page_Complete:boolean;
  NumBlocks:Integer;
//------------

implementation

{$R *.DFM}

const
  HexValues='0123456789ABCDEF';
function HexToInt(Hex: string): integer;
var
  i: integer;
begin
  Result := 0;
  case Length(Hex) of
    0: Result := 0;
    1..8: for i:=1 to Length(Hex) do
      Result := 16*Result + Pos(Upcase(Hex[i]), HexValues)-1;
    else for i:=1 to 8 do
      Result := 16*Result + Pos(Upcase(Hex[i]), HexValues)-1;
  end;
end;

function HexToInt64(Hex: string): int64;
var
  i: integer;
begin
  Result := 0;
  case Length(Hex) of
    0: Result := 0;
    1..16: for i:=1 to Length(Hex) do
      Result := 16*Result + Pos(Upcase(Hex[i]), HexValues)-1;
    else for i:=1 to 16 do
      Result := 16*Result + Pos(Upcase(Hex[i]), HexValues)-1;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var count : integer   ;
Inbuf : Pchar;
begin
CommPortDriver1.PollingDelay:=100;
func_type:=1;
Count:=0;
//incount:=1;
        try CommportDriver1.sendchar(#01);
        finally
        end;
 //       Timer1.Enabled:=True;
 label2.caption:='';
 label6.caption:='';
end;

procedure TForm1.Button2Click(Sender: TObject);
var count : integer   ;
begin
CommPortDriver1.PollingDelay:=100;
func_type:=2;
Count:=0;
//incount:=1;
        try CommportDriver1.sendchar(#02);
        finally
        end;
//        Timer1.Enabled:=True;
 label2.caption:='';
 label6.caption:='';
end;

procedure TForm1.Button3Click(Sender: TObject);
//var count : integer   ;
var
//S_block_L , S_block_H : Byte;
Readloop:Integer;
pause:cardinal;
//label read_block,wait;
begin
CommPortDriver1.PollingDelay:=100;
func_type:=3;
Count:=0;
offset:=0;
S_block_L:= HexToInt(Entrada.Text) and $00ff;
S_block_H:= swap(HexToInt(Entrada.Text) and $ff00);
Index:=Incount div 64;
Setlength(value,((64 * index)+1));
if SaveDialog1.Execute then
begin
        FilenameSave:=SaveDialog1.Filename;
        try
        begin
                while count < 3 do
                begin
                        case count of
                        0: CommportDriver1.sendbyte(6);
                        1: CommportDriver1.sendbyte(S_block_L);
                        2: CommportDriver1.sendbyte(S_block_H);
                        end;
                inc(count);
                end;
        end;
        finally;
        end;
CommportDriver1.sendbyte(3);
label2.caption:='';
label6.caption:='';
end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
    CommPortDriver1.Connect;
    func_type:=0;
    Entrada.Text:='0000';
    Incount:=64;
end;


procedure TForm1.CommPortDriver1ReceiveData(Sender: TObject;
  DataPtr: Pointer; DataSize: Cardinal);
  var
  idx:integer;
  a:Extended;
begin
        CommPortDriver1.PausePolling;
        s := StringOfChar( #0, DataSize );
        move( DataPtr^, pchar(s)^, DataSize );
        Label6.Caption:= FloattoStr(DataSize);
        CommPortDriver1.FlushBuffers(true,true);
        case func_type of
        1: begin
                Loop:=1;
                Setlength(value,DataSize);
                While   Loop  < Datasize + 1  do
                Begin
                        value[Loop-1]:=Copy(S,Loop,1);
                        StrPCopy(TempChar,value[Loop-1]);
                        Label2.Caption:=Label2.Caption+inttohex(ord(TempChar^),2);
                        inc(Loop);
                end;
           end;
        2: begin
                        Setlength(value,DataSize);
                        value[0]:=Copy(S,1,1);
                        StrPCopy(TempChar,value[0]);
                        Label2.Caption:=Label2.Caption+inttohex(ord(TempChar^),2);
           end;
        3: begin
                        loop:=0;
                        While   Loop  < Datasize   do
                        Begin
                                value[Loop + (64 * offset)]:=Copy(S,(Loop+1),1);
                                StrPCopy(TempChar,value[Loop + (64 * offset)]);
                                ImageBuffer[Loop + (64 * offset)]:= ord(TempChar^);
                                Label2.Caption:=inttohex(ord(TempChar^),2);
                                Label3.Caption:=inttostr(loop+ (64 * offset));
                                inc(Loop);
                        end;
                        inc(offset);
            end;
        4: begin
   //                     loop:=0;
                        value[0]:=Copy(S,1,1);
                       // CommportDriver1.sendbyte(5);
                        if value[0] = chr($10) then
                        begin
//                                while  loop < 64 do
//                                begin
                                        CommportDriver1.sendbyte(ImageBuffer[loop + (offset *64)]);
                                        Label2.Caption:=inttohex(ord(ImageBuffer[loop + (offset *64)]),2);
                                        inc(loop);
//                                end;
                               if loop = 64 then
                               begin
                                        inc(offset);
                                        Loop:=0;
                               end;
                        end;
                        if value[0] = chr($13) then
                                        begin
                                        page_Complete:=true;
                                        Loop:=0;
                                        end
                                        else
                                        page_Complete:=false;
                        S:=' ';
           end;
           5: begin
                        value[0]:=Copy(S,1,1);
                        StrPCopy(TempChar,value[0]);
                        Label2.Caption:=inttohex(ord(TempChar^),2);
                        //if value[0] = chr($20) then
                       // begin
                        // Label2.Caption:='feito';
                      // end;
           end;
        end;

   if ((func_type=3) and (offset < Index))
   then
      CommportDriver1.sendbyte(3)
   else
            case func_type of
            3: CreateImgFile(64 * index);
            end;
   if ((func_type=4) and (offset <  Numblocks )) then
        begin
                if page_complete then
                begin
                        Page_Complete:=false;
                        Label7.Caption:=IntToStr(offset div 4);
                        CommportDriver1.sendbyte(5);
                        CommportDriver1.sendbyte(4);
                   end
                else
                begin

//                        CommportDriver1.sendbyte(4);
                end;
        end;
           CommPortDriver1.ContinuePolling;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
{        inc(count);
        label3.caption:=inttostr(count);
        if count = 100 then
        begin
           Count:=0;
           label2.caption:='';
           Timer1.Enabled:=False;
        End;   }
{        if (func_type = 3) and  (offset < (incount div 64)) then
        begin
                CommportDriver1.sendbyte(3);
                inc(offset);
                Timer1.Enabled:=true;
        end
        else
       }
{        inc(count);
        if count < Incount then
           CommportDriver1.sendbyte(3)
        else
        begin
                 Timer1.Enabled:=false;
                 Next_Block:=true;
        end;}
end;


procedure TForm1.EntradaChange(Sender: TObject);
begin
       incount:=(64 * HexToInt(Entrada.Text)) + 64;
       Label5.caption:=inttostr(incount);
end;

procedure TForm1.EntradaKeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9','a'..'f','A'..'F',#8]) then
    Key := #0
end;

procedure TForm1.Button4Click(Sender: TObject);
var
Readloop:Integer;
pause:cardinal;
begin
CommPortDriver1.PollingDelay:=5;
func_type:=4;
Loop:=0;
Count:=0;
offset:=0;
page_complete:=false;
Index:=Incount div 64;
if OpenDialog1.Execute then
       begin
                FilenameOpen:=OpenDialog1.Filename;
                if (OpenImgFile) then
                begin
                        try
                        begin
                                while count < 3 do
                                begin
                                        case count of
                                        0: CommportDriver1.sendbyte(8);            // Avisa microcontolador que armazena tamanho
                                        1: CommportDriver1.sendbyte(S_block_L);    // do arquivo a ser gravado na Flash
                                        2: CommportDriver1.sendbyte(S_block_H);
                                        end;
                                        inc(count);
                                end;
                                CommportDriver1.sendbyte(7);                // Seta modo Page Program
                                CommportDriver1.sendbyte(5);
                                CommportDriver1.sendbyte(4);
                        end;
                        finally;
                        end;
                        label2.caption:='';
                        label6.caption:='';
                end;
       end;
end;

Procedure Tform1.CreateImgFile(BufSize:Integer);
begin
      AssignFile(ImageFileSave,FileNameSave);	{ Open output file }
      {$I-}
         Rewrite(ImageFileSave, 1);
      {$I+}
    if IOResult = 0 then
    begin
      BlockWrite(ImageFileSave, ImageBuffer, BufSize);
      CloseFile(ImageFileSave);
    End
    else
      MessageDlg('N鉶 pude gravar o arquivo !', mtWarning, [mbOk], 0);
end;

function TForm1.OpenImgFile : boolean;
var
      rslt: Boolean;
      L: Cardinal;
begin
      rslt:= False;
      AssignFile(ImageFileLoad,FileNameOpen);	{ Open output file }
      {I-}
      Reset(ImageFileLoad,1);
      {I+}
      if IOResult = 0 then
      begin
        InpFileSize:=FileSize(ImageFileLoad);
        Numblocks:= InpFileSize div 64;
        if InpFileSize mod 64 <> 0 then Numblocks := Numblocks + 1;
        S_block_L:= Numblocks and $00ff;
        S_block_H:= swap(Numblocks) and $ff00 ;
        Fillchar(ImageBuffer,4*1024*1024,$FF);
        BlockRead(ImageFileLoad, ImageBuffer,InpFileSize,NumRead);
        rslt:=true;
        CloseFile(ImageFileLoad);
      end
      else
      MessageDlg('N鉶 pude ler o arquivo !', mtWarning, [mbOk], 0);
      OpenImgFile:=Rslt;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   New(TempChar);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Dispose(TempChar);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
func_type:=5;
CommPortDriver1.PollingDelay:=100;
CommportDriver1.sendbyte($c);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -