การติดต่อกับอินพุตที่เป็น สวิตซ์


      การเชื่อมต่อ Z80 กับอินพุตจะใช้ไอซีบัพเฟอร์ 74LS244 เป็นตัวคั่นกลางระหว่างอุปกรณ์อินพุตกับขาข้อมูล D0-D7 ของZ80 ดังรูป

รูปแสดงการต่รูปแสดงการต่อสวิตซ์กับ Z80 โดยผ่านทางพอร์ตอินพุต 74LS244

      สำหรับการกำหนดหมายเลขพอร์ต กำหนดจากขา A0-A7 โดยใช้วงจรถอดรหัส ด้วยเกทหรือไอซีถอดรหัส ในส่วนของการเขียนโปรแกรมรับข้อมูลจากสวิตซ์จะรับเข้าโดยใช้คำสั่ง IN ซึ่งจะรับข้อมูลเข้ามาทั้ง 8 บิต การตรวจสอบการกดของสวิตซ์อาจใช้คำสั่ง BIT ในการตรวจสอบเฉพาะบิตที่ต้องการหรือใช้บริการกรองข้อมูลคำสั่ง AND ดังตัวอย่างต่อไปนี้
      จากรูปวงจรมีการต่อสวิตซ์เข้าที่ ขา D0,D2,D4 และD7 การตรวจสอบว่าสวิตซ์ที่ต่อร่วมเข้ากับขา D4 ถูกกดหรือไม่ (ถ้าสวิตซ์ถูกกดข้อมูลในบิตนั้นจะเป็น 0) ทำได้โดยใช้คำสั่ง

LOOP: IN A,(00H)  ; รับข้อมูลจากพอร์ต 00H
       BIT 4,A      ; ตรวจสอบบิต 4 ของรีจิสเตอร์ A
       JR Z,S4      ; ถ้าสวิตซ์ S4 ถูกกดให้กระโดดไปทำที่ตำแหน่ง S4
       JR LOOP     ; กลับไปรับข้อมูลใหม่

หรือจะใช้คำสั่งเป็น

LOOP: IN A,(00H) ; รับข้อมูลจากพอร์ต 00H
       AND 10H  ; AND กับ 0001 0000 เพื่อตรวจสอบบิต 4
       JR Z,S4    ; ถ้าสวิตซ์ S4 ถูกกดให้กระโดดไปทำที่ตำแหน่ง S4
       JR LOOP   ; กลับไปรับข้อมูลใหม่

กรณีต้องการตรวจสอบสวิตซ์หลายตัวอาจเขียนโปรแกรมดังนี้
LOOP: IN A,(00H)  ; รับข้อมูลจากพอร์ต 00H
       BIT 0,A     ; ตรวจสอบบิต 0 ของรีจิสเตอร์ A
       CALL Z, S0 ; ถ้า Sw 0 ถูกกดให้ไปทำโปรแกรมย่อย S0
       BIT 2,A     ; ตรวจสอบบิต 2 ของรีจิสเตอร์ A
       CALL Z,S2  ; ถ้า Sw 2 ถูกกดให้ไปทำโปรแกรมย่อย S2
       BIT 4,A     ; ตรวจสอบบิต 4 ของรีจิสเตอร์ A
       CALL Z,S2  ; ถ้า Sw 4 ถูกกดให้ไปทำโปรแกรมย่อย S4
       BIT 7,A     ; ตรวจสอบบิต 2 ของรีจิสเตอร์ A
       CALL Z,S7  ; ถ้า Sw 7 ถูกกดให้ไปทำโปรแกรมย่อย S7
       JR LOOP

      ในการกดสวิตซ์ 1 ครั้ง ความจริงจะมีการกระดอนของหน้าสัมผัสทำให้เกิดการตัดต่อหลายครั้งในช่วงเวลาหนึ่งก่อนจะเข้าสู่สถานะปกติของการกด ดังรูป

