เอวีอาร์. หลักสูตรการฝึกอบรม

29.03.2024

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

เมทริกซ์คีย์บอร์ด
ฉันวาดให้คุณในภาพแรก อย่างที่คุณเห็นมีแถวและคอลัมน์ วงกลมหมายถึงปุ่มต่างๆ เปิดใช้งานเพื่อให้เมื่อคลิกปุ่มปิดแถวในคอลัมน์

พอร์ตการอ่านเปิดอยู่ในโหมดอินพุตแบบดึงขึ้น นั่นคืออินพุตที่มีตัวต้านทานแบบดึงขึ้น หากคอนโทรลเลอร์ไม่รองรับสิ่งนี้ จะต้องแขวนตัวต้านทานเหล่านี้ไว้ด้านนอก

พอร์ตการสแกนทำงานในโหมดเอาต์พุตและเชื่อมต่อกับคอลัมน์ คอลัมน์ต้องเชื่อมต่อกับแหล่งจ่ายไฟด้วยตัวต้านทาน อย่างไรก็ตามหากใช้ Push-Pull เต็มรูปแบบก็ไม่จำเป็นต้องยก - เอาต์พุตจะยกขาขึ้นสู่ระดับที่ต้องการ

มันทำงานดังนี้

ค่าที่ประกอบด้วยศูนย์หนึ่งตัวและอีกหนึ่งตัวบนพินอื่นๆ ทั้งหมดจะถูกส่งออกไปยังพอร์ตการสแกน ตัวอย่างเช่น ให้ศูนย์อยู่ที่ขา A การมีอยู่ของศูนย์จะกดแรงดึงขึ้นลงทันที และทั้งคอลัมน์ก็ตกลงไปที่พื้น

ตอนนี้เราอ่านค่าทั้งหมดจากพอร์ตการอ่านพร้อมกัน หากไม่มีปุ่มใดถูกกดบนคอลัมน์ A ปุ่มทั้งหมดจะอยู่ในพอร์ต แต่ถ้าคุณกดปุ่มใดๆ จากคอลัมน์ A มันจะปิดบรรทัด A ไปที่พินพอร์ตนี้ทันที ในบรรทัด A ขณะนี้เรามี 0 ซึ่งจะเป็นศูนย์ที่เอาต์พุตการสแกนของคอนโทรลเลอร์ ดังนั้นพินพอร์ตที่เกี่ยวข้องจะเป็น 0 ด้วย
ดังนั้นหากกดปุ่มเช่น 6 บรรทัด P1 จะเป็น 0

จากนั้นตัวเลขในพอร์ตการสแกนจะเลื่อนไปทางซ้าย (หรือขวา) หนึ่งบิต จากนั้นคอลัมน์ที่สองจะถูกสแกน ไปเรื่อยๆ เป็นวงกลม เป็นผลให้เมื่อรู้ว่าคอลัมน์ใดที่เรากำลังสแกนโดยได้รับศูนย์บนพอร์ตการอ่านเราจะเข้าใจว่ากดปุ่มใดจากเมทริกซ์

คุณสามารถตรวจจับการกดปุ่มหลายปุ่มพร้อมกันได้ - คุณเพียงแค่ต้องตรวจสอบไม่ใช่แบบไบต์ แต่ต้องตรวจสอบทีละบิต

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

ตัวถอดรหัสนี่คือไมโครวงจรที่ยอมรับรหัสไบนารี่เป็นอินพุตและเอาต์พุตรหัสในหลักที่เลือก เหล่านั้น. ส่งหมายเลข "101" - รับ "1" ที่พินหมายเลข 5 ตัวถอดรหัสผกผันจะมี 0

คุณสามารถไปไกลกว่านี้ได้อีกโดยติดตั้งชิปตัวนับซึ่งส่งพัลส์จากพอร์ต และส่งค่าจากตัวนับผ่านตัวถอดรหัส ดังนั้น คุณสามารถใส่พินได้มากเท่าที่คุณต้องการ ตราบใดที่ความจุของตัวถอดรหัสเพียงพอ สิ่งสำคัญคือการพิจารณาว่าเราจะมีรอบนาฬิกาตัวใดในคอลัมน์ใด

หากมีการสแกนแป้นพิมพ์ปกติที่กดโดยบุคคล คุณจะไม่ต้องกังวลกับความเร็วในการโพลและทำเป็นผลพลอยได้ โดยแขวนไว้บนอินเทอร์รัปต์ด้านซ้าย การสำรวจคีย์บอร์ดอย่างน้อย 10-20 ครั้งต่อวินาทีก็เพียงพอแล้ว แค่นี้ก็เพียงพอแล้วสำหรับการทำงานที่สะดวกสบาย

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

แต่ไมโครคอนโทรลเลอร์ทำงานด้วยความเร็วที่สามารถนับเดือยเหล่านี้เป็นสถานะที่เสถียรได้ ปัญหานี้สามารถแก้ไขได้ในฮาร์ดแวร์ โดยใช้ทริกเกอร์ RS หรือในซอฟต์แวร์ - โดยการสร้างสิ่งเล็กๆ ล่าช้าก่อนที่จะโพลปุ่มถัดไป- เลือกการหน่วงเวลาเพื่อให้เสียงพูดคุยมีเวลาหยุดเมื่อสิ้นสุดการหน่วงเวลา

คุณสมบัติที่โดดเด่น:

  • คีย์บอร์ด 64 คีย์ในรูปแบบเมทริกซ์ 8 x 8
  • ไม่จำเป็นต้องใช้ส่วนประกอบภายนอก
  • ออกจากโหมดสลีปโดยการกดปุ่ม
  • บูรณาการกับแอปพลิเคชันอื่นได้ง่าย
  • การบริโภคต่ำ
  • อัลกอริธึมซอฟต์แวร์ป้องกันการตีกลับ
  • รองรับฟังก์ชั่นปุ่มทางเลือกซึ่งสามารถลบออกได้อย่างง่ายดายเพื่อลดขนาดโปรแกรม
  • รหัสโปรแกรมสามารถใช้ได้กับไมโครคอนโทรลเลอร์ AVR ใด ๆ ที่มีพอร์ตอินพุต / เอาท์พุตอย่างน้อย 17 บรรทัดและมีการขัดจังหวะในการเปลี่ยนสถานะของบรรทัด (ปัจจุบันมีเพียง ATmega162 และ ATmega169 เท่านั้น)
  • โค้ดสามารถแก้ไขได้อย่างง่ายดายเพื่อใช้ในไมโครคอนโทรลเลอร์อื่นๆ ที่ใช้การขัดจังหวะทั่วไป (ดูตัวอย่างการใช้งาน "AVR240: ปุ่มกด 4 x 4 - การปลุกเมื่อกดปุ่ม")

การแนะนำ

ตัวอย่างแอพพลิเคชั่นนี้อธิบายโปรแกรมไดร์เวอร์เมทริกซ์อินเทอร์เฟซคีย์บอร์ด 8 x 8 ตัวอย่างแอพพลิเคชั่นได้รับการออกแบบมาเพื่อใช้ในอุปกรณ์ที่ขับเคลื่อนด้วยตัวเอง ไมโครคอนโทรลเลอร์ AVR ใช้เวลาส่วนใหญ่ในโหมดสลีป โดยเปิดใช้งานเฉพาะเมื่อมีการกดปุ่มบนคีย์บอร์ดเท่านั้น หลังจากนั้นเมทริกซ์ของแป้นพิมพ์จะถูกสแกนข้อมูลจะถูกประมวลผลและกลับสู่โหมดการบริโภคต่ำ

นอกจากนี้ อุปกรณ์ที่อธิบายในตัวอย่างแอปพลิเคชันนี้ยังรองรับฟังก์ชันอื่นที่ผู้ใช้ตั้งโปรแกรมได้ เช่น Caps Lock, Ctrl-, Shift- และ Alt- แอปพลิเคชันทดสอบรองรับเมทริกซ์แป้นพิมพ์ขนาด 4 x 4 โดยแต่ละคีย์แทนตัวเลขหนึ่งตัวและสัญลักษณ์สามตัว ปุ่มสำรองทำให้คุณสามารถเลือกฟังก์ชั่นของปุ่มที่คุณกดได้

รูปที่ 1. ทดสอบแอปพลิเคชัน

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

อุปกรณ์ที่อธิบายไว้ในตัวอย่างแอปพลิเคชันนี้ใช้ไมโครคอนโทรลเลอร์ ATmega162 อย่างไรก็ตาม หลังจากแก้ไขเล็กน้อยแล้ว รหัสโปรแกรมจะสามารถนำมาใช้ในไมโครคอนโทรลเลอร์ ATmega169 ได้

หลักการทำงาน

การเชื่อมต่อของปุ่มเมทริกซ์แป้นพิมพ์ 8 x 8 จะแสดงในรูปที่ 2 เมื่อคุณกดปุ่ม แถวและคอลัมน์ที่เกี่ยวข้องจะเชื่อมต่อกัน เมื่อคุณคลิกที่ปุ่มซ้ายบน คอลัมน์ซ้ายสุดและแถวบนสุดจะถูกปิด


