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

📄 uautocode.pas

📁 这个程序的主要目的是为了提供一个具有通用性的 AVR Bootloader
💻 PAS
📖 第 1 页 / 共 3 页
字号:
        cbbErr.Color := clWindow;
    end
    else
    begin
      if edtErr <> nil then
        edtErr.Color := clRed;
      if cbbErr <> nil then
        cbbErr.Color := clRed;
    end;
    tmrErr.Tag := tmrErr.Tag - 1;
  end
  else
  begin
    if edtErr <> nil then
    begin
      edtErr.Color := clWindow;
      edtErr := nil;
    end;
    if cbbErr <> nil then
    begin
      cbbErr.Color := clWindow;
      cbbErr := nil;
    end;
    tmrErr.Enabled := False;
  end;
end;

procedure TfrmAutoCode.setcbbErr(cbb: TComboBox);
begin
  cbbErr := cbb;
  tmrErr.Tag := 6;
  tmrErr.Enabled := True;
end;

procedure TfrmAutoCode.setedtErr(edt: TEdit);
begin
  edtErr := edt;
  tmrErr.Tag := 6;
  tmrErr.Enabled := True;
end;

procedure TfrmAutoCode.FormShow(Sender: TObject);
var
  buf: CBuf;
  i: Integer;
begin
  Idle := True;
  edtErr := nil;
  cbbErr := nil;

  //cbbMCU.Sorted := True;
  case cfg.FlashSize of
    0, 1: cbbMCU.Text := '';
    2: cbbMCU.Text := 'ATmega88';
    3: cbbMCU.Text := 'ATmega168';
    4: cbbMCU.Text := 'ATmega32';
    5: cbbMCU.Text := 'ATmega64';
    6: cbbMCU.Text := 'ATmega128';
    7: cbbMCU.Text := 'ATmega2560';
  end;

  cbbCportBaudRate.Refresh;
  cbbBaudRate.Items := cbbCportBaudRate.Items;
  cbbBaudRate.ItemIndex := Ord(frmMain.ComPort.BaudRate);
  if cbbBaudRate.ItemIndex = -1 then
    cbbBaudRate.ItemIndex := 9;

  cbbComPortNo.ItemIndex := 0;
  cbbBufferSize.Text := IntToStr(cfg.FrameLen);

  cbbCRC.ItemIndex := cfg.Protocol;
  if cbbCRC.ItemIndex = -1 then
    cbbCRC.ItemIndex := 0;

  cbbBootLevel.ItemIndex := 0;
  cbbBootMode.ItemIndex := 0;

  cbbPINRS485.ItemIndex := 5;
  cbbPINLED.ItemIndex := 6;
  cbbPINLevel.ItemIndex := 7;

  cbbBufferSize.Text := IntToStr(cfg.FrameLen);
  cbbTimeClk.Text := IntToStr(cfg.SendTime);
  cbbBootCnt.Text := IntToStr(cfg.BootCnt);

  if FlashSize[cfg.FlashSize] > 4096 then
    cbbBootStart.Text := '0x' + IntToHex((FlashSize[cfg.FlashSize] - 2048) div 2, 4);
  cbbByteWord.Tag := 1;
  cbbByteWord.ItemIndex := 1;
  cbbByteWordChange(Sender);
  cbbMCUChange(Sender);

  edtKeyHEX.Text := FormatHexStr(cfg.keyHEX, buf);

  Font.Name := cfg.FontName;
  Font.Size := cfg.FontSize;

  chkLED.Checked := True;
  chkLEDClick(Sender);

  if cbbAlgorithm.ItemIndex = -1 then
    cbbAlgorithm.ItemIndex := 0;

  for i := 0 to ComponentCount - 1 do
    if Components[i] is TComboBox then
    begin
      TComboBox(Components[i]).SelLength := 0;
    end;
end;

procedure TfrmAutoCode.cbbByteWordChange(Sender: TObject);
var
  s: string;
  i: Integer;
  t: Integer;
begin
  if cbbByteWord.ItemIndex <> cbbByteWord.Tag then
  begin
    s := cbbBootStart.Text;
    for i := 0 to cbbBootStart.Items.Count - 1 do
    begin
      t := StrToInt(cbbBootStart.Items.Strings[i]);
      if cbbByteWord.ItemIndex = 0 then
        t := t * 2
      else
        t := t div 2;
      cbbBootStart.Items.Strings[i] := '0x' + IntToHex(t, 4);
    end;
    cbbByteWord.Tag := cbbByteWord.ItemIndex;
    try
      t := StrToInt(s);
      if cbbByteWord.ItemIndex = 0 then
        t := t * 2
      else
        t := t div 2;
      cbbBootStart.Text := '0x' + IntToHex(t, 4);
    except

    end;
  end;
end;