รูปแสดงการเกิดบาวนซ์ของสวิตซ์ (Bouncing Switch)

      ถ้านำไปไปใช้ในวงจรนับ เช่นเป็นสวิตซ์แสงหรือ สวิตซ์กระเดื่องเพื่อใช้นการนับจำนวนจะทำให้การนับผิดพลาด เพราะเมื่อมีการกระทำต่อสวิตซ์ 1 ครั้ง จะเกิดพัลซ์หลายพัลซ์ ส่งให้วงจรนับแทนที่จะเป็นเพียงพัลซ์เดียว แก้ไขปัญหาดังกล่าวทำได้โดยหน่วงเวลาในช่วงดังกล่าวออกไป ซึ่งทำได้ 2 วิธี คือ วิธีแก้ไขปัญหาโดยใช้ฮาร์ดแวร์และวิธีแก้ไขปัญหาด้วยซอฟต์ในการแก้ไขปัญหาด้วยฮาร์ดแวร์ทำได้โดยใช้วงจรหน่วงเวลาแบบโมโนสเตเบิลหรือใช้ไอซีชมิกทริกเกอร์ มาต่อคั่นก่อนส่งไปเป็นข้อมูลการนับ สำหรับการแก้ไขปัญหาโดยวิธีทางฮาร์ดแวร์จะดำเนินตามผังดำเนินการหรือโฟล์วชาร์ต (Flow Chart) ดังนี้


      จากโฟล์วชาร์ตจะเห็นว่า เมื่อตรวจสอบแล้วพบว่ามีการกดสวิตซ์ จะยังไม่ดำเนินการทันที แต่จะหน่วงเวลาช่วงหนึ่งประมาณ 1- 10 mA เพื่อให้เลยเวลาช่วงการกระดอนของหน้าสัมผัสสวิตซ์เสียก่อน จากนั้นจึงทำการอ่านข้อมูลจากสวิตซ์เข้ามาอีกครั้งว่ายังอยู่ในสภาวะถูกกดค้างอยู่หรือไม่ ถ้าใช่ก็ดำเนินงานต่อไปได้ แต่ถ้าไม่ใช่ก็จะกลับไปเริ่มตรวจสอบใหม่เหมือนในครั้งแรกอีก ซึ่งสามารถนำมาเขียนเป็นโปรแกรมได้ดังนี้ โดยสมมุติว่าสวิตซ์ต่ออยู่ที่บิต 0

START: IN A,(PORT)  ; รับข้อมูลจากพอร์ต
       BIT 0,A       ; ตรวจสอบบิต 0 ว่าสวิตซ์ถูกกดหรือไม่
       JR NZ, START ; ถ้าสวิตซ์ยังไม่ถูกกดให้ไปเริ่มใหม่ ถ้าถูกกดก็ทำต่อ
       IN A,(PORT)   ; รับข้อมูลจากพอร์ตอีกครั้ง
       BIT 0,A       ; ตรวจสอบบิต 0 ว่าสวิตซ์ยังถูกกดค้างอยู่หรือไม่
       CALL Z, SW  ; ถ้าใช่ก็ให้กระโดดไปทำโปรแกรมย่อยของสวิตซ์
       JR START     ; ถ้าไม่ใช่ก็ให้กลับไปเริ่มใหม่

      ในกรณีการเชื่อมต่อและใช้งานอินพุต – เอาท์พุตพร้อมๆกัน ดังรูป

รูปแสดงการต่อ Z80 เข้ากับพอร์ตอินพุตและเอาท์พุต

      ในการดำเนินงาน ขั้นแรกจะต้องวิเคราะห์ก่อนว่าพอร์ตอินพุตและพอร์ตเอาท์พุตเป็นหมายเลขอะไร ซึ่งพิจารณาจากขาแอดเดรส A0 ถึง A7 ว่ามีการต่ออย่างไร โดยจะเห็นว่าวงจรตาม จะมีการต่อขา A7 ถึง A3 ผ่าน Negative AND Gate (หรือ Positive OR Gate) เข้ามาที่ขาG2A ของไอซี 74LS138 เพื่อเปิดให้ไอซีพร้อมจะทำงาน ดังนั้น ขาทั้งหมดดังกล่าวจะต้องเป็นลอจิก 0 เสมอ วงจรถอดรหัสจึงจะทำงานเมื่อพิจารณาขา A0 ถึง A2 จะเห็นว่ามีการต่อเข้ากับขาอินพุตของไอซี 74LS138 เพื่อถอดรหัส โดยถ้าขา A2 A1 A0เป็น 000 เอาท์พุต Y0 ก็จะแอคทีพไปเปิดพอร์ตเอาท์พุตซึ่งเป็นไอซี 74LS374 เพื่อแสดงผลออก LED และถ้าขา A2 A1 A0 เป็น 001 เอาท์พุต Y1 ก็จะแอดทีพไปเปิดพอร์ตอินพุตซึ่งเป็นไอซีบัพเฟอร์ 74LS244 ในการรับข้อมูลจากสวิตซ์ ดังนั้นการกำหนดหมายเลขพอร์ตอินพุตและพอร์ตเอาท์พุตสามารถกำหนดได้ดังนี้


นั่นคือ พอร์ตอินพุตจะเป็นพอร์ตหมายเลข 00H
และพอร์ตเอาท์พุตจะเป็นพอร์ตหมายเลข 01H

      สำหรับการเขียนโปรแกรมก็ขึ้นอยู่กับเงื่อนไขของการดำเนินการ เช่น อาจกำหนดว่าถ้ากดสวิตซ์ S0 ให้ LED วิ่งวนไปทางซ้ายถ้ากด S1 ให้ LED วิ่งวนไปทางขวา ถ้ากด S2 ให้ LED วิ่งจากขอบด้านนอกเข้ามาตรงกลางหรือถ้ากด S3 ให้ LED วิ่งแยกออกจากกันเป็นต้น ซึ่งโปรแกรมก็จะมีทั้งส่วนของการรับสวิตซ์และส่วนของการแสดงผลซึ่งจะเขียนเป็นโปรแกรมย่อยเพื่อดำเนินการตามเงื่อนไขนั้นๆ