รูปที่ 2 การเชื่อมต่อเมทริกซ์ของแป้นพิมพ์

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

หากจำเป็นต้องซ่อมบำรุงคีย์บอร์ดที่สามารถกดปุ่มพร้อมกันได้ จะไม่สามารถใช้วิธีการที่อธิบายไว้ข้างต้นได้ ในกรณีนี้ จะต้องสแกนบรรทัดแยกกัน ต้องเลือกแถว (ตั้งค่าต่ำ) ตามลำดับ เพื่อล้างสถานะของคอลัมน์ทั้งหมด ซึ่งจะตรวจจับการกดปุ่มทั้งหมด อย่างไรก็ตาม ในกรณีนี้ การเชื่อมต่อระหว่างกันจะปรากฏขึ้น รูปที่ 3 แสดงผลลัพธ์ของการกดสามปุ่ม ซึ่งดูเหมือนว่ามีการกดปุ่มที่มีเครื่องหมาย X อยู่ด้วย ซึ่งส่งผลให้เกิดข้อผิดพลาดในการถอดรหัส


รูปที่ 3 การถอดรหัสที่ผิดพลาดเมื่อกดปุ่มพร้อมกัน

ในการตรวจจับการกดปุ่มและปลุกจากโหมดสลีป จะใช้การขัดจังหวะการเปลี่ยนพินที่มีอยู่บนไมโครคอนโทรลเลอร์ AVR ที่ใช้ ก่อนที่จะเข้าสู่โหมดสลีป หมุดแถวทั้งหมดจะถูกตั้งค่าไว้ต่ำ ซึ่งทำให้สัญญาณต่ำปรากฏขึ้นที่อินพุตคอลัมน์เมื่อกดปุ่ม ซึ่งจะส่งผลให้เกิดการขัดจังหวะ

เมื่อใช้การขัดจังหวะการเปลี่ยนแปลงอินพุต จะมีบริการเพียงคลิกเดียวเท่านั้น ในกรณีนี้ จะไม่สร้างการกดซ้ำอัตโนมัติเมื่อกดปุ่มค้างไว้ การจำลองการกดซ้ำควรทำโดยรูทีนย่อยที่แยกจากกัน

ปุ่มทางเลือก

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

ปุ่มสำรองจะถูกนำมาพิจารณาเมื่อมีการกดปุ่มหลักเท่านั้น ในกรณีนี้ ปุ่มทางเลือกจะเรียกว่า "one-shot"

นอกจากนี้ยังสามารถใช้ปุ่ม "ทริกเกอร์" ซึ่งเมื่อกดครั้งแรกจะเปิดใช้งานฟังก์ชันทางเลือก และเมื่อกดอีกครั้งจะปิดใช้งานฟังก์ชันเหล่านั้น ในกรณีนี้ จะมีการใช้ฟังก์ชันทางเลือกสำหรับปุ่มที่กดในภายหลังทั้งหมด ปุ่ม Caps Lock บนแป้นพิมพ์คอมพิวเตอร์มาตรฐานมีฟังก์ชันเหล่านี้ ตัวอย่างการใช้งานนี้ใช้ทั้งปุ่มช็อตเดียวและปุ่มทริกเกอร์

การใช้หลักการเรียงลำดับแทนการกดปุ่มพร้อมกันจะช่วยหลีกเลี่ยงปัญหาที่เกี่ยวข้องกับการถอดรหัสที่ผิดพลาด หากมีการกดปุ่มหลายปุ่มพร้อมกัน แอปพลิเคชันจะเพิกเฉยต่อปุ่มนั้น

ติดต่อเด้ง

รูปที่ 4 แสดงการเด้งของหน้าสัมผัสเมื่อกดปุ่ม อย่างที่คุณเห็น มีการจำลองการคลิกหลายครั้ง เพื่อหลีกเลี่ยงการถอดรหัสที่ไม่ถูกต้อง รหัสสแกนจะถูกอ่านเป็นระยะเวลาหนึ่งหลังจากที่เกิดการเปลี่ยนแปลงสถานะขัดจังหวะ นอกจากนี้ อัลกอริธึมนี้เรียกว่าการป้องกันการตีกลับยังช่วยให้คุณหลีกเลี่ยงการเตือนที่ผิดพลาดเมื่อสัมผัสกับเสียงรบกวน การดีเด้งหน้าสัมผัสสามารถทำได้โดยใช้ฮาร์ดแวร์หรือตัวกรองดิจิทัล แต่วิธีการที่ใช้ในตัวอย่างการใช้งานนี้มีราคาถูกที่สุด


รูปที่ 4 ติดต่อตีกลับ

การนำไปปฏิบัติ

การใช้งานนี้ใช้ไมโครคอนโทรลเลอร์ ATmega162 คำแนะนำสำหรับการอัพเกรดเป็นไมโครคอนโทรลเลอร์ ATmega169 แสดงอยู่ท้ายเอกสารนี้

แป้นพิมพ์เชื่อมต่อกับพอร์ต 8 บิตสองพอร์ตของไมโครคอนโทรลเลอร์ AVR พอร์ตหนึ่งพอร์ต (พอร์ต D) ได้รับการกำหนดค่าให้ใช้งานทุกบรรทัดเป็นเอาต์พุตและเชื่อมต่อกับแถวของเมทริกซ์แป้นพิมพ์ พอร์ตอื่น (พอร์ต C) ได้รับการกำหนดค่าให้ใช้งานทุกบรรทัดเป็นอินพุตและเชื่อมต่อกับคอลัมน์ของเมทริกซ์แป้นพิมพ์ ซึ่งสามารถดูรายละเอียดเพิ่มเติมได้ในรูปที่ 2 เมื่อสแกนเมทริกซ์ของแป้นพิมพ์ พอร์ตที่ใช้เป็นเอาต์พุตจะต้องคงเอาต์พุตไว้ต่ำ และพอร์ตที่ใช้เป็นอินพุตจะต้องมีตัวต้านทานแบบดึงขึ้นกำลังในตัว

อุปกรณ์ที่อธิบายไว้ใช้บรรทัดแรกของพอร์ต E เพื่อสร้างรหัสซีเรียลที่สอดคล้องกับรหัสของปุ่มกด ข้อมูลจะถูกส่งโดยใช้ UART ในตัว การใช้งานตามที่อธิบายไว้ในตัวอย่างแอปพลิเคชัน AVR306

เมื่อกดตามปกติรหัสสแกนจะถูกสร้างขึ้นโดยค่าจะอยู่ในช่วงตั้งแต่ 0 ถึง 63 (8 แถว * 8 คอลัมน์) การกดปุ่มเพื่อเรียกใช้ฟังก์ชันทางเลือกจะสร้างโค้ดสแกนปกติด้วย แต่จะมีการตั้งค่าแฟล็กที่สอดคล้องกันของฟังก์ชันทางเลือกด้วย ค่าสถานะเหล่านี้ถูกเก็บไว้ในตัวแปรส่วนกลาง

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

ตัวแปรส่วนกลางอื่นใช้เพื่อส่งรหัสสแกนพร้อมกับแฟล็กไปยังแอปพลิเคชัน หกบิตที่มีนัยสำคัญน้อยที่สุดใช้ในการส่งรหัส (ตั้งแต่ 0 ถึง 63) และบิตที่สำคัญที่สุด (MSB) บ่งชี้ถึงการเปลี่ยนแปลงในสถานะ ไดรเวอร์แป้นพิมพ์จะตั้งค่าบิตนี้เมื่อกดปุ่ม แอปพลิเคชันสำรวจบิตนี้และรีเซ็ตหลังจากอ่านโค้ดสแกนแล้ว ไบต์สากลและคำสแกนแสดงในรูปที่ 5


รูปที่ 5 รหัสสแกนขั้นสูง

โปรแกรมไดรเวอร์แป้นพิมพ์ถูกนำมาใช้เป็นโปรแกรมตัวจัดการการขัดจังหวะ โปรแกรมหลักทำให้ไมโครโปรเซสเซอร์เข้าสู่โหมดสลีป เมื่อกดปุ่ม ไดรเวอร์แป้นพิมพ์จะปลุกไมโครคอนโทรลเลอร์ AVR รับโค้ดสแกนและอัปเดตไบต์ทั่วโลก หลังจากใช้งานฟังก์ชั่นของปุ่มกดแล้วโปรแกรมหลักจะทำให้ไมโครคอนโทรลเลอร์เข้าสู่โหมดสลีปอีกครั้ง

โมดูลการเริ่มต้นและโปรแกรมหลัก

รูปที่ 6 แสดงโมดูลการเริ่มต้นและโปรแกรมหลัก การรีเซ็ตแฟล็กของฟังก์ชันทางเลือกและตัวแปรโกลบอล ตลอดจนการเริ่มต้นพอร์ตมีอธิบายไว้ข้างต้น หากไม่จำเป็นต้องประมวลผล ระบบจะเลือกโหมดสลีปว่าง


รูปที่ 6 โมดูลการเริ่มต้นและโปรแกรมหลัก

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

รูปที่ 7 บล็อกไดอะแกรมของโมดูลซอฟต์แวร์หลักของตัวถอดรหัสคีย์บอร์ด

