병렬 포트에는 Parallel Port가 있습니다. 3 개의 포트는 LPT1입니다.
1. 평행을 읽고 씁니다
어셈블리 언어에서는 병렬 포트를 In 및 Out 지침으로 작동 할 수 있지만 Delphi에는 병렬 포트를 읽고 쓸 수있는 해당 기능과 방법이 없습니다. 어셈블리 지침 내 및 외부에서는 병렬 포트를 쉽게 읽고 쓸 수 있습니다. 또한 Windows API 기능 또는 DLL 및 VXD를 제 3자가 제공하는 VXD로 호출하여 병렬 포트에 액세스 할 수 있지만 임베디드 어셈블리 방법을 사용하여 병렬 포트를 읽고 쓰는 것이 더 편리하고 빠르게 읽고 쓰는 것이 더 편리합니다.
다음 readport 함수 및 WritePort 절차를 사용하여 병렬 포트를 읽고 씁니다. 매개 변수 포트는 작동 할 포트 주소입니다.
함수 readport (포트 : Word) : 바이트;
var
B : 바이트;
시작하다
ASM
Mov DX, 포트;
Al, dx;
Mov B, Al;
끝;
결과 : = B;
끝;
절차 writePort (포트 : Word; Conbyte : Byte);
시작하다
ASM
Mov DX, 포트;
Mov Al, Conbyte;
out dx, al;
끝;
끝; 2. 비트 작동
병렬 포트를 비트로 제어하려면 먼저 병렬 포트의 데이터를 읽은 다음 비트 작업을 수행 한 다음 평행 포트의 비트 컨트롤을 달성 할 수 있도록 평행 포트에 다시 쓸 수 있습니다.
논리 연산자 및 작동 할 두 개의 숫자에 대한 비트 로직 및 작업을 수행합니다. 즉, 1과 1의 결과는 1이고 다른 0과 1, 1, 0 및 0 및 0입니다. 0의 결과는 모두 0입니다. .
논리 연산자 또는 작동 할 두 개의 숫자에 대한 논리적 인 논리 또는 작업을 수행합니다.
및 연산자를 사용하여 위치 0을 지정합니다. 예를 들어, 16 진 84h의 이진은 다음과 같습니다. 10000100이고 세 번째 비트는 1입니다. 세 번째 위치를 0으로 설정하고 다른 비트를 변경하지 않으려면 다음을 사용할 수 있습니다. $ 84 및 $ FB. = $ 80, 이진 값은 80h입니다.
OR 연산자를 사용하여 위치 1을 지정합니다. 예 : 16 진 84h의 두 번째 비트는 0입니다. 두 번째 비트를 1로 설정하고 다른 비트를 변경하지 않으려면 다음을 수행 할 수 있습니다. $ 84 또는 $ 02 = $ 86, 86h 이진 값은 이진 값은 다음과 같습니다. 10000110.
예:
1. 데이터 포트 378h의 D2 비트의 잠재력을 낮은 것으로 설정합니다. 즉, 세트 0 :
B : = Readport ($ 378);
B : = B 및 $ FB;
WritePort ($ 378, b);
2. D2 비트의 데이터 포트 378H의 잠재력을 높이로 설정합니다.
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) 그러면
// 잠재력이 높을 때 코드
또 다른
// 잠재력이 낮을 때 코드
3. 특정 구현
다음 예는 병렬 포트를 제어하는 데이터 포트 378H의 각 비트의 잠재적 높이입니다. 데이터 포트의 8 비트 : D0 ~ D7은 병렬 인터페이스의 다른 핀에 대한 핀 2 ~ 9에 해당합니다. 관련 정보를 확인하십시오.
먼저 Delphi를 실행하고 새 프로젝트를 만들고 F12를 클릭하여 읽기 코드를 추가하고 포트를 작성하여 Form1의 Unit1에 추가하십시오.
함수 readport (포트 : Word) : 바이트;
절차 writePort (포트 : Word; Conbyte : Byte);
함수 readport (포트 : Word) : 바이트;
var
B : 바이트;
시작하다
ASM
Mov DX, 포트;
Al, dx;
Mov B, Al;
끝;
결과 : = B;
끝;
절차 writePort (포트 : Word; Conbyte : Byte);
시작하다
ASM
Mov DX, 포트;
Mov Al, Conbyte;
out dx, al;
끝;
끝;
8 개의 체크 박스 구성 요소를 추가하고 캡션 속성을 각각 D0에서 D7로 수정 한 다음 오른쪽에서 왼쪽으로 정렬합니다.
CheckBox1을 두 번 클릭하고 CheckBox1 구성 요소의 OnClick 이벤트에 다음 프로그램 코드를 추가하십시오.
절차 tform1.checkbox1click (sender : tobject);
var
B : 바이트;
시작하다
B : = 0;
CheckBox1.Checked 경우
B : = B 또는 $ 01;
CheckBox2.Checked
B : = B 또는 $ 02;
CheckBox3.Checked 경우
B : = B 또는 $ 04;
checkbox4. 확인 된 경우
B : = B 또는 $ 08;
checkbox5를 확인한 경우
B : = B 또는 $ 10;
CheckBox6.Checked 경우
B : = B 또는 $ 20;
CheckBox7.Checked 경우
B : = B 또는 $ 40;
CheckBox8.Checked 경우
B : = B 또는 $ 80;
WritePort ($ 378, b);
끝;
입력이 완료되면 Checkbox2의 OnClick 이벤트를 Checkbox8, 7 Checkbox 구성 요소로 설정하여 checkbox1 : checkbox1click의 onclick 이벤트로 설정하십시오.
현재 프로그램을 컴파일하고 실행하면이 8 개의 확인란을 클릭하여 LPT1 데이터 포트의 각 비트의 잠재력을 제어 할 수 있습니다.
다음으로 병렬 포트의 데이터 포트 상태를 모니터링하는 기능이 추가됩니다.
Form1 : Timer1에서 타이머 구성 요소를 추가하고 활성화 된 속성을 False 및 Interval 속성으로 수정하십시오.
Timer1의 Ontimer 이벤트에 추가 :
절차 tform1.Timer1Timer (Sender : Tobject);
var
B : 바이트;
시작하다
B : = Readport ($ 378); // 데이터 포트
CheckBox1.Checked : = ((b 또는 $ fe) = $ ff);
CheckBox2.Checked : = ((b 또는 $ fd) = $ ff);
CheckBox3.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);
끝;
체크 박스 구성 요소를 추가하면 수정 된 캡션 속성이 "모니터 병렬 포트"이며 OnClick 이벤트에 추가하십시오.
절차 tform1.checkbox9click (sender : tobject);
시작하다
TIMER1.ENABLED : = CheckBox9.Checked;
끝;
프로그램을 컴파일하고 실행하고 "병렬 포트 모니터"를 클릭하면 병렬 포트 LPT1 데이터 포트 378H의 상태를 모니터링하고 해당 상태를 실시간으로 수정할 수 있습니다.
데이터 포트 378H의 상태를 촉진하고 검증하기 위해, 작은 병렬 포트 테스트 회로를 만들었습니다. 이는 인쇄 인터페이스, 8 LED (Light Emitting Diodes) 및 8 1K 저항을 사용합니다 :
회로 다이어그램이 완료된 후 컴퓨터의 평행 포트에 설치하고 서면 프로그램을 실행하여 각 데이터 포트 378h의 각 비트의 잠재력을 쉽게 볼 수 있습니다.
마지막으로, 또 다른 회전 랜턴 실험을하겠습니다.
먼저 글로벌 변수 tb : "tb : byte"아래를 추가하십시오. "form1 : tform1":
var
form1 : tform1;
TB : 바이트;
그런 다음 Timer와 Checkbox를 Form1로 추가하고 Timer2의 활성화 속성을 False로 수정하고 Interval 속성을 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);
CheckBox3.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의 캡션 속성을 "회전 라이트 데모"로 수정 한 다음 Checkbox10을 두 번 클릭 한 다음 OnClick 이벤트에 추가하십시오.
절차 tform1.checkbox10click (sender : tobject);
시작하다
Timer2.Enabled : = CheckBox10.Checked;
끝;
프로그램을 컴파일하고 실행하십시오.
"랜턴 시연 회전"을 클릭하십시오. "회전 랜턴"의 효과를 보셨습니까? Timer2의 간격을 수정하면 속도를 조정할 수 있습니다.
참고 : 위의 병렬 포트에 대한 어셈블리 액세스 방법은 Winnt/2K 하에서 평행 포트에 액세스하기 위해서만 사용할 수 있습니다.
위의 프로그램은 Win98+Delphi6.0에 따라 테스트되고 통과되었습니다