パラレルポートは、3つのポート、および一般的に使用されるポートの3つのポートと呼ばれます。
1。並行して読み取りと書き込み
アセンブリ言語では、パラレルポートはインとアウトの命令で操作できますが、Delphiには対応する機能と方法はありません。アセンブリの手順内外で、平行ポートを簡単に読み書きできます。また、サードパーティが提供するWindows API関数またはDLLおよびVXDを呼び出すことにより、平行ポートにアクセスすることもできますが、組み込みアセンブリメソッドを使用して、より便利で迅速に並列ポートを読み書きできます。
次のReadport関数とWritePort手順を使用して、並列ポートを読み取り、書き込み、パラメーターポートが操作するポートアドレスです。
function readport(port:word):byte;
var
B:バイト;
始める
ASM
MOV DX、ポート;
アラバマ州では、dx;
MOV B、AL;
終わり;
結果:= b;
終わり;
手順WritePort(port:word; conbyte:byte);
始める
ASM
MOV DX、ポート;
Mov Al、Conbyte;
out dx、al;
終わり;
終了;ビット操作
ビットワイズ用語でパラレルポートを制御するために、まずパラレルポートのデータを読み取り、次にビット操作を実行し、次にパラレルポートに書き込み、パラレルポートのビット制御を実現できます。
論理演算子と動作する2つの数値でビットワイズロジックと操作を実行します。つまり、1と1の結果は1であり、他の0と1、1と0および0と0です。 。
操作する2つの数値で論理演算子または操作を実行します。つまり、2つのビットが1つである限り、結果は「または」です。
位置0を指定するには、オペレーターを使用してください。たとえば、16進84hのバイナリは10000100、3番目のビットは1です。3番目の位置を0に設定し、他のビットを変更しておくと、84ドルと$ fbを使用できます。 = 80ドル、80hのバイナリ値は10000000です。
ORオペレーターを使用して位置1を指定します。たとえば、次のように:16進84Hの2番目のビットは0です。2番目のビットを1に設定し、他のビットを変更しないままにしてください。 10000110。
例:
1.データポート378HのD2ビットの可能性を低く設定します。つまり、設定0:
b:= readport($ 378);
b:= bおよび$ fb;
WritePort($ 378、b);
2.データポート378HのD2ビットの可能性を高く設定します。つまり、設定1:
b:= readport($ 378);
b:= bまたは$ 04;
WritePort($ 378、b);
3.データポート378HのD2ビットの可能性を決定します。
b:= readport($ 378);
if((bおよび$ 04)= $ 04)
//ポテンシャルが高いときのコード
それ以外
//ポテンシャルが低いときのコード
または:
b:= readport($ 378);
if((bまたは$ fb)= $ ff)then
//ポテンシャルが高いときのコード
それ以外
//ポテンシャルが低いときのコード
3。特定の実装
次の例は、平行ポートを制御するデータポート378hの各ビットの潜在的な高さです。データポートの8ビット:D0〜D7は、並列インターフェイスの指示のピン2〜9に対応しています。関連する情報を確認してください。
最初にDelphiを実行し、新しいプロジェクトを作成し、F12をクリックして、フォーム1のUnit1に読み取りおよび書き込みポートのコードを追加します。
function readport(port:word):byte;
手順WritePort(port:word; conbyte:byte);
function readport(port:word):byte;
var
B:バイト;
始める
ASM
MOV DX、ポート;
アラバマ州では、dx;
MOV B、AL;
終わり;
結果:= b;
終わり;
手順WritePort(port:word; conbyte:byte);
始める
ASM
MOV DX、ポート;
Mov Al、Conbyte;
out dx、al;
終わり;
終わり;
8つのチェックボックスコンポーネントを追加し、それぞれD0からD7にキャプションプロパティを変更し、右に配置します。
Checkbox1をダブルクリックし、次のプログラムコードをCheckbox1コンポーネントのオンクリックイベントに追加します。
手順tform1.checkbox1click(sender:tobject);
var
B:バイト;
始める
B:= 0;
Checkbox1がチェックされている場合
b:= bまたは$ 01;
Checkbox2がチェックされている場合
b:= bまたは$ 02;
Checkbox3。の場合、チェックしました
b:= bまたは$ 04;
Checkbox4がチェックされている場合
b:= bまたは$ 08;
Checkbox5.をチェックした場合
b:= bまたは10ドル。
Checkbox6。チェックした場合
B:= Bまたは20ドル。
Checkbox7がチェックされている場合
B:= Bまたは40ドル。
Checkbox8。チェックした場合
B:= Bまたは80ドル。
WritePort($ 378、b);
終わり;
入力が完了したら、Checkbox2のオンクリックイベントをCheckbox8(7つのチェックボックスコンポーネント)に設定し、Checkbox1:Checkbox1ClickのOnClickイベントに設定します。
この時点で、プログラムをコンパイルして実行すると、これらの8つのチェックボックスをクリックして、LPT1データポートの各ビットの可能性を制御できます。
次に、パラレルポートのデータポートステータスを監視する機能が追加されます。
Form1:Timer1にタイマーコンポーネントを追加し、有効なプロパティをfalseおよびintervalプロパティに1に変更します。
Timer1のOntimerイベントに追加:
手順tform1.timer1timer(sender:tobject);
var
B:バイト;
始める
b:= readport($ 378);
Checkbox1.checked:=((bまたは$ fe)= $ ff);
Checkbox2.checked:=((bまたは$ fd)= $ ff);
checkbox33.checked:=((bまたは$ fb)= $ ff);
Checkbox4.checked:=((bまたは$ f7)= $ ff);
checkbox5.checked:=((bまたは$ ef)= $ ff);
Checkbox6.checked:=((bまたは$ df)= $ ff);
Checkbox7.checked:=((bまたは$ bf)= $ ff);
Checkbox8.checked:=((bまたは$ 7f)= $ ff);
終わり;
チェックボックスコンポーネントを追加すると、変更されたキャプションプロパティは「モニターパラレルポート」で、オンクリックイベントに追加します。
手順tform1.checkbox9click(sender:tobject);
始める
Timer1.Enabled:= checkbox9.checked;
終わり;
プログラムをコンパイルして実行し、[監視平行ポート]をクリックすると、パラレルポートLPT1データポート378Hのステータスを監視し、そのステータスをリアルタイムで変更できます。
データポート378Hのステータスの表示と検証を促進するために、印刷インターフェイス、8つのLED(光発光ダイオード)、8つの1K抵抗を使用する小さな並列ポートテスト回路を作成しました:
回路図が完成したら、コンピューターの平行ポートにインストールし、書かれたプログラムを実行して、データポート378hの各ビットの可能性を簡単に表示します。
最後に、別の回転ランタン実験をしましょう。
まず、グローバル変数TBを宣言します。「TB:BYTE」を下に追加します。
var
form1:tform1;
TB:バイト;
次に、Form1のタイマーとチェックボックスを追加し、Timer2の有効なプロパティをfalseに変更し、インターバルプロパティを300に変更し、Timer2をダブルクリックし、Ontimerイベントに追加します。
手順tform1.timer2timer(sender:tobject);
var
B:バイト;
始める
tb = 0の場合
TB:= 1
それ以外
TB:= TB * 2;
WritePort(378ドル、TB);
b:= readport($ 378);
Checkbox1.checked:=((bまたは$ fe)= $ ff);
Checkbox2.checked:=((bまたは$ fd)= $ ff);
checkbox33.checked:=((bまたは$ fb)= $ ff);
Checkbox4.checked:=((bまたは$ f7)= $ ff);
checkbox5.checked:=((bまたは$ ef)= $ ff);
Checkbox6.checked:=((bまたは$ df)= $ ff);
Checkbox7.checked:=((bまたは$ bf)= $ ff);
Checkbox8.checked:=((bまたは$ 7f)= $ ff);
終わり;
Checkbox10のキャプションプロパティを「Revolving Light Demo」に変更し、CheckBox10をダブルクリックして、そのオンクリックイベントに追加します。
手順tform1.checkbox10click(sender:tobject);
始める
Timer2.Enabled:= checkbox10.checked;
終わり;
プログラムをコンパイルして実行します。
「回転ランタンデモンストレーション」をクリックして、「回転ランタン」の効果を見ましたか? Timer2の間隔を変更することにより、よりクールな効果を調整できます。
注:上記のアセンブリアクセスは、winnt/2kの下での並列ポートにのみ使用できます。
上記のプログラムは、Win98+Delphi6.0でテストされ、渡されました