Unit1.pas
上传用户:zouping69
上传日期:2020-07-27
资源大小:1491k
文件大小:5k
源码类别:

并口编程

开发平台:

Delphi

  1. unit Unit1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls, XPMan;
  6. type
  7.   TForm1 = class(TForm)
  8.     Button1: TButton;
  9.     Button2: TButton;
  10.     GroupBox1: TGroupBox;
  11.     CheckBox1: TCheckBox;
  12.     CheckBox2: TCheckBox;
  13.     CheckBox3: TCheckBox;
  14.     CheckBox4: TCheckBox;
  15.     GroupBox2: TGroupBox;
  16.     CheckBox5: TCheckBox;
  17.     CheckBox6: TCheckBox;
  18.     CheckBox7: TCheckBox;
  19.     CheckBox8: TCheckBox;
  20.     CheckBox9: TCheckBox;
  21.     GroupBox3: TGroupBox;
  22.     CheckBox10: TCheckBox;
  23.     CheckBox11: TCheckBox;
  24.     CheckBox12: TCheckBox;
  25.     CheckBox13: TCheckBox;
  26.     CheckBox14: TCheckBox;
  27.     CheckBox15: TCheckBox;
  28.     CheckBox16: TCheckBox;
  29.     CheckBox17: TCheckBox;
  30.     XPManifest1: TXPManifest;
  31.     Memo1: TMemo;
  32.     Label1: TLabel;
  33.     Label2: TLabel;
  34.     Label3: TLabel;
  35.     Label4: TLabel;
  36.     ComboBox1: TComboBox;
  37.     Button3: TButton;
  38.     procedure Button1Click(Sender: TObject);
  39.     procedure FormCreate(Sender: TObject);
  40.     procedure Memo1DblClick(Sender: TObject);
  41.     procedure Button2Click(Sender: TObject);
  42.     procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);
  43.     procedure Button3Click(Sender: TObject);
  44.   private
  45.     { Private declarations }
  46.   public
  47.     { Public declarations }
  48.   end;
  49. var
  50.   Form1: TForm1;
  51.   d,s,c:short;
  52.   j,k,l:integer;
  53.   lptaddr:integer;
  54.   s1,s2:string;
  55.   data1:array[1..8] of TCheckBox;
  56.   status1:array[1..5] of TCheckBox;
  57.   control1:array[1..4] of TCheckBox;
  58.   data:short;
  59.   status:short;
  60.   control:short;
  61.   function Inp32(lptaddr:short):short;stdcall external 'INPOUT32.DLL';
  62.   procedure Out32(portaddr:short;datum:short);stdcall external 'INPOUT32.DLL';
  63.   procedure writecheckbox(d:integer;s:integer;c:integer);
  64. implementation
  65. {$R *.dfm}
  66. procedure writecheckbox(d:integer;s:integer;c:integer);
  67. begin
  68. for j:=1 to 8 do
  69.            begin
  70.                  k:=d mod 2;
  71.                  d:=d div 2;
  72.                  if k=1 then data1[j].Checked:=true
  73.                  else data1[j].checked:=false;
  74.            end;
  75. s:=s div 8;
  76. for j:=4 to 8 do
  77.            begin
  78.                  k:=s mod 2;
  79.                  s:=s div 2;
  80.                  if k=1 then status1[j-3].Checked:=true
  81.                  else status1[j-3].checked:=false;
  82.            end;
  83. for j:=1 to 4 do
  84.            begin
  85.                  k:=c mod 2;
  86.                  c:=c div 2;
  87.                  if k=1 then control1[j].Checked:=true
  88.                  else control1[j].checked:=false;
  89.            end;
  90. end;
  91. procedure TForm1.Button1Click(Sender: TObject);
  92. begin
  93. s:=Inp32(status);
  94. c:=Inp32(control);
  95. d:=Inp32(data);
  96. memo1.Lines.Add(format('%s           %s       %s',
  97.                          [inttohex(c,2),inttohex(s,2),inttohex(d,2)]));
  98. writecheckbox(d,s,c);
  99. end;
  100. procedure TForm1.FormCreate(Sender: TObject);
  101. begin
  102.   data:=$378;
  103.   status:=$379;
  104.   control:=$37a;
  105.   control1[1]:=CheckBox1;
  106.   control1[2]:=CheckBox2;
  107.   control1[3]:=CheckBox3;
  108.   control1[4]:=CheckBox4;
  109.   status1[1]:=CheckBox9;
  110.   status1[2]:=CheckBox8;
  111.   status1[3]:=CheckBox7;
  112.   status1[4]:=CheckBox5;
  113.   status1[5]:=CheckBox6;
  114.   data1[1]:=CheckBox10;
  115.   data1[2]:=CheckBox11;
  116.   data1[3]:=CheckBox12;
  117.   data1[4]:=CheckBox13;
  118.   data1[5]:=CheckBox14;
  119.   data1[6]:=CheckBox15;
  120.   data1[7]:=CheckBox16;
  121.   data1[8]:=CheckBox17;
  122.   memo1.Clear;
  123.   memo1.ReadOnly:=true;
  124.   lptaddr:=$378;
  125.   memo1.Lines.Add('LPT address 0x'+inttohex(lptaddr,2));
  126. end;
  127. procedure TForm1.Memo1DblClick(Sender: TObject);
  128. begin
  129.  s1:=memo1.SelText;
  130.  l:=length(s1);
  131.  s2:='$00';
  132.  s2[2]:=s1[1];
  133.  s2[3]:=s1[2];
  134.  d:=0;
  135.  s:=0;
  136.  c:=0;
  137.  if l=2 then d:=strtoint(s2)
  138.  else if l=9 then s:=strtoint(s2)
  139.  else if l=13 then c:=strtoint(s2);
  140.  writecheckbox(d,s,c);
  141. end;
  142. procedure TForm1.Button2Click(Sender: TObject);
  143. begin
  144. k:=1;
  145. d:=0;
  146. for j:=1 to 8 do
  147.                 begin
  148.                       if data1[j].Checked=true then d:=d+k;
  149.                       k:=k*2;
  150.                 end;
  151. Out32(data,d);
  152. k:=1;
  153. c:=0;
  154. for j:=1 to 4 do
  155.                 begin
  156.                       if control1[j].Checked=true then c:=c+k;
  157.                       k:=k*2;
  158.                 end;
  159. Out32(control,c);
  160. end;
  161. procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
  162. begin
  163. if not(key in ['0'..'9','a'..'f','x',#8]) then
  164. key:=#0;
  165. end;
  166. procedure TForm1.Button3Click(Sender: TObject);
  167. begin
  168. s1:=combobox1.Text;
  169. j:=length(s1);
  170. if j=0 then
  171.           begin
  172.              showmessage('请输入一个并口地址');
  173.              combobox1.Text:=('0x'+inttohex(data,2));
  174.           end
  175. else
  176.    begin
  177.       s2:='$000';
  178.       if s1[1]='0' then
  179.                      begin
  180.                         if s1[2]='x' then
  181.                          for k:=3 to j do
  182.                             if not(s1[k]='x') then s2[4+k-j]:=s1[k]
  183.                             else
  184.                                 begin
  185.                                    s2:='$000';
  186.                                    break;
  187.                                 end;
  188.                      end;
  189.       lptaddr:=strtoint(s2);
  190.       if lptaddr=0 then
  191.                      begin
  192.                         showmessage('错误的并口基址');
  193.                         combobox1.Text:=('0x'+inttohex(data,2));
  194.                      end
  195.       else
  196.         begin
  197.            data:=lptaddr;
  198.            status:=lptaddr+1;
  199.            control:=lptaddr+2;
  200.            showmessage('并口基址改为 0x'+inttohex(lptaddr,2));
  201.            memo1.Lines.Add('LPT address 0x'+inttohex(lptaddr,2));
  202.         end;
  203.    end;
  204. end;
  205. end.