การสแกนแป้นพิมพ์ (การประมวลผลการกดปุ่ม) รูปที่ 8 แสดงบล็อกไดอะแกรมของขั้นตอนการสแกนแป้นพิมพ์ ขั้นแรก ผลลัพธ์จะถูกสแกนทีละคอลัมน์ รหัสสแกน (คอลัมน์) ที่มีนัยสำคัญน้อยที่สุดสามบิตจะเพิ่มขึ้นจนกระทั่งพบระดับต่ำบนบรรทัดคอลัมน์ หลังจากนั้น ทิศทางของเส้นพอร์ตจะกลับด้าน และทำการสแกนซ้ำ ในกรณีนี้ จะทำการค้นหาระดับต่ำบนบรรทัดแถว หลังจากนั้น รูทีนย่อยการประมวลผลโค้ดสแกนจะถูกเรียก


รูปที่ 8 บล็อกไดอะแกรมของขั้นตอนการสแกนแป้นพิมพ์

ขั้นแรก ฟังก์ชันการประมวลผลโค้ดสแกนจะคัดลอกโค้ดสแกนที่สร้างขึ้นไปยังตัวแปรร่วม หลังจากนั้น รหัสสแกนจะถูกเปรียบเทียบกับรหัสของปุ่มของฟังก์ชันทางเลือก และสร้างแฟล็กที่สอดคล้องกันของฟังก์ชันทางเลือก ค่าสถานะเหล่านี้ถูกคัดลอกไปยังตัวแปรส่วนกลาง หากปุ่มที่กดไม่ใช่ปุ่มทางเลือก ธงของฟังก์ชันทางเลือกแบบช็อตเดียวทั้งหมดจะถูกรีเซ็ต ในที่สุดก็มีการตั้งค่าสถานะใหม่ บล็อกไดอะแกรมของฟังก์ชันนี้แสดงในรูปที่ 9


รูปที่ 9 บล็อกไดอะแกรมของฟังก์ชันการประมวลผลโค้ดสแกน

กรณีทดสอบแอปพลิเคชัน myCellPhone

มีกรณีทดสอบที่ใช้เมทริกซ์แป้นพิมพ์ที่มีลักษณะคล้ายกับแป้นพิมพ์โทรศัพท์มือถือ อักขระตัวสุดท้ายในนั้นจะถูกส่งผ่านอินเทอร์เฟซ USART เมื่อใช้เมทริกซ์แป้นพิมพ์ขนาด 4 x 4 คุณสามารถสร้างตัวเลขและสัญลักษณ์ทั้งหมดที่สามารถระบุได้โดยใช้ปุ่มฟังก์ชันทางเลือกเพิ่มเติมอีกสี่ปุ่ม ใช้ปุ่มสามปุ่มเพื่อเลือกฟังก์ชันสำรองสำหรับปุ่มหลักแต่ละปุ่ม และปุ่มที่สี่ทำหน้าที่เป็นปุ่ม Caps Lock (สลับระหว่างตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก)

ตารางการแปลงใช้ในการแปลงรหัสสแกนเป็นชุดรหัสที่สอดคล้องกับรหัสของปุ่มกด โดยคำนึงถึงปุ่มของฟังก์ชันทางเลือก โค้ดสแกนยังสามารถใช้เพื่อสแกนเมทริกซ์แป้นพิมพ์ขนาด 8 x 8 ได้ ดังนั้น ตารางจะมี 8 รายการต่อแถว ในขณะที่ใช้เพียง 4 ปุ่มต่อแถว ดังนั้นหากจำนวนคอลัมน์ของเมทริกซ์คีย์บอร์ดเพิ่มขึ้น ขนาดของโปรแกรมจะไม่เปลี่ยนแปลง

ขนาดและระยะเวลาของรหัสแอปพลิเคชัน

ขนาดโค้ดของรูทีนย่อยสำหรับฟังก์ชันการประมวลผลเมทริกซ์คีย์บอร์ดต่างๆ มีระบุไว้ในตารางที่ 1

ตารางที่ 1. ขนาดของโค้ดรูทีนย่อยสำหรับฟังก์ชันการประมวลผลเมทริกซ์คีย์บอร์ดต่างๆ

ตารางที่ 2 แสดงระยะเวลาของการกระทำต่าง ๆ ที่ทำโดยไมโครคอนโทรลเลอร์ ATmega162 ที่ทำงานที่ความถี่ 8 MHz ต่อไปนี้เป็นลำดับการดำเนินการตั้งแต่ปลุกเมื่อตรวจพบการกดปุ่มเพื่อเข้าสู่โหมดสลีปหลังจากประมวลผลปุ่มกด

ตารางที่ 2. ระยะเวลาของลำดับการกระทำที่ดำเนินการ

หากคุณไม่คำนึงถึงโหมดสลีปปิดเครื่อง คุณจะเห็นว่าส่วนใหญ่ไมโครคอนโทรลเลอร์ทำงานในโหมดสลีปไม่ได้ใช้งาน ไมโครคอนโทรลเลอร์อยู่ในโหมดแอคทีฟเพียง 0.3 มิลลิวินาที ซึ่งคิดเป็นประมาณ 0.5% ของเวลาทั้งหมด เวลาสัมพัทธ์ที่ใช้ในโหมดการทำงานต่างๆ แสดงไว้ในตารางที่ 3

ตารางที่ 3. ปริมาณการใช้และเวลาสัมพัทธ์ที่ใช้โดยไมโครคอนโทรลเลอร์ในโหมดการทำงานต่างๆ

หากเราสมมติว่ามีการกดปุ่มทุกๆ 10 นาที ปริมาณการใช้โดยเฉลี่ยจะอยู่ที่ 2 µA เท่านั้น

การอภิปรายเกี่ยวกับการใช้ไมโครคอนโทรลเลอร์อื่นๆ

ข้อแตกต่างเพียงอย่างเดียวเมื่อใช้ไมโครคอนโทรลเลอร์ ATmega162 และ ATmega169 คือต้องใช้พอร์ตที่แตกต่างกันเพื่อเชื่อมต่อเมทริกซ์ของแป้นพิมพ์ ATmega162 ใช้พอร์ต C ในขณะที่ ATmega169 ต้องใช้พอร์ต E เนื่องจากพอร์ตที่ต่างกันมีการขัดจังหวะสถานะบรรทัด ATmega162 มีฟังก์ชันสร้างการขัดจังหวะเมื่อสถานะของบรรทัดพอร์ต C เปลี่ยนแปลง และ ATmega169 - เมื่อสถานะของบรรทัดพอร์ต E เปลี่ยนแปลง หากคุณต้องการใช้ฟังก์ชันทางเลือกอื่นของพอร์ตเหล่านี้ คุณจะต้องแก้ไขแอปพลิเคชันในลักษณะดังกล่าว วิธีใช้พอร์ตอื่นที่มีฟังก์ชันการสร้างเพื่อเชื่อมต่อการขัดจังหวะเมทริกซ์ของแป้นพิมพ์สำหรับการเปลี่ยนแปลงสถานะของสาย

โปรดทราบว่า ATmega169 ใช้การลงทะเบียน SMCR เพื่อเปิดใช้งานโหมดสลีป

หากใช้ไมโครคอนโทรลเลอร์อื่นๆ จำเป็นต้องมีส่วนประกอบภายนอกเพิ่มเติมและการเปลี่ยนแปลงการขัดจังหวะที่ใช้ การใช้ไมโครคอนโทรลเลอร์ดังกล่าวในการประมวลผลเมทริกซ์แป้นพิมพ์ 4x4 ได้อธิบายไว้ในตัวอย่างแอปพลิเคชัน AVR240 ไม่จำเป็นต้องเปลี่ยนฟังก์ชันที่เหลือของตัวอย่างการใช้งานที่อธิบายไว้

บ่อยครั้งที่พินไมโครคอนโทรลเลอร์ฟรีไม่เพียงพอที่จะเชื่อมต่อปุ่มตามจำนวนที่ต้องการ เมื่อเชื่อมต่อโดยตรงด้วยปุ่ม n คุณจะต้องจัดสรรบรรทัดอินพุต/เอาต์พุตให้เท่ากัน ซึ่งไม่สามารถทำได้เสมอไป เพื่อการใช้เส้นพอร์ตอย่างมีเหตุผลมากขึ้น คุณสามารถใช้ไดอะแกรมการเชื่อมต่อเมทริกซ์ในรูปที่ 1 ในกรณีนี้ เมทริกซ์ที่เชื่อมต่อกับพอร์ต D มีขนาด 4 * 4 = 16 ปุ่ม (4 แถว r0...r3 และ 4 คอลัมน์ c0...c3) เส้น PD0...PD3 ซึ่งเป็นเส้น r0...r3 จะได้รับการกำหนดค่าสำหรับอินพุตเสมอ และจะถูกดึงขึ้นไปที่พาวเวอร์บัสโดยตัวต้านทาน R (ค่าโดยทั่วไป 4.7...10 kOhm) จากนั้นจะอ่านสถานะของปุ่ม SB1-SB16 สัญญาณศูนย์โลจิคัลจะถูกสร้างขึ้นสลับกันบนบรรทัด PD4…PD7 (คอลัมน์ c0…c3) ในตอนแรก ระดับต่ำจะถูกตั้งค่าไว้ที่คอลัมน์ c0 และในคอลัมน์อื่นๆ ทั้งหมด สถานะ Z จะถูกตั้งค่าไว้ ตอนนี้เฉพาะเมื่อกดปุ่มของคอลัมน์นี้ (SB1...SB4) ระดับลอจิกต่ำอาจเกิดขึ้นบนบรรทัดแถว r0...r3 ถัดไป โลจิคัล 0 ถูกตั้งค่าในคอลัมน์ c1 และกลุ่มของปุ่ม SB5...SB8 ฯลฯ จะถูกสแกน อัลกอริธึมการโพลปุ่มเดียวกันนี้ใช้สำหรับแป้นพิมพ์เมทริกซ์อื่นๆ โดยไม่คำนึงถึงจำนวนแถวและคอลัมน์ โดยทั่วไป จำนวนปุ่ม n คือผลคูณของจำนวนแถวและคอลัมน์ ตัวอย่างเช่น เมทริกซ์ 2*2 (4 เส้น) จะมี 4 ปุ่ม แต่ในทางกลับกัน จำเป็นต้องใช้เส้น I/O จำนวนเท่ากันเพื่อเชื่อมต่อปุ่มจำนวนเท่ากันโดยตรง ดังนั้น การประหยัดเอาต์พุตจะเริ่มปรากฏขึ้นเมื่อจำนวนปุ่มเกิน 4...6 และจะมีความสำคัญมากยิ่งขึ้นเมื่อจำนวนปุ่มเพิ่มขึ้น

รูปที่ 1 แผนภาพเมทริกซ์สำหรับการเชื่อมต่อปุ่ม

องค์ประกอบ VD1...VD4 และ R1...R4 เป็นทางเลือกในแผนภาพ ไดโอดทำหน้าที่ป้องกันการลัดวงจรระหว่างเส้นแถวและคอลัมน์ ตัวอย่างเช่นหากเมื่อคุณกดปุ่ม SB1 (ในขณะที่สแกนคอลัมน์ c0) จู่ๆ บรรทัดแถว r0 จะถูกกำหนดค่าสำหรับเอาต์พุตและมีระดับลอจิคัลสูงอยู่ กระแสไฟฟ้าขนาดใหญ่ที่ยอมรับไม่ได้จะเริ่มขึ้น ให้ไหลผ่านวงจร c0r0 แม้ว่าลอจิกของโปรแกรมจะไม่อนุญาตให้มีโหมดการทำงานนี้ แต่ด้วยเหตุผลหลายประการก็ยังคงสามารถเกิดขึ้นได้ ดังนั้นอย่างน้อยที่สุดเมื่อทำการดีบั๊กโปรแกรมไดโอดจะไม่ฟุ่มเฟือย หากความจุในการติดตั้งที่อ้างถึงพิน PD3...PD0 ไม่ใหญ่เกินไป ความต้านทานแบบดึงขึ้นของพาวเวอร์บัสจะถูกแทนที่ด้วยตัวต้านทานแบบ "ดึงขึ้น" ภายใน เมื่อต้องการทำเช่นนี้ คุณต้องตั้งค่าบิตที่เหมาะสมในรีจิสเตอร์ PORTD เมื่อมีการกำหนดค่าบรรทัดสำหรับอินพุต

ตัวอย่างขั้นตอนการสแกนแป้นพิมพ์เมทริกซ์

ปุ่ม Def = R16 ; ลงทะเบียนด้วยรหัสของปุ่มที่กด def temp = R17 ; ลงทะเบียนสำหรับการดำเนินการระดับกลาง ldi temp, สูง (RAMEND) ; การเริ่มต้นสแต็กออก SPH, อุณหภูมิ ldi temp, ต่ำ (RAMEND) ออก SPL, อุณหภูมิ clr temp ; กำหนดค่าพอร์ต D บรรทัดเพื่ออินพุต DDRD, temp ldi temp, (1<< PD0)|(1 << PD1)|(1 << PD2)|(1 << PD3) out PORTD,temp . rcall btn_pol . ; Подпрограмма опроса матричной клавиатуры; R16 – номер нажатой кнопки на выходе из подпрограммы, ; если ни одна кнопка не нажата, то R16=0; ; если нажаты две и более кнопок, то R16=0xFF ; R17 – регистр для определения номера строки; R18 – регистр для задания номера столбца; R19 – счётчик столбцов; R20 – регистр для промежуточных операций btn_pol: clr R16 ;обнуляем регистры с кодом нажатой clr R19 ;кнопки и номером столбца ldi R18,0x0F ;очищаем регистр данных PORTD порта D out PORTD,R18 ldi R18,0x00010000 bp1: out DDRD,R18 ;настраиваем на вывод линию соответствующего nop ;столбца через регистр DDRD порта D in R17,PIND ;считываем состояние строк из регистра PIND com R17 andi R17,0x0F ;выделяем значение 4-х строк ldi R20,0 ;если ни одна кнопка в столбце не нажата, breq bp5 ;перемещаемся на следующий столбец cpi R17,0x01 ;если нажата кнопка в строке c0, ldi R20,1 ;то вычисляем её номер breq bp2 cpi R17,0x02 ;если нажата кнопка в строке c1, ldi R20,2 ;то вычисляем её номер breq bp2 cpi R17,0x04 ;если нажата кнопка в строке c2, ldi R20,3 ;то вычисляем её номер breq bp2 cpi R17,0x08 ;если нажата кнопка в строке c3, ldi R20,4 ;то вычисляем её номер brne bp3 ;если нажато более одной кнопки, завершаем опрос bp2: tst R16 ;если в предыдущих столбцах были нажаты breq bp4 bp3: ldi R16,0xFF ;кнопки, то завершаем опрос с кодом 0xFF ret bp4: push R19 ;иначе вычисляем номер кнопки, как lsl R19 ;N = 4*column + row + 1 = 4*R19 + R20 + 1 lsl R19 add R20,R19 mov R16,R20 pop R19 bp5: inc R19 lsl R18 cpi R19,4 ;повторяем цикл опроса пока не будут brne bp1 ;опрошены все 4 столбца ret

ด้วยข้อดีทั้งหมด รูปแบบการเชื่อมต่อเมทริกซ์ก็มีข้อเสียเปรียบเช่นกัน ด้วยความช่วยเหลือนี้ ทำให้เป็นการยากที่จะนำการรวมปุ่มการอ่านไปใช้ หากมีการกดปุ่มสามปุ่มใด ๆ ที่สร้างมุมฉากซึ่งกันและกัน (เช่น SB1, SB2, SB5) บนแป้นพิมพ์ดังกล่าว โปรแกรมโพลจะบันทึกการกดปุ่มผิด ๆ ที่วางอยู่ที่มุมว่างของสี่เหลี่ยม (ใน กรณีนี้ SB6) ในบางสถานการณ์ ปุ่ม "phantom" ดังกล่าวอาจเป็นปุ่มใดก็ได้บนแป้นพิมพ์

รายชื่อธาตุกัมมันตภาพรังสี

การกำหนด พิมพ์ นิกาย ปริมาณ บันทึกร้านค้าสมุดบันทึกของฉัน
ดีดี1 MK AVR 8 บิต

เอทีเมก้า8

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

ตลอดหลายทศวรรษที่ผ่านมา อุปกรณ์อิเล็กทรอนิกส์ได้พัฒนาแนวทางปฏิบัติโดยใช้เทคนิคต่างๆ เพื่อขยายขีดความสามารถในการสื่อสารในตัวของโปรเซสเซอร์และตัวควบคุมโดยไม่ได้ตั้งใจ หนึ่งในวิธีการเหล่านี้ซึ่งเหมาะอย่างยิ่งสำหรับหน้าสัมผัสทางกล (ปุ่ม) คือการสร้างเมทริกซ์ การทำความเข้าใจวิธีการทำงานต้องใช้ความรู้พื้นฐานบางประการ ก่อนที่เราจะดำเนินการต่อไป โปรดทำความเข้าใจกฎของโอห์มก่อน

ทฤษฎีเล็กน้อย

เพื่อทำความเข้าใจวิธีการทำงานของอุปกรณ์อิเล็กทรอนิกส์ดิจิทัล คุณต้องเข้าใจหลักการพื้นฐานสองประการ

หลักการที่หนึ่งระบุว่ากระบวนการสื่อสารภายในวงจรไม่ได้เกี่ยวกับการส่งหรือรับบางสิ่งบางอย่างในวงจรนั้น หากต้องการเปิดใช้งานการสื่อสารระหว่างอุปกรณ์ทั้งสอง คุณเพียงเชื่อมต่อเทอร์มินัลกับวัสดุที่เป็นสื่อกระแสไฟฟ้า หลังจากนี้ สันนิษฐานว่าสถานะของวัสดุ (แรงดันและกระแส) ที่ปลายทั้งสองจะเท่ากัน ในความเป็นจริง แน่นอนว่าไม่เป็นเช่นนั้น แต่สำหรับการสื่อสารที่ช้าและตัวนำไฟฟ้าสั้น สมมติฐานของเราทำงานได้อย่างสมบูรณ์แบบ ปรากฎว่าการส่งและรับข้อมูลเป็นการแชร์ข้อมูลจริงๆ

ในด้านเครื่องส่งสัญญาณ คุณเพียงแค่เปลี่ยนสถานะทางไฟฟ้าของตัวนำ (โดยการให้กระแสตรงเข้าไปที่ตัวตัวนำ และเปลี่ยนศักย์ไฟฟ้า) โดยหวังว่าผู้รับจะสามารถตรวจจับการเปลี่ยนแปลงนี้และเข้าใจได้อย่างถูกต้อง

จากหลักการนี้ยังเป็นไปตามที่ว่าไม่มีความสัมพันธ์ระหว่างทิศทางการสื่อสารกับทิศทางของกระแสไฟฟ้าหลายๆ คนเข้าใจผิดคิดว่าตรงกันข้าม และทำให้พวกเขาไม่เข้าใจวิธีการทำงานของอุปกรณ์อิเล็กทรอนิกส์

หากคุณต้องการส่งระดับลอจิกเป็น "0" โดยปกติแล้วเพื่อจุดประสงค์นี้แรงดันไฟฟ้าที่เอาต์พุตของเครื่องส่งสัญญาณจะลดลงเหลือ 0 V และกระแสเริ่มไหลจากเครื่องรับไปยังเครื่องส่งสัญญาณเพื่อให้เครื่องรับสามารถระบุได้ว่า ระดับตรรกะสอดคล้องกับ "0" (ในขณะที่ทิศทางย้อนกลับของกระแสจะหมายความว่ามีศักยภาพเชิงลบอยู่ที่ไหนสักแห่งในวงจร - และตามกฎแล้วจะไม่เกิดขึ้นในอุปกรณ์อิเล็กทรอนิกส์ดิจิทัล) ในทางกลับกัน ในการส่งสัญญาณระดับลอจิก "1" a มีการใช้แรงดันไฟฟ้าเท่ากับแรงดันไฟฟ้าและเนื่องจากส่วนใหญ่มักเป็นแรงดันไฟฟ้าสูงสุดในวงจร กระแสไฟฟ้าจึงไม่มีทางเลือกอื่นนอกจากไหลจากเครื่องส่งไปยังเครื่องรับ

หลักการข้อที่สองคือมันเป็นไปไม่ได้ที่จะระบุสถานะของตัวนำโดยไม่เปลี่ยนสถานะนี้ ไม่สำคัญว่าคุณจะวัดแรงดันไฟฟ้าหรือกระแสไฟฟ้า แต่อิเล็กตรอนจะต้องไหลผ่านมิเตอร์ การไหลของอิเล็กตรอนนั้นเป็นกระแสไฟฟ้า และเนื่องจากมันไหล หมายความว่าในโหนดที่คุณเชื่อมต่อเพื่อการวัด กระแสและแรงดันไฟฟ้าได้เปลี่ยนไปแล้ว (ดูกฎของ Kirchhoff) ตามมาว่าหากคุณต้องการ "ส่งข้อมูล" โดยการเปลี่ยนสถานะของพินที่เชื่อมต่อทางไฟฟ้าเป็นพินอื่น จะต้องรักษาสถานะนี้ไว้ และดังนั้นจึงปฏิบัติตามข้อกำหนดทั้งหมดที่กำหนดโดยผู้รับ

ปุ่ม

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

เราจะเชื่อมต่อปุ่มกับอินพุตไมโครคอนโทรลเลอร์ได้อย่างไร? โดยพื้นฐานแล้ว อินพุตใดๆ สามารถทำงานได้ด้วยระดับตรรกะที่เป็นไปได้สองระดับ: “0” และ “1” แนวทางปฏิบัติทั่วไปคือให้แรงดันไฟฟ้าใกล้กับ 0 V เป็นศูนย์โลจิคัล และแรงดันไฟฟ้าใกล้กับแรงดันไฟฟ้าของแหล่งจ่าย (ปกติคือ 5 V หรือ 3.3 V) เป็นศูนย์โลจิคัล แต่ปัญหาคือปุ่มกลไกนั้นไม่สามารถควบคุมแรงดันไฟฟ้าได้ มันควบคุมกระแส - นั่นคือถ้าเราเชื่อมต่อสองโหนดที่มีศักย์ไฟฟ้าต่างกันผ่านปุ่ม กระแสไฟฟ้าจะไหลระหว่างโหนดเหล่านี้หากกดปุ่มเท่านั้น

แต่ถ้าเราเพิ่มตัวต้านทานเข้าไป เราก็สามารถแปลงกระแสเป็นแรงดันได้อย่างง่ายดาย

ปุ่มดึงขึ้น

ลองดูแผนภาพนี้ เมื่อไม่ได้กดปุ่ม (วงจรเปิดอยู่) จะไม่มีกระแสไฟฟ้าไหลผ่าน ดังนั้น แรงดันไฟฟ้าที่โหนด “A” จะใกล้เคียงกับแรงดันไฟฟ้าจ่าย VCC (อันที่จริงน้อยกว่า VCC ด้วยจำนวนแรงดันไฟฟ้าตกคร่อม ตัวต้านทานเท่ากับ R I) เมื่อกดปุ่ม (วงจรปิด) กระแสจะไหลผ่านตัวต้านทานลงกราวด์ เมื่อคำนึงถึงความจริงที่ว่าความต้านทานของปุ่มปิดนั้นน้อยมาก (ตามลำดับหลายร้อยมิลลิโอห์ม) แรงดันไฟฟ้าในโหนด "A" จะใกล้กับ "0"

ในการกำหนดค่านี้ ตัวต้านทานเรียกว่าพูลอัพเนื่องจากจะ "ดึงแรงดันไฟฟ้าขึ้น" ไปที่ระดับ VCC และหากไม่มีการเชื่อมต่อแหล่งจ่ายไฟผ่านตัวต้านทานก็จะไม่มีแรงดันไฟฟ้าในโหนด "A" เลย (ในกรณีนี้เอาต์พุตของไมโครวงจรเรียกว่า "แขวนอยู่ในอากาศ" หรืออยู่ในสถานะอิมพีแดนซ์สูง) .

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

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

หลักการเมทริกซ์

หลักการพื้นฐานของเมทริกซ์แป้นพิมพ์คือความสามารถในการเชื่อมต่อปุ่มมากกว่าหนึ่งปุ่มเข้ากับอินพุตไมโครคอนโทรลเลอร์หนึ่งตัว

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


หลายปุ่มหนึ่งอินพุต (โหนด “A”)

"A" เป็นอินพุตเดียวของไมโครคอนโทรลเลอร์ และ "C1"..."Cn" เป็นเอาต์พุต เอาต์พุตตัวใดตัวหนึ่งถูกตั้งค่าเป็นโลจิคัล "0" นั่นคือภายในวงจรไมโครหน้าสัมผัสนี้เชื่อมต่อกับกราวด์ดังนั้นกระแสจะไหลไปที่หน้าสัมผัสนี้เสมอ (ตามหลักการพื้นฐานแรก) ตอนนี้ เมื่อกดปุ่มที่เชื่อมต่อกับเอาต์พุตนี้แล้ว อินพุต "A" จะถูก "กด" ลงกราวด์ผ่านอินพุตนั้นทันที และจะถูกตั้งค่าเป็น "0" การกดปุ่มอื่นๆ จะไม่เปลี่ยนแปลงอะไร เนื่องจากหมุดกราวด์ไม่ได้เชื่อมต่ออยู่ที่ใดในขณะนี้ เมื่อเราต้องการสำรวจปุ่มถัดไป เราจะลบตรรกะ “0” ออกจากเอาต์พุตปัจจุบันและตั้งค่าระดับนี้เป็นเอาต์พุตถัดไป เพื่อให้สามารถใช้เอาต์พุตไมโครคอนโทรลเลอร์เพียงตัวเดียวได้ตลอดเวลา

การกำหนดค่านี้ (โดยที่เอาต์พุตเชื่อมต่อกับกราวด์หรือตัดการเชื่อมต่อโดยสิ้นเชิง) เรียกว่าเอาต์พุต open Drain (OC) (ในอดีต - open collector (OC)) ที่นี่ฉันได้ทำให้ง่ายขึ้น - อันที่จริงไม่สามารถตัดการเชื่อมต่อจากวงจรได้อย่างสมบูรณ์เว้นแต่จะถูกตัดออกจากร่างกาย แต่สำหรับ Digital I/O แบบธรรมดา การลดความซับซ้อนนี้ค่อนข้างเหมาะสม ไมโครคอนโทรลเลอร์ส่วนใหญ่มีความสามารถในการกำหนดค่าพินเอาท์พุตโดยทางโปรแกรมเพื่อให้ทำงานในโหมดระบบปฏิบัติการ แต่ถ้าเราไม่มีตัวเลือกนี้ล่ะ? มีการกำหนดค่าอื่น - โหมดกดดึง; วันนี้ตัวเลือกนี้เป็นหนึ่งในตัวเลือกที่ได้รับความนิยมมากที่สุด การกำหนดค่านี้ทำงานแตกต่างออกไปเล็กน้อย ในสถานะ "0" เอาต์พุตยังคงตรึงอยู่กับพื้น แต่เมื่อสถานะ "1" เกิดขึ้น จะถูกดึงขึ้นไปที่แรงดันไฟฟ้า VCC เพื่อให้เอาต์พุตไม่แฮงค์ในอากาศอีกต่อไป ตอนนี้สามารถกลายเป็น แหล่งที่มาปัจจุบันนั่นเอง

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

การเพิ่มแถว

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

หากเราจัดเรียงปุ่มต่างๆ ในรูปแบบของเมทริกซ์ปกติ เงื่อนไขนี้จะถูกเติมเต็มโดยอัตโนมัติ และรูปต่อไปนี้จะแสดงให้เห็นว่าเมทริกซ์ของปุ่มต่างๆ จะมีลักษณะอย่างไร ประกอบด้วย nคอลัมน์และ เส้น ( อย่าเพิ่งไปสนใจตัวเลขสีเขียวในตอนนี้).


เมทริกซ์คีย์บอร์ดอย่างง่าย

การอ่านเมทริกซ์นี้ง่ายมาก เราค้นหาทีละคอลัมน์ คอลัมน์ที่จะอ่านถูกเลือกโดยการเชื่อมต่อเอาต์พุตตัวใดตัวหนึ่ง “C1”..“Cn” เข้ากับกราวด์ (เอาต์พุตถูกตั้งค่าเป็น “0” ในโหมด OS) ตอนนี้โดยการซักถามแถว “R1” .. “Rm” ทีละแถว เราสามารถกำหนดสถานะของแต่ละปุ่มของคอลัมน์ที่เลือกได้ ปุ่มในคอลัมน์อื่น ๆ จะไม่มีผลแม้ว่าจะกดไปแล้วก็ตาม เพราะในขณะนี้ หมุดกราวด์ของพวกมันลอยอยู่ในอากาศ (หรือตามที่พวกเขาพูดในอุปกรณ์อิเล็กทรอนิกส์อยู่ในสถานะ Hi-Z)

หลังจากสำรวจคอลัมน์ทั้งหมดแล้ว เราจะไปยังคอลัมน์ถัดไป โดยปล่อยเอาต์พุตปัจจุบันและกดคอลัมน์ถัดไปให้เป็นศูนย์ การสแกนเมทริกซ์จะถือว่าเสร็จสมบูรณ์เมื่อสแกนคอลัมน์ทั้งหมดแล้ว หากคุณทำทุกอย่างเร็วพอ แม้แต่คนพิมพ์ดีดที่เร็วที่สุดก็จะไม่สังเกตเห็นช่วงเวลาระหว่างการสำรวจคอลัมน์ แม้จะมีไมโครคอนโทรลเลอร์ 16 MHz เราก็สามารถสแกนเมทริกซ์ทั้งหมดได้อย่างง่ายดายหลายพันครั้งต่อวินาที ในขณะที่ผู้พิมพ์ดีดที่เร็วที่สุดในการทดสอบบน hi-games.net มีความเร็ว 203 คำต่อนาที (wpm) - นั่นคือเพียงภายใต้ กดปุ่มได้ 17 ครั้งต่อครั้ง

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

จะเป็นอย่างไรถ้าเราไม่มีท่อระบายน้ำแบบเปิด?

คุณอาจถามว่า: เราควรทำอย่างไรถ้าไมโครคอนโทรลเลอร์ที่เลือกยังไม่มีโหมดระบบปฏิบัติการ? เราได้กำหนดแล้วว่าปัญหาประเภทใดที่อาจเกิดขึ้นได้ และการดึงเอาต์พุตไปยัง VCC (นั่นคือ "การเชื่อมต่อ" เข้ากับพลังงาน) ไม่ใช่ความคิดที่ดี มีหลายวิธีในการแก้ปัญหานี้ ในหมู่พวกเขาไม่เพียงมีบัฟเฟอร์เอาต์พุต OS พิเศษเท่านั้น แต่ยังมี shift registers ด้วยเอาต์พุต OS เพื่อลดจำนวนขาที่เกี่ยวข้องให้เหลือน้อยที่สุด แต่มีอีกเทคนิคหนึ่งที่นิยมใช้กันมากในการออกแบบแป้นพิมพ์คอมพิวเตอร์ค่อนข้างบ่อย (จริงๆ แล้วใช้ในสมัยก่อนกันอย่างแพร่หลาย)

ปัญหาของคอลัมน์ที่เชื่อมต่อกับเอาต์พุตแบบกดดึงจะปรากฏขึ้นในขณะที่ปุ่มสองปุ่มที่อยู่ในแถวเดียวกันถูกกดเข้าด้วยกันและพร้อมกันกับการกดนี้ คอลัมน์ที่มีปุ่มใดปุ่มหนึ่งอยู่จะถูกสำรวจ


ปัญหาการผลักดึง

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

แต่เนื่องจากเราต้องจัดการกับปัญหานี้ เราจึงใช้เคล็ดลับดีๆ ได้: เปลี่ยนเอาต์พุตแบบพุช-พูลให้กลายเป็นเอาต์พุตแบบ open-drain ฉันเคยเห็นวิธีแก้ปัญหานี้บ่อยครั้งในการออกแบบคีย์บอร์ดรุ่นเก่า เมื่อพิจารณาว่ากระแสควรไหลเข้าเฉพาะเอาท์พุต (เชื่อมต่อกับคอลัมน์) แต่ไม่เคยไหลออกไป เราสามารถจำกัดทิศทางของกระแสโดยใช้ไดโอด ไดโอดเป็นอุปกรณ์ง่ายๆ ที่ให้กระแสไหลไปในทิศทางเดียวเท่านั้น ในภาพไดโอดบนแผนภาพไฟฟ้า สามเหลี่ยมเป็นสัญลักษณ์ของลูกศรที่ชี้ไปในทิศทางนี้ หากเราวางไดโอดระหว่างแต่ละเอาต์พุตของไมโครคอนโทรลเลอร์และตัวนำของคอลัมน์ที่สอดคล้องกันของเมทริกซ์เราจะบรรลุเป้าหมาย - ตอนนี้กระแสสามารถไหลเข้าสู่เอาต์พุตเท่านั้นเนื่องจากตัวนำที่ระบุไปถึงแต่ละปุ่มของคอลัมน์ ปรากฎว่าไม่มีกระแสไฟฟ้าไหลจากเอาท์พุตที่ตั้งไว้ที่ "1" ซึ่งเกือบจะทำให้กลายเป็นเอาท์พุตเดรนแบบเปิด แน่นอนว่ามันไม่ถึงระดับของระบบปฏิบัติการจริง แต่จะช่วยแก้ปัญหาการวนซ้ำปัจจุบันแบบปิดในเมทริกซ์คีย์บอร์ดได้ กลับไปที่การวาดเมทริกซ์สุดท้าย แต่คราวนี้ คำนึงถึงไดโอดสีเขียวเพื่อทำความเข้าใจว่าเคล็ดลับนี้ทำงานอย่างไร

โดยธรรมชาติแล้วมันสมเหตุสมผลที่จะลดจำนวนไดโอดให้เหลือน้อยที่สุด เมื่อต้องการทำเช่นนี้ คุณสามารถลดจำนวนคอลัมน์ได้โดยการเพิ่มจำนวนแถว และหากผลลัพธ์ที่ได้ไม่พอดีกับเค้าโครงจริงของแป้นพิมพ์ คุณสามารถ "ขยาย" เมทริกซ์ได้ 90° (สลับแถวและคอลัมน์) ความเป็นไปได้ไม่มีที่สิ้นสุด แต่ทุกวันนี้มีไมโครคอนโทรลเลอร์จำนวนมากปรากฏขึ้นซึ่งใช้งานง่ายและสะดวกสำหรับมือสมัครเล่นดังนั้นในปัจจุบันเทคนิคที่อธิบายไว้จึงไม่ได้ใช้ในโครงการคีย์บอร์ดที่ปลูกในบ้านอีกต่อไป โชคดี.

การคลิกหลอก (Ghosting)

หากคุณสนใจคีย์บอร์ดคุณคงเจอคำนี้แล้ว น่าเสียดายที่มันมักถูกตีความผิดในโลกของคีย์บอร์ด

เราคุ้นเคยกับสถานการณ์ที่การกดปุ่มหลาย ๆ ปุ่มที่อยู่ในบรรทัดเดียวกันพร้อมกันอาจรบกวนการอ่านเมทริกซ์ตามปกติ และเราสามารถพูดได้ว่าปัญหานี้ได้รับการแก้ไขแล้ว ทีนี้มาดูว่าจะเกิดอะไรขึ้นหากคุณกดปุ่มหลายปุ่มพร้อมกันในแถวเดียวกันและในคอลัมน์เดียวกัน


ตัวอย่างการคลิกหลอก

ในภาพมีการกดปุ่มสามปุ่มพร้อมกัน สองรายการอยู่ในคอลัมน์ "C2" และอีกสองรายการอยู่ในแถว "Rm" ซึ่งหมายความว่าปุ่มใดปุ่มหนึ่งจะแชร์แถวร่วมกับปุ่มอื่นที่กด และคอลัมน์ที่มีปุ่มที่สามกด นี่คือสิ่งที่เกิดขึ้นในสถานการณ์นี้ คลิกหลอก- ลองนึกภาพว่าขณะนี้เรากำลังสำรวจคอลัมน์ "C1" (นั่นคือมันถูกกดลงไปที่พื้น - อยู่ในสถานะ "0") คอร์ดลักษณะพิเศษของการกดปุ่มนี้นำไปสู่สิ่งต่อไปนี้: แม้ว่าไม่ได้กดปุ่มบนซ้าย แต่แถว "R2" ก็อยู่ในสถานะ "0" เพราะถูกตรึงไว้กับพื้นด้วยคอลัมน์ "C1" (ซึ่งอยู่ที่ "0") ผ่านการกดสามปุ่ม ด้วยเหตุนี้ ตัวควบคุมแป้นพิมพ์จะอ่านปุ่มบนซ้ายว่า "กดแล้ว" ไม่ว่าจะกดจริงหรือไม่ก็ตาม สถานการณ์ที่อธิบายไว้เรียกว่า การกดผี (ผี) เนื่องจากการกดปุ่มพร้อมกันบางปุ่มทำให้เกิดการเปิดใช้งาน Phantom ของปุ่มอื่นๆ (การกดปุ่ม Ghost) แม้ว่าปุ่มอื่นๆ เหล่านี้จะไม่ได้กดทางกายภาพก็ตาม

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

มีอีกแนวทางหนึ่ง คุณสามารถระบุสถานการณ์เมื่อมีการเรียกใช้ปุ่ม "ที่สาม" และบล็อกทั้งการกดนี้และปุ่มที่ตามมาทั้งหมด อย่าถอดล็อคออกจนกว่า Phantom triggering จะหายไปและสถานการณ์จะกลับมาเป็นปกติอีกครั้ง เพื่อนำแนวทางนี้ไปใช้ โปรแกรมจะต้องจำไว้ว่าปุ่มใดที่ถูกกดอยู่ในปัจจุบัน (และโดยปกติแล้วจะจำสิ่งนี้ไว้อยู่แล้ว) เพื่อปฏิเสธการเปิดใช้งานปุ่มในแถวและคอลัมน์ที่มีการกดพร้อมกันได้ถูกบันทึกไว้แล้ว หากคุณเขียนโปรแกรมอย่างชาญฉลาดเฉพาะคำตอบที่เป็นปัญหาเท่านั้นที่จะถูกบล็อกและคำตอบที่ตามมาทั้งหมดจะได้รับการยอมรับตามปกติ - ยกเว้นคำตอบที่ละเมิดกฎอีกครั้ง เนื่องจากตัวควบคุมปฏิเสธการกดปุ่มแต่ละปุ่มซึ่งมีการเปิดใช้งานพร้อมกันในแถวและคอลัมน์ ปรากฎว่าปุ่มอื่นๆ อาจไม่ได้รับการลงทะเบียนเลย ทั้งนี้ขึ้นอยู่กับสถานะของปุ่มบางปุ่ม สถานการณ์นี้เป็นที่รู้จักกันทั่วไปว่าเป็น การปิดกั้น (ติดขัด- นั่นคือปุ่มที่ป้องกันการทำงานของปุ่มอื่นพร้อมกันปรากฎว่าเป็นส่วนหนึ่งของ "บล็อก" ของแป้นพิมพ์

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

คนมักสับสน" ทริกเกอร์ผี" และ " การดำเนินการปิดกั้น» (« ผี" และ " ติดขัด") ซึ่งเป็นปริศนาสำหรับฉันเป็นการส่วนตัว - ในความคิดของฉันคำศัพท์เหล่านี้ค่อนข้างเข้าใจง่าย

ในคีย์บอร์ดที่ใช้เมทริกซ์อย่างที่เราเพิ่งดูไป เป็นไปไม่ได้ที่จะหลีกเลี่ยงการเปิดใช้งานหรือการบล็อก Phantom เนื่องจากการเปิดใช้งาน Phantom นั้นเป็นสิ่งที่ยอมรับไม่ได้ในการทำงานในแต่ละวัน เพื่อต่อสู้กับมัน ผู้ผลิตคีย์บอร์ดโดมยางเกือบทั้งหมดจึงใช้กลอุบายต่าง ๆ และการบล็อกก็เข้ามามีบทบาท คำถาม: จะสร้างเมทริกซ์ในลักษณะที่การบล็อกเกิดขึ้นน้อยที่สุดเท่าที่จะเป็นไปได้และไม่ได้เกิดจากการรวมแป้นพิมพ์ทั่วไปได้อย่างไร นี่เป็นหัวข้อที่ดีสำหรับหนังสือทั้งเล่ม นี่คือสาเหตุที่เมทริกซ์ของคีย์บอร์ดสำหรับผู้บริโภคเกิดความสับสนและปิดกั้นอารมณ์ที่ดีอยู่เสมอ (เช่น ตั้งใจเล่นสำนวน)

ไดโอดสำหรับปุ่มทั้งหมด - วิธีแก้ปัญหาที่รุนแรง

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

น่าเสียดายที่คุณไม่สามารถประหยัดเงินได้ที่นี่ คุณจะต้องติดตั้งไดโอดในแต่ละปุ่ม ถ้าเราพูดถึงขั้วคุณควรรู้แล้วว่าในกรณีนี้ไดโอดควรผ่านกระแส "จากบนลงล่าง" นั่นคือแคโทด ("เคล็ดลับลูกศร") ควรดูที่เอาต์พุตของไมโครคอนโทรลเลอร์ (คอลัมน์ ) ในขณะที่ขั้วบวกควรหันไปทางอินพุต (แถว)


เมทริกซ์สุดท้าย

ไม่สำคัญว่าไดโอดจะวางไว้ที่ด้านใดของปุ่ม สิ่งสำคัญคือการรักษาขั้วที่ถูกต้อง เพียงจำไว้ว่าในกรณีนี้ กระแสจะไหลจากอินพุตไปยังเอาต์พุตเสมอ อย่างไรก็ตามหากอินพุตเชื่อมต่อกับพลังงานและเอาต์พุตอยู่ในโหมด OS สิ่งนี้จะเกิดขึ้นเสมอ

ด้วยวิธีการนี้ ปรากฎว่ากระแสจะไหล "ลงไปทางขวา" เสมอ และสิ่งนี้จะช่วยลดการเกิดลูปกระแสปิดเมื่อมีการกดปุ่มหลายปุ่มพร้อมกัน นอกจากนี้ การออกแบบนี้เป็นการออกแบบเดียวที่สามารถมอบ NKRO เต็มรูปแบบให้กับคีย์บอร์ดได้ นอกจากนี้ เป็นเรื่องที่ควรค่าแก่การกล่าวถึง (แม้ว่าจะดูชัดเจนก็ตาม) ว่าปัญหาของเอาต์พุตไมโครคอนโทรลเลอร์ที่ไม่มีโหมดระบบปฏิบัติการได้รับการแก้ไขโดยอัตโนมัติแล้ว ไดโอดที่ติดตั้งเป็นอนุกรมโดยแต่ละปุ่มจะป้องกันไม่ให้เอาต์พุตลัดวงจรไม่เลวร้ายไปกว่าตัวเลือกที่พิจารณาไว้ก่อนหน้านี้ซึ่งควรจะติดตั้งไดโอดเพิ่มเติมในแต่ละคอลัมน์

กลิ้งไป

ใช่ ฉันรู้ว่าข้อความยาวเกินไปแล้ว แต่ฉันจะยังคงเพิ่มบทสุดท้ายนี้ เพราะในความคิดของฉัน บทความนี้จะไม่สมบูรณ์หากไม่มีบทนี้ ดังนั้นการโรลโอเวอร์คือความสามารถของแป้นพิมพ์ในการรับการกดแป้นพิมพ์หลายครั้งในเวลาเดียวกัน

xKRO

KRO แปลว่า การโรลโอเวอร์ของแป้นพิมพ์ (การโรลโอเวอร์ที่สำคัญ) และโดยปกติแล้วคำย่อนี้จะขึ้นต้นด้วยตัวเลขบางประเภท ตัวอย่างเช่น 2KRO หมายถึงการโรลโอเวอร์สองคีย์ คีย์บอร์ดก็มี x- การโรลโอเวอร์ที่สำคัญหากสามารถลงทะเบียนได้เท่านั้น xกดพร้อมกัน และ - ไม่ว่าจะใช้ปุ่มใดและในลำดับใด คีย์บอร์ดโดมยางสมัยใหม่ส่วนใหญ่มี 2KRO อย่างไรก็ตาม จากนี้ไปไม่ได้หมายความว่าจำนวนการกดแป้นพิมพ์ที่อนุญาตบนแป้นพิมพ์เหล่านี้จะถูกจำกัดอยู่ที่จำนวนเสมอ x- ความหมายที่แท้จริงคือการสนับสนุนนั้น xรับประกันการกดพร้อมกันอย่างแม่นยำ