procedure TfrmAutoCode.cbbMCUChange(Sender: TObject);
begin
  case getAVRType of
    1:
      begin
        if cbbByteWord.ItemIndex = 0 then
        begin
          cbbBootStart.Items.Text := '0x1800' + #13#10 + '0x1C00' + #13#10 + '0x1E00' + #13#10 + '0x1F00';
        end
        else
        begin
          cbbBootStart.Items.Text := '0x0C00' + #13#10 + '0x0E00' + #13#10 + '0x0F00' + #13#10 + '0x0F80';
        end;
      end;
    2:
      begin
        if cbbByteWord.ItemIndex = 0 then
        begin
          cbbBootStart.Items.Text := '0x3800' + #13#10 + '0x3C00' + #13#10 + '0x3E00' + #13#10 + '0x3F00';
        end
        else
        begin
          cbbBootStart.Items.Text := '0x1C00' + #13#10 + '0x1E00' + #13#10 + '0x1F00' + #13#10 + '0x1F80';
        end;
      end;
    3:
      begin
        if cbbByteWord.ItemIndex = 0 then
        begin
          if CompareText(cbbMCU.Text, 'AT90CAN32') = 0 then
            cbbBootStart.Items.Text := '0x6000' + #13#10 + '0x7000' + #13#10 + '0x7800' + #13#10 + '0x7C00'
          else
            cbbBootStart.Items.Text := '0x7000' + #13#10 + '0x7800' + #13#10 + '0x7C00' + #13#10 + '0x7E00';
        end
        else
        begin
          if CompareText(cbbMCU.Text, 'AT90CAN32') = 0 then
            cbbBootStart.Items.Text := '0x3000' + #13#10 + '0x3800' + #13#10 + '0x3C00' + #13#10 + '0x3E00'
          else
            cbbBootStart.Items.Text := '0x3800' + #13#10 + '0x3C00' + #13#10 + '0x3E00' + #13#10 + '0x3F00';
        end;
      end;
    4:
      begin
        if cbbByteWord.ItemIndex = 0 then
        begin
          cbbBootStart.Items.Text := '0x9000' + #13#10 + '0x9800' + #13#10 + '0x9C00' + #13#10 + '0x9E00';
        end
        else
        begin
          cbbBootStart.Items.Text := '0x4800' + #13#10 + '0x4C00' + #13#10 + '0x4E00' + #13#10 + '0x4F00';
        end;
      end;
    5:
      begin
        if cbbByteWord.ItemIndex = 0 then
        begin
          cbbBootStart.Items.Text := '0xE000' + #13#10 + '0xF000' + #13#10 + '0xF800' + #13#10 + '0xFC00';
        end
        else
        begin
          cbbBootStart.Items.Text := '0x7000' + #13#10 + '0x7800' + #13#10 + '0x7C00' + #13#10 + '0x7E00';
        end;
      end;
    6:
      begin
        if cbbByteWord.ItemIndex = 0 then
        begin
          cbbBootStart.Items.Text := '0x1E000' + #13#10 + '0x1F000' + #13#10 + '0x1F800' + #13#10 + '0x1FC00';
        end
        else
        begin
          cbbBootStart.Items.Text := '0xF000' + #13#10 + '0xF800' + #13#10 + '0xFC00' + #13#10 + '0xFE00';
        end;
      end;
    7:
      begin
        if cbbByteWord.ItemIndex = 0 then
        begin
          cbbBootStart.Items.Text := '0x3E000' + #13#10 + '0x3F000' + #13#10 + '0x3F800' + #13#10 + '0x3FC00';
        end
        else
        begin
          cbbBootStart.Items.Text := '0x1F000' + #13#10 + '0x1F800' + #13#10 + '0x1FC00' + #13#10 + '0x1FE00';
        end;
      end;
  else
    if cbbByteWord.ItemIndex = 0 then
    begin
      cbbBootStart.Items.Text := '0x1800' + #13#10 + '0x1C00' + #13#10 + '0x1E00' + #13#10 + '0x1F00' + #13#10 +
        '0x3800' + #13#10 + '0x3C00' + #13#10 + '0x3E00' + #13#10 + '0x3F00' + #13#10 +
        '0x6000' + #13#10 + '0x7000' + #13#10 + '0x7800' + #13#10 + '0x7C00' + #13#10 + '0x7E00' + #13#10 +
        '0x9000' + #13#10 + '0x9800' + #13#10 + '0x9C00' + #13#10 + '0x9E00' + #13#10 +
        '0xE000' + #13#10 + '0xF000' + #13#10 + '0xF800' + #13#10 + '0xFC00' + #13#10 +
        '0x1E000' + #13#10 + '0x1F000' + #13#10 + '0x1F800' + #13#10 + '0x1FC00' + #13#10 +
        '0x3E000' + #13#10 + '0x3F000' + #13#10 + '0x3F800' + #13#10 + '0x3FC00';
    end
    else
    begin
      cbbBootStart.Items.Text := '0x0C00' + #13#10 + '0x0E00' + #13#10 + '0x0F00' + #13#10 + '0x0F80' + #13#10 +
        '0x1C00' + #13#10 + '0x1E00' + #13#10 + '0x1F00' + #13#10 + '0x1F80' + #13#10 +
        '0x3000' + #13#10 + '0x3800' + #13#10 + '0x3C00' + #13#10 + '0x3E00' + #13#10 + '0x3F00' + #13#10 +
        '0x4800' + #13#10 + '0x4C00' + #13#10 + '0x4E00' + #13#10 + '0x4F00' + #13#10 +
        '0x7000' + #13#10 + '0x7800' + #13#10 + '0x7C00' + #13#10 + '0x7E00' + #13#10 +
        '0xF000' + #13#10 + '0xF800' + #13#10 + '0xFC00' + #13#10 + '0xFE00' + #13#10 +
        '0x1F000' + #13#10 + '0x1F800' + #13#10 + '0x1FC00' + #13#10 + '0x1FE00';
    end;
  end;
  cbbBootStart.ItemIndex := 0;
end;

function TfrmAutoCode.getAVRType: Integer;
begin
  Result := 0; //unknow

  //8K: 10
  if (CompareText(cbbMCU.Text, 'ATmega8') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega88') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega88P') = 0) or
    (CompareText(cbbMCU.Text, 'AT90PWM2') = 0) or
    (CompareText(cbbMCU.Text, 'AT90PWM2B') = 0) or
    (CompareText(cbbMCU.Text, 'AT90PWM3') = 0) or
    (CompareText(cbbMCU.Text, 'AT90PWM324') = 0) or
    (CompareText(cbbMCU.Text, 'AT90PWM3B') = 0) or
    (CompareText(cbbMCU.Text, 'ATMega8515') = 0) or
    (CompareText(cbbMCU.Text, 'ATMega8535') = 0)
    then
  begin
    Result := 1;
    Exit;
  end;

  //16K: 14
  if (CompareText(cbbMCU.Text, 'ATmega16') = 0) or
    (CompareText(cbbMCU.Text, 'AT90PWM216') = 0) or
    (CompareText(cbbMCU.Text, 'AT90PWM316') = 0) or
    (CompareText(cbbMCU.Text, 'ATMega162') = 0) or
    (CompareText(cbbMCU.Text, 'ATMega163') = 0) or
    (CompareText(cbbMCU.Text, 'ATMega164P') = 0) or
    (CompareText(cbbMCU.Text, 'ATMega165') = 0) or
    (CompareText(cbbMCU.Text, 'ATMega165P') = 0) or
    (CompareText(cbbMCU.Text, 'ATMega168') = 0) or
    (CompareText(cbbMCU.Text, 'ATMega168P') = 0) or
    (CompareText(cbbMCU.Text, 'ATMega169') = 0) or
    (CompareText(cbbMCU.Text, 'ATMega169P') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega328P') = 0)
    then
  begin
    Result := 2;
    Exit;
  end;

  //32K: 12
  if (CompareText(cbbMCU.Text, 'ATmega32') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega323') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega324P') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega325') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega3250') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega3250P') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega329') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega3290') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega3290P') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega329P') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega32HVB') = 0) or
    (CompareText(cbbMCU.Text, 'AT90CAN32') = 0)
    then
  begin
    Result := 3;
    Exit;
  end;

  //40K: 1
  if (CompareText(cbbMCU.Text, 'ATmega406') = 0)
    then
  begin
    Result := 4;
    Exit;
  end;

  //64K: 9
  if (CompareText(cbbMCU.Text, 'ATmega64') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega640') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega644') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega644P') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega645') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega6450') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega649') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega6490') = 0) or
    (CompareText(cbbMCU.Text, 'AT90CAN64') = 0)
    then
  begin
    Result := 5;
    Exit;
  end;

  //128K: 5
  if (CompareText(cbbMCU.Text, 'ATmega128') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega1280') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega1281') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega1284P') = 0) or
    (CompareText(cbbMCU.Text, 'AT90CAN128') = 0) then
  begin
    Result := 6;
    Exit;
  end;

  //256K: 2
  if (CompareText(cbbMCU.Text, 'ATmega2560') = 0) or
    (CompareText(cbbMCU.Text, 'ATmega2561') = 0)
    then
  begin
    Result := 7;
    Exit;
  end;
end;

procedure TfrmAutoCode.cbbTimeClkChange(Sender: TObject);
begin
  try
    Timer.Interval := StrToInt(cbbTimeClk.Text);
    if Timer.Interval < 100 then
      Timer.Interval := 100;
  except
    Timer.Interval := 200;
  end;
end;

procedure TfrmAutoCode.FormCreate(Sender: TObject);
begin
  edtEncryptKey.Text := 'D0 94 3F 8C 29 76 15 D8 20 40 E3 27 45 D8 48 AD EA 8B 2A 73 16 E9 B0 49 45 B3 39 28 0A C3 28 3C';
  edtDecryptKey.Text := 'D0 94 3F 8C 29 76 15 D8 20 40 E3 27 45 D8 48 AD EA 8B 2A 73 16 E9 B0 49 45 B3 39 28 0A C3 28 3C';
end;

procedure TfrmAutoCode.btnRandomKeyClick(Sender: TObject);
var
  i: Integer;
  s: string;
begin
  Randomize;
  s := '';
  for i := 0 to 31 do
  begin
    s := s + IntToHex(Random(256), 2) + ' ';
  end;
  edtEncryptKey.Text := s;
  edtDecryptKey.Text := s;
end;

end.

⌨️ 快捷键说明

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