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

📄 unit1.pas

📁 AVR模拟USB上位机控制代码,DELPHI
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,libusb, Spin, ComCtrls, Gauges;

type
  TForm1 = class(TForm)
    Button3: TButton;
    GroupBox1: TGroupBox;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    SpinEdit1: TSpinEdit;
    SpinEdit2: TSpinEdit;
    SpinEdit3: TSpinEdit;
    SpinEdit4: TSpinEdit;
    Button8: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    CheckBox7: TCheckBox;
    CheckBox8: TCheckBox;
    Label5: TLabel;
    StatusBar1: TStatusBar;
    Label6: TLabel;
    Gauge1: TGauge;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure SpinEdit4Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  procedure setreset(cmd,duration,port:integer);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  udev: pusb_dev_handle;
  S: array [0..255] of char;
  buffer:array[0..2] of byte;
  numbites:integer;
  cb:array[0..7] of Tcheckbox;

const PSCMD_ECHO=  0;
      PSCMD_GET=   1;
      PSCMD_ON=    2;
      PSCMD_OFF=   3;


implementation

{$R *.DFM}

function btbool(data:word;bit:word):boolean;
begin
asm     pusha
        mov     ax,&data
        mov     bx,&bit
        bt      ax,bx
        jnc     @zero
        mov     &result,1
        jmp     @out
@zero:  mov     &result,0
@out:   popa
end;
end;


function echo(inputdata:integer):boolean;
var r:integer;
begin
result:=true;
numbites:= usb_control_msg(udev, USB_TYPE_VENDOR or USB_RECIP_DEVICE or USB_ENDPOINT_IN, PSCMD_ECHO, inputdata, 0, buffer, sizeof(buffer), 5000);
r:= (buffer[0] or (buffer[1] shl 8 ));
if r<>inputdata then result:=false;
if (numbites <>2) then result:=false;
end;

function getstatus():integer;
begin
numbites:= usb_control_msg(udev, (USB_TYPE_VENDOR or USB_RECIP_DEVICE or USB_ENDPOINT_IN), PSCMD_GET, 0, 0, buffer, sizeof(buffer), 5000);
if (numbites<2) then showmessage(usb_strerror);
result:=(buffer[1] shl 8)+buffer[0];
end;

procedure TForm1.Button3Click(Sender: TObject);
var foundvendor,foundprodukt:boolean;
    bus: pusb_bus;
    dev: pusb_device;
begin
foundvendor:=false;
foundprodukt:=false;
usb_init; // Initialize libusb
form1.Caption:=usb_strerror;
if(usb_find_busses<1) then showmessage(usb_strerror);
if (usb_find_devices<1) then showmessage(usb_strerror); // Find all devices on all USB devices
bus := usb_get_busses; // Return the list of USB busses found
if  bus=nil then showmessage(usb_strerror);
while Assigned(bus) do
      begin
      dev := bus^.devices;
      while Assigned(dev) do
            begin
            if dev^.descriptor.idVendor=5824  then foundvendor:=true;
            if dev^.descriptor.idProduct=1500 then foundprodukt:=true;
            if (foundvendor and foundprodukt) then begin
                                                   udev:= usb_open(dev);
                                                   Button4.Click;
                                                   GroupBox1.Visible:=true;
                                                   SpinEdit4.OnChange(self);
                                                   break;
                                                   end else begin foundvendor:=false; foundprodukt:=false; end;
            dev := dev^.next;
            end;
            if  (foundvendor and foundprodukt) then break;
            bus := bus^.next;
       end;
statusbar1.Panels[0].Text:=usb_strerror;
if not (foundvendor and foundprodukt) then showmessage('Powerswitch (VID=0x16C0  PID=0x05DC)'+chr(10)+chr(13)+'Not Found');
end;

procedure TForm1.Button4Click(Sender: TObject);
var i,status:integer;
begin
if Assigned(udev) then
                  begin
                  status:=getstatus;
                  label5.Caption:=inttostr(status);
                  label5.Visible:=true;
                  for i:=low(cb) to high(cb) do cb[i].Checked:=btbool(status,i);
                  end;
statusbar1.Panels[0].Text:=usb_strerror;
end;

procedure TForm1.Button5Click(Sender: TObject);
var  i,v,j:integer;
     sukkes:boolean;
     t:dword;
begin
j:=1000;
label6.Caption:='In Progress';
label6.Visible:=true;
application.ProcessMessages;
sukkes:=true;
t:=0;
Button5.Enabled:=false;
if Assigned(udev) then
                  begin
                  randomize;
                  Gauge1.MaxValue:=j;
                  t:=gettickcount;
                  for i:=1 to j do     begin
                                          Gauge1.Progress:=i;
                                          v:=random(255);
                                          if not echo(v)  then begin
                                                               statusbar1.Panels[0].Text:=usb_strerror;
                                                               sukkes:=false;
                                                               end;
                                          end;
                  t:=gettickcount-t;
                  end;
statusbar1.Panels[0].Text:=usb_strerror;
if sukkes then    label6.Caption:='PASSED  ' + inttostr(t) + ' mS'
   else label6.Caption:='NOT PASSED';
Application.ProcessMessages;
Button5.Enabled:=True;
end;

procedure TForm1.setreset(cmd,duration,port:integer);
begin
numbites:= usb_control_msg(udev, (USB_TYPE_VENDOR or USB_RECIP_DEVICE or USB_ENDPOINT_IN), CMD, duration, port, buffer, sizeof(buffer), 5000);
if(numbites < 0) then showmessage(usb_strerror);
statusbar1.Panels[0].Text:=usb_strerror;
end;


procedure TForm1.Button6Click(Sender: TObject);
begin
setreset(PSCMD_ON,0,spinedit1.value);
Button4.Click;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
setreset(PSCMD_Off,0,spinedit1.value);
Button4.Click;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
if spinedit2.value=0 then setreset(PSCMD_Off,spinedit4.value,spinedit3.value)
   else setreset(PSCMD_ON,spinedit4.value,spinedit3.value);
end;

procedure TForm1.SpinEdit4Change(Sender: TObject);
begin
if SpinEdit4.Value=0 then label4.Caption:='Permanent switch' else
   label4.Caption:=inttostr(SpinEdit4.Value*200)+' ms';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
cb[0]:=checkbox1;
cb[1]:=checkbox2;
cb[2]:=checkbox3;
cb[3]:=checkbox4;
cb[4]:=checkbox5;
cb[5]:=checkbox6;
cb[6]:=checkbox7;
cb[7]:=checkbox8;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if udev<>nil then usb_close(udev);
end;

end.

⌨️ 快捷键说明

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