ขึ้นอยู่กับการออกแบบเมทริกซ์และประเภทของคอนโทรลเลอร์ แป้นพิมพ์ 2KRO สองตัวจากผู้ผลิตหลายรายสามารถทำงานได้แตกต่างไปจากเดิมอย่างสิ้นเชิง ฝ่ายหนึ่งสามารถจัดการการคลิกพร้อมกันสองครั้งเท่านั้น ในขณะที่อีกฝ่ายสามารถจัดการได้มากกว่าได้อย่างง่ายดาย ดูเหมือนว่า 2KRO ได้ประกาศคีย์บอร์ดรุ่นล่าสุดเนื่องจากการกดคีย์ผสมบางคีย์ (มีแนวโน้มมากที่สุด และไม่น่าเป็นไปได้) จะยังคงทำให้คีย์บอร์ดดังกล่าวปิดกั้นการกดปุ่มอื่นๆ และเนื่องจากนั่นหมายความว่าเมื่อใช้งานแป้นพิมพ์นี้ การใช้ปุ่มสามปุ่มขึ้นไปร่วมกันบางปุ่มจะไม่ทำงาน บริษัทจึงประกาศว่าเป็น 2KRO

เอ็นเคโร

คำว่า กศน. หมายความว่า การโรลโอเวอร์คีย์ Nและใช้เพื่ออ้างถึงแป้นพิมพ์ที่รองรับการกดปุ่มพร้อมกันไม่ว่าจะอย่างไรก็ตาม แต่โปรดจำไว้ว่าเมทริกซ์ NKRO และคีย์บอร์ด NKRO เป็นสองสิ่งที่แตกต่างกันมาก ตัวอย่างเช่นหากการใช้งานเมทริกซ์ขั้นสุดท้ายที่เราตรวจสอบในบทความรองรับ NKRO (โดยคำนึงถึงเฟิร์มแวร์ที่เขียนอย่างถูกต้อง) ก็ไม่เป็นไปตามที่แป้นพิมพ์ที่ใช้เมทริกซ์นี้จะรองรับ NKRO ด้วย สิ่งนี้อาจเกิดขึ้นเนื่องจากข้อจำกัดที่กำหนดโดยพอร์ตการสื่อสารที่เชื่อมต่อคีย์บอร์ดอยู่ อีกเหตุผลหนึ่งอาจเป็นความประหยัดของผู้ผลิตที่มักจะประหยัดที่นี่และที่นั่น ฉันจะพยายามอธิบายปัญหาของ NKRO เมื่อเชื่อมต่อกับ PS/2 และ USB ในส่วนต่อไปนี้

บรรทัดล่าง

แน่นอนว่าแผ่นงานนี้ออกมาค่อนข้างใหญ่ แต่แนวคิดนั้นไม่ง่ายนัก โดยเฉพาะอย่างยิ่งสำหรับผู้อ่านที่ไม่ใช่วิศวกรอิเล็กทรอนิกส์ ฉันหวังว่าฉันจะสามารถอธิบายทุกอย่างได้ อย่างไรก็ตาม ฉันพยายามเขียนให้ชัดเจนที่สุด ดังนั้นบางท่านอาจพบว่าบทความนี้ค่อนข้างน่าเบื่อ ถ้าคุณชอบอุปกรณ์อิเล็กทรอนิกส์ เป็นไปได้มากว่าคุณไม่ควรอ่านมันเลย ;)
ยังไงก็กรุณา.

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

คีย์บอร์ดทั่วไปคือ 3x4 และ 4x4 พร้อมปุ่ม 12 และ 16 ปุ่มตามลำดับ ฉันมีคีย์บอร์ด 4x4 อยู่ในมือ ลองพิจารณาทำงานกับมันตอนนี้

ฉันบังเอิญมีคีย์บอร์ดตัวนี้ที่มีหน้าสัมผัสแบบเมมเบรน กำลังดีเพราะมีความหนาเพียง 1 มม. และสามารถยึดติดกับพื้นผิวที่ต้องการได้ง่าย

หลังจากจิ้มที่ปุ่มต่างๆ แล้ว ฉันใช้มัลติมิเตอร์เพื่อพิจารณาว่าปุ่มต่างๆ ภายในแป้นพิมพ์เชื่อมต่อกันอย่างไร


มีฟังก์ชั่นพิเศษสำหรับการสแกนคีย์บอร์ดเมทริกซ์ใน Bascom-AVR Getkbd() . คำสั่งนี้ออกแบบมาเพื่อใช้กับแป้นพิมพ์ขนาด 4x4 ดังนั้นจึงใช้พินทั้งหมด 8 พินของพอร์ตไมโครคอนโทรลเลอร์หนึ่งพอร์ต และหากคุณใช้คีย์บอร์ดที่มีปุ่มน้อยกว่า คุณควรคำนึงถึงเรื่องนี้ด้วย

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

ตัวอย่างเช่น ในบรรทัดต่อไปนี้:

การกำหนดค่า Kbd = พอร์ต เดเด้ง= 20 , ล่าช้า= 100

มีการกำหนดค่าการเชื่อมต่อแป้นพิมพ์กับ PortD เวลาตีกลับตั้งไว้ที่ 20 ms เวลาหน่วงหลังจากกดคือ 100 ms

คำสั่งนี้ทำงานทั้งหมดในการสแกนบรรทัดของแป้นพิมพ์และส่งคืนตัวแปรตามจำนวนคีย์ที่กดตั้งแต่ 0 ถึง 15 หากไม่ได้บันทึกการกดปุ่มฟังก์ชันจะส่งคืนหมายเลข 16 เพิ่มเติมขึ้นอยู่กับวิธีการ เชื่อมต่อปุ่มแล้วคุณอาจต้องค้นหาสัญลักษณ์ของปุ่มกด

ในตัวอย่างด้านล่าง การสแกนแป้นพิมพ์จะเกิดขึ้นที่ 10 Hz และอยู่ในลูปโปรแกรมหลัก ผลลัพธ์ของการกดจะแสดงบนจอ LCD

$regfile = "m8def.dat"
$คริสตัล = 1000000

"การกำหนดค่าการแสดงผล
การกำหนดค่า จอแอลซีดี = พิน Rs = พอร์ต 0, E = พอร์ต 1, DB4 = พอร์ต 2, DB5 = พอร์ต 3, DB6 = พอร์ต 4, DB7 = พอร์ต 5
การกำหนดค่า จอแอลซีดี= 20 * 4
เคอร์เซอร์ ปิด
Cls

"การกำหนดค่าแป้นพิมพ์
การกำหนดค่า Kbd = พอร์ต เดเด้ง= 20 , ล่าช้า= 100


"ตัวแปร
สลัว คีย์_ชาร์ เช่นไบต์"จำนวนปุ่มที่กด
สลัว คีย์_str เช่นสตริง* 1 “สัญลักษณ์ของการกดปุ่มบนคีย์บอร์ด
สลัว ผลลัพธ์ เช่นสตริง* 20 “ผลจากการกดแป้นพิมพ์

ผลลัพธ์= ""

“วงหลักของโปรแกรม
ทำ

คีย์_ชาร์= Getkbd() "ไม่ได้กดปุ่ม และฟังก์ชันจะคืนค่า 16 ให้กับตัวแปร

ถ้า คีย์_ชาร์<> 16 แล้ว“ถ้าตัวแปรไม่เท่ากับ 16 แสดงว่ากดปุ่มแล้ว
คีย์_str= ค้นหา(key_char, Keyboard_data) “ดึงสัญลักษณ์ปุ่มที่กดออกมา
ผลลัพธ์= ผลลัพธ์ + คีย์_str
จบ ถ้า

ค้นหา 1 , 1

จอแอลซีดี ผลลัพธ์ “เราแสดงผลการกด

รอ 100

วนซ้ำ

จบ

แป้นพิมพ์_ข้อมูล:
ข้อมูล "1" , "4" , "7" , "*" , "2" , "5" , "8" , "0"
ข้อมูล "3" , "6" , "9" , "#" , "A" , "B" , "C" , "D"

และนี่คือวงจรทดสอบที่ใช้เชื่อมต่อจอแสดงผลและคีย์บอร์ด:

การเพิ่มตัวต้านทานจำกัดกระแสให้กับวงจรบนสายคีย์บอร์ดจะไม่เสียหายด้วยค่าเล็กน้อย 100-150 โอห์ม เผื่อไว้แต่สำหรับการทดสอบก็จะทำได้ (สิ่งสำคัญคือไม่ต้องกดปุ่มหลายปุ่มพร้อมกัน)

เราเชื่อมต่อ, แฟลช, กดปุ่มและดูผลลัพธ์ - สัญลักษณ์ของปุ่มที่กดจะปรากฏบนจอแสดงผล:


ฉันจะเพิ่มวิดีโอสาธิตในภายหลัง ทันทีที่ฉันพบสิ่งที่จะถ่ายในคุณภาพที่เหมาะสม

ในระหว่างนี้ คุณสามารถดาวน์โหลดไฟล์เก็บถาวรที่มีไฟล์สำหรับการจำลองใน Proteus และเฟิร์มแวร์ได้