三、具體實現
下面的例子是控制並口的數據端口378H的各個位的電位高低。數據端口的8個位:D0~D7分別對應並行接口的2~9腳,關於並行接口其它的引腳的說明就查看相關資料,這裡就不多說了。
首先運行 Delphi,新建一個工程,按一下F12在Form1的單元文件Unit1中加入讀寫端口的代碼:
function ReadPort(Port:Word):BYTE;
procedure WritePort(Port:Word;ConByte:BYTE);
function ReadPort(Port:Word):BYTE;
var
B:BYTE;
begin
ASM
MOV DX, Port;
IN AL, DX;
MOV B, AL;
END;
Result:=B;
end;
procedure WritePort(Port:Word;ConByte:BYTE);
begin
ASM
MOV DX, Port;
MOV AL, ConByte;
OUT DX, AL;
END;
end;
添加8個 CheckBox 組件,修改它們的 Caption(標題)屬性分別為 D0 到 D7 ,將它們按右到左進行排列好。
雙擊 CheckBox1,在CheckBox1組件的OnClick(單擊)事件中加入以下的程序代碼:
procedure TForm1.CheckBox1Click(Sender: TObject);
var
b:BYTE;
begin
b:=0;
if CheckBox1.Checked then
b:=b or $01;
if CheckBox2.Checked then
b:=b or $02;
if CheckBox3.Checked then
b:=b or $04;
if CheckBox4.Checked then
b:=b or $08;
if CheckBox5.Checked then
b:=b or $10;
if CheckBox6.Checked then
b:=b or $20;
if CheckBox7.Checked then
b:=b or $40;
if CheckBox8.Checked then
b:=b or $80;
WritePort($378,b); //寫數據端口
end;
輸入完成後,把CheckBox2到CheckBox8這7個CheckBox組件的OnClick事件設置為CheckBox1的OnClick事件:CheckBox1Click。
此時編譯運行程序,已經可以通過點擊這8個CheckBox來控制LPT1的數據端口的各個位的電位高低了。
下面再加入監控並口的數據端口狀態的功能。
在Form1中加入一個Timer組件:Timer1,修改它的Enabled屬性為False,Interval屬性為1。
在Timer1的OnTimer事件中加入:
procedure TForm1.Timer1Timer(Sender: TObject);
var
B:BYTE;
begin
B:=ReadPort($378); //讀數據端口
CheckBox1.Checked:=((B or $FE)=$FF);
CheckBox2.Checked:=((B or $FD)=$FF);
CheckBox3.Checked:=((B or $FB)=$FF);
CheckBox4.Checked:=((B or $F7)=$FF);
CheckBox5.Checked:=((B or $EF)=$FF);
CheckBox6.Checked:=((B or $DF)=$FF);
CheckBox7.Checked:=((B or $BF)=$FF);
CheckBox8.Checked:=((B or $7F)=$FF);
end;
再加入一個CheckBox組件,修改的Caption屬性為“監控並口”,並在它的OnClick事件中加入:
procedure TForm1.CheckBox9Click(Sender: TObject);
begin
Timer1.Enabled:=CheckBox9.Checked;
end;