พอร์ตขนานเรียกว่าพอร์ตขนาน
1. อ่านและเขียนแบบขนาน
ในภาษาแอสเซมบลีพอร์ตขนานสามารถดำเนินการกับคำแนะนำในและออก แต่ไม่มีฟังก์ชั่นและวิธีการที่สอดคล้องกันใน Delphi เพื่ออ่านและเขียนพอร์ตขนาน คำแนะนำการประกอบเข้าและออกสามารถอ่านและเขียนพอร์ตขนานได้อย่างง่ายดาย นอกจากนี้เรายังสามารถเข้าถึงพอร์ตคู่ขนานได้โดยเรียกใช้ฟังก์ชั่น Windows API หรือ DLLS และ VXDS ที่จัดทำโดยบุคคลที่สาม แต่สะดวกกว่าและรวดเร็วในการอ่านและเขียนพอร์ตขนานโดยใช้วิธีการประกอบแบบฝังตัว
ใช้ฟังก์ชั่น readport ต่อไปนี้และขั้นตอน WRITEPORT เพื่ออ่านและเขียนพอร์ตขนานและพอร์ตพารามิเตอร์เป็นที่อยู่พอร์ตที่จะทำงาน
ฟังก์ชั่น readport (พอร์ต: คำ): ไบต์;
วาจา
B: ไบต์;
เริ่ม
asm
MOV DX, พอร์ต;
ใน Al, DX;
MOV B, AL;
จบ;
ผลลัพธ์: = B;
จบ;
ขั้นตอน writeport (พอร์ต: word; conbyte: byte);
เริ่ม
asm
MOV DX, พอร์ต;
MOV AL, Conbyte;
DX, AL;
จบ;
สิ้นสุด;
ในการควบคุมพอร์ตคู่ขนานในคำศัพท์ bitwise คุณสามารถอ่านข้อมูลของพอร์ตขนานก่อนจากนั้นทำการดำเนินการบิตแล้วเขียนไปยังพอร์ตขนานอีกครั้งเพื่อให้การควบคุมบิตของพอร์ตขนานสามารถทำได้
ตัวดำเนินการแบบลอจิคัลและดำเนินการตรรกะ Bitwise และการทำงานกับตัวเลขสองตัวที่จะดำเนินการ: นั่นคือผลลัพธ์ของ 1 และ 1 คือ 1 และอีก 0 และ 1, 1 และ 0 และ 0 และ 0 และผลลัพธ์ของ 0 ทั้งหมดเป็น 0 ทั้งหมด 0 .
ตัวดำเนินการเชิงตรรกะหรือดำเนินการตามตรรกะบิตหรือการทำงานของสองตัวเลขที่จะดำเนินการ: นั่นคือตราบใดที่สองบิตของ "หรือ" เป็นหนึ่งผลลัพธ์คือ 1;
ใช้ AND Operator เพื่อระบุตำแหน่ง 0 ตัวอย่างเช่นไบนารีของ hexadecimal 84H คือ: 10000100 และบิตที่สามคือ 1 เพื่อตั้งตำแหน่งที่สามเป็น 0 และบิตอื่น ๆ ยังคงไม่เปลี่ยนแปลงคุณสามารถใช้: $ 84 และ $ FB = $ 80 ค่าไบนารีของ 80H คือ 10,000,000
ใช้ OR Operator เพื่อระบุตำแหน่งที่ 1 ตัวอย่างเช่น: บิตที่สองของ hexadecimal 84h คือ 0. ในการตั้งค่าบิตที่สองเป็น 1 และบิตอื่น ๆ ยังคงไม่เปลี่ยนแปลงคุณสามารถใช้: $ 84 หรือ $ 02 = $ 86, 86h ค่าไบนารีคือค่าไบนารี 10000110
ตัวอย่าง:
1. ตั้งค่าศักยภาพของพอร์ตข้อมูล D2 บิต 378H เป็นต่ำนั่นคือตั้งค่า 0:
b: = readport ($ 378);
B: = B และ $ FB;
writeport ($ 378, b);
2. ตั้งค่าศักยภาพของพอร์ตข้อมูล D2 บิต 378H เป็นสูงนั่นคือชุดที่ 1:
b: = readport ($ 378);
B: = B หรือ $ 04;
writeport ($ 378, b);
3. กำหนดศักยภาพของพอร์ตข้อมูล D2 บิต 378H:
b: = readport ($ 378);
if ((b และ $ 04) = $ 04) แล้ว
// รหัสเมื่อศักยภาพสูง
อื่น
// รหัสเมื่อศักยภาพต่ำ
หรือ:
b: = readport ($ 378);
ถ้า ((b หรือ $ fb) = $ ff) แล้ว
// รหัสเมื่อศักยภาพสูง
อื่น
// รหัสเมื่อศักยภาพต่ำ
3. การใช้งานเฉพาะ
ตัวอย่างต่อไปนี้คือความสูงที่อาจเกิดขึ้นของแต่ละบิตของพอร์ตข้อมูล 378H ที่ควบคุมพอร์ตขนาน 8 บิตของพอร์ตข้อมูล: D0 ~ D7 สอดคล้องกับพิน 2 ~ 9 ของอินเทอร์เฟซแบบขนาน
ก่อนอื่นเรียกใช้ Delphi สร้างโครงการใหม่และคลิก F12 เพื่อเพิ่มรหัสของการอ่านและเขียนพอร์ตลงใน Unit1 ของ Form1:
ฟังก์ชั่น readport (พอร์ต: คำ): ไบต์;
ขั้นตอน writeport (พอร์ต: word; conbyte: byte);
ฟังก์ชั่น readport (พอร์ต: คำ): ไบต์;
วาจา
B: ไบต์;
เริ่ม
asm
MOV DX, พอร์ต;
ใน Al, DX;
MOV B, AL;
จบ;
ผลลัพธ์: = B;
จบ;
ขั้นตอน writeport (พอร์ต: word; conbyte: byte);
เริ่ม
asm
MOV DX, พอร์ต;
MOV AL, Conbyte;
DX, AL;
จบ;
จบ;
เพิ่ม 8 ส่วนประกอบของช่องทำเครื่องหมายปรับเปลี่ยนคุณสมบัติคำบรรยายภาพเป็น D0 เป็น D7 ตามลำดับและจัดเรียงให้ตรงไปทางซ้าย
ดับเบิลคลิกที่ช่อง 1 และเพิ่มรหัสโปรแกรมต่อไปนี้ลงในเหตุการณ์ onClick ของส่วนประกอบ CheckBox1:
โพรซีเดอร์ TFORM1.CheckBox1Click (ผู้ส่ง: TOBJECT);
วาจา
B: ไบต์;
เริ่ม
B: = 0;
ถ้าช่องทำเครื่องหมายที่ตรวจสอบแล้ว
B: = B หรือ $ 01;
หากช่องทำเครื่องหมาย
B: = B หรือ $ 02;
ถ้าช่องทำเครื่องหมายที่ตรวจสอบแล้ว
B: = B หรือ $ 04;
หากช่อง concox4 ตรวจสอบแล้ว
B: = B หรือ $ 08;
หากช่อง concox5 ตรวจสอบแล้ว
B: = B หรือ $ 10;
หากช่องทำเครื่องหมายตรวจสอบแล้ว
B: = B หรือ $ 20;
ถ้า checkbox7 ตรวจสอบแล้ว
B: = B หรือ $ 40;
ถ้า checkbox8 ตรวจสอบแล้ว
B: = B หรือ $ 80;
writeport ($ 378, b);
จบ;
หลังจากอินพุตเสร็จสิ้นให้ตั้งค่าเหตุการณ์ OnClick ของ Cuptbox2 เป็น CheckBox8 ส่วนประกอบช่องทำเครื่องหมาย 7 รายการเป็นเหตุการณ์ OnClick ของ CheckBox1: CheckBox1Click
ในเวลานี้รวบรวมและเรียกใช้โปรแกรมคุณสามารถคลิกที่ช่องทำเครื่องหมาย 8 ตัวเหล่านี้เพื่อควบคุมศักยภาพของพอร์ตข้อมูล LPT1 แต่ละบิต
ถัดไปจะมีการเพิ่มฟังก์ชั่นของการตรวจสอบสถานะพอร์ตข้อมูลของพอร์ตขนาน
เพิ่มส่วนประกอบตัวจับเวลาใน Form1: Timer1 แก้ไขคุณสมบัติที่เปิดใช้งานเป็นคุณสมบัติเท็จและช่วงเวลาเป็น 1
เพิ่มเข้าไปในเหตุการณ์ Ontimer ใน Timer1:
ขั้นตอน tform1.timer1timer (ผู้ส่ง: tobject);
วาจา
B: ไบต์;
เริ่ม
b: = readport ($ 378);
ช่องทำเครื่องหมาย 1 ตรวจสอบ: = ((b หรือ $ fe) = $ ff);
CheckBox2.Checked: = ((b หรือ $ fd) = $ ff);
CHECKBOX3.Checked: = ((b หรือ $ fb) = $ ff);
ช่องทำเครื่องหมาย 4 ตรวจสอบ: = ((b หรือ $ f7) = $ ff);
ช่องทำเครื่องหมาย 5.Checked: = ((b หรือ $ ef) = $ ff);
CHECKBOX6.Checked: = ((b หรือ $ df) = $ ff);
COCCBOX7.Checked: = ((b หรือ $ bf) = $ ff);
COCCBOX8.Checked: = ((b หรือ $ 7f) = $ ff);
จบ;
เพิ่มส่วนประกอบช่องทำเครื่องหมายและคุณสมบัติคำบรรยายใต้ภาพที่แก้ไขคือ "ตรวจสอบพอร์ตขนาน" และเพิ่มลงในเหตุการณ์ onClick:
โพรซีเดอร์ TFORM1.CheckBox9Click (ผู้ส่ง: TOBJECT);
เริ่ม
timer1.enabled: = checkbox9 ตรวจสอบ;
จบ;
รวบรวมและเรียกใช้โปรแกรมคลิก "ตรวจสอบพอร์ตขนาน" และคุณสามารถตรวจสอบสถานะของพอร์ตข้อมูลพอร์ต LPT1 แบบขนาน 378H และปรับเปลี่ยนสถานะในเวลาจริง
เพื่ออำนวยความสะดวกในการดูและตรวจสอบสถานะของพอร์ตข้อมูล 378H ฉันได้ทำวงจรทดสอบพอร์ตขนานขนาดเล็กซึ่งใช้อินเทอร์เฟซการพิมพ์ 8 LED (ไดโอดเปล่งแสง) และตัวต้านทาน 8 1K ::
หลังจากแผนภาพวงจรเสร็จสมบูรณ์ให้ติดตั้งบนพอร์ตขนานของคอมพิวเตอร์และเรียกใช้โปรแกรมที่เป็นลายลักษณ์อักษรเพื่อดูศักยภาพของแต่ละบิตของพอร์ตข้อมูล 378H ได้อย่างง่ายดาย
ในที่สุดลองทำการทดลองโคมไฟหมุนอีกครั้ง
ก่อนอื่นประกาศตัวแปรทั่วโลกวัณโรค: เพิ่ม "tb: byte" ด้านล่าง "form1: tform1"::
วาจา
Form1: TFORM1;
TB: ไบต์;
จากนั้นเพิ่มตัวจับเวลาและช่องทำเครื่องหมายใน Form1 แก้ไขคุณสมบัติที่เปิดใช้งานของ Timer2 เป็น False ปรับเปลี่ยนคุณสมบัติช่วงเวลาเป็น 300, ดับเบิลคลิก Timer2 และเพิ่มลงในเหตุการณ์ OnTimer:
ขั้นตอน tform1.timer2timer (ผู้ส่ง: tobject);
วาจา
B: ไบต์;
เริ่ม
ถ้า tb = 0 แล้ว
TB: = 1
อื่น
TB: = TB * 2;
WritePort ($ 378, TB);
b: = readport ($ 378);
ช่องทำเครื่องหมาย 1 ตรวจสอบ: = ((b หรือ $ fe) = $ ff);
CheckBox2.Checked: = ((b หรือ $ fd) = $ ff);
CHECKBOX3.Checked: = ((b หรือ $ fb) = $ ff);
ช่องทำเครื่องหมาย 4 ตรวจสอบ: = ((b หรือ $ f7) = $ ff);
ช่องทำเครื่องหมาย 5.Checked: = ((b หรือ $ ef) = $ ff);
CHECKBOX6.Checked: = ((b หรือ $ df) = $ ff);
COCCBOX7.Checked: = ((b หรือ $ bf) = $ ff);
COCCBOX8.Checked: = ((b หรือ $ 7f) = $ ff);
จบ;
ปรับเปลี่ยนคุณสมบัติคำบรรยายภาพของช่องทำเครื่องหมาย 10 เป็น "การสาธิตการหมุนรอบ" จากนั้นดับเบิลคลิกที่กล่องกาเครื่องหมาย 10 และเพิ่มลงในเหตุการณ์ onclick:
โพรซีเดอร์ TFORM1.CheckBox10Click (ผู้ส่ง: tObject);
เริ่ม
timer2.enabled: = check110 ตรวจสอบ;
จบ;
รวบรวมและเรียกใช้โปรแกรม
คลิกที่ "การสาธิตโคมไฟหมุน" คุณเคยเห็นผลของ "โคมไฟหมุน" หรือไม่? โดยการปรับเปลี่ยนช่วงเวลาของ Timer2 คุณสามารถปรับความเร็วได้
หมายเหตุ: วิธีการด้านบนของการฝังแอสเซมบลีการเข้าถึงพอร์ตคู่ขนานสามารถใช้งานได้ภายใต้ Win9X เท่านั้น
โปรแกรมข้างต้นได้รับการทดสอบและผ่านภายใต้ win98+delphi6.0