- ทำไมเราต้องใช้ปุ่มกด 4x4:
- 4x4 Matrix Keypad ทำงานอย่างไร:
- วัสดุที่ต้องการ:
- แผนภูมิวงจรรวม:
- คำอธิบายการเขียนโปรแกรม:
ปุ่มกดเป็นอุปกรณ์อินพุตที่ใช้กันอย่างแพร่หลายในอุปกรณ์อิเล็กทรอนิกส์และโครงการฝังตัวต่างๆ ใช้เพื่อรับอินพุตในรูปแบบของตัวเลขและตัวอักษรและป้อนข้อมูลเดียวกันลงในระบบเพื่อประมวลผลต่อไป ในการกวดวิชานี้เราจะไป ติดต่อปุ 4x4 เมทริกซ์ด้วย PIC16F877A
ก่อนที่จะเข้าสู่ตรรกะรายละเอียดและเรียนรู้วิธีใช้ปุ่มกดเราจะต้องรู้บางสิ่ง
ทำไมเราต้องใช้ปุ่มกด 4x4:
โดยปกติเราใช้พิน I / O เดียวของหน่วยไมโครคอนโทรลเลอร์เพื่ออ่านสัญญาณดิจิทัลเช่นอินพุตสวิตช์ ในแอปพลิเคชั่นบางตัวที่จำเป็นต้องใช้ 9, 12, 16 คีย์สำหรับการป้อนข้อมูลหากเราเพิ่มแต่ละคีย์ในพอร์ตไมโครคอนโทรลเลอร์เราจะใช้พอร์ต I / O 16 พอร์ต พอร์ต I / O 16 พอร์ตนี้ไม่เพียง แต่สำหรับการอ่านสัญญาณ I / O เท่านั้น แต่ยังสามารถใช้เป็นการเชื่อมต่ออุปกรณ์ต่อพ่วงได้เช่นกันเช่นรองรับ ADC, I2C, การเชื่อมต่อ SPI ยังรองรับโดยหมุด I / O เหล่านั้น เนื่องจากพินเหล่านั้นเชื่อมต่อกับสวิตช์ / คีย์เราจึงไม่สามารถใช้งานได้ แต่เป็นพอร์ต I / O เท่านั้น นี่ไม่สมเหตุสมผลเลย ดังนั้นวิธีลดจำนวนพิน? คำตอบคือใช้แป้นหกเหลี่ยมหรือแป้นพิมพ์เมทริกซ์ เราสามารถลดจำนวนพินซึ่งเชื่อมโยงคีย์เมทริกซ์ 4x4 จะใช้พิน 8 พินโดย 4 ตัวเชื่อมต่อเป็นแถวและ 4 ตัวเชื่อมต่อในคอลัมน์ดังนั้นจึงประหยัด 8 พินของไมโครคอนโทรลเลอร์
4x4 Matrix Keypad ทำงานอย่างไร:
ในภาพด้านบนโมดูลปุ่มกดเมทริกซ์จะแสดงทางด้านซ้าย ทางด้านขวาการเชื่อมต่อภายในจะแสดงขึ้นเช่นเดียวกับการเชื่อมต่อพอร์ต ถ้าเราเห็นพอร์ตมี 8 ขาแรกที่ 4 จากซ้ายไปขวาจะX1, X2, X3 และ X4เป็นแถวและสุดท้าย 4 จากซ้ายไปขวาจะY1, Y2, Y3, Y4สี่คอลัมน์ถ้าเราทำให้ 4 แถวหรือด้านข้าง X เป็นเอาท์พุทและทำให้พวกเขาตรรกะต่ำหรือ 0และทำให้ 4 คอลัมน์เป็นการป้อนข้อมูลและอ่านคีย์ที่เราจะอ่านการกดสวิตช์เมื่อผู้สื่อข่าวY ได้รับ 0
สิ่งเดียวกันจะเกิดขึ้นในเมทริกซ์nxnโดยที่nคือตัวเลข ที่สามารถเป็น 3x3, 6x6 เป็นต้น
ตอนนี้คิดแค่ว่ากด 1 จากนั้น1 จะอยู่ที่แถว X1 และคอลัมน์ Y1 ถ้า X1 เป็น 0 ดังนั้น Y1 จะเป็น 0 ในทำนองเดียวกันเราสามารถรับรู้แต่ละคีย์ในแถว X1 โดยการตรวจจับคอลัมน์ Y1, Y2, Y3 และ Y4 สิ่งนี้เกิดขึ้นสำหรับสวิตช์ทุกตัวและเราจะอ่านตำแหน่งของสวิตช์ในเมทริกซ์
วงกลมสีเขียวแต่ละวงคือสวิตช์และทั้งสองจะเชื่อมต่อเข้าด้วยกันในลักษณะเดียวกัน
ในบทช่วยสอนนี้เราจะเชื่อมต่อกับคีบอร์ดด้วยคุณสมบัติดังต่อไปนี้ -
- เราจะใช้การดึงขึ้นภายใน
- เราจะเพิ่มตัวเลือกการตีกลับที่สำคัญ
แต่เมื่อสวิทช์ไม่ได้กดเราต้องทำให้Y1, Y2, Y3 และ Y4เป็นสูงหรือ 1มิฉะนั้นเราจะไม่สามารถตรวจสอบการเปลี่ยนแปลงตรรกะเมื่อสวิทช์จะถูกกด แต่เราไม่สามารถสร้างด้วยรหัสหรือโปรแกรมได้เนื่องจากพินเหล่านั้นใช้เป็นอินพุตไม่ใช่เอาต์พุต ดังนั้นเราจะใช้การลงทะเบียนการทำงานภายในในไมโครคอนโทรลเลอร์และใช้งานพินเหล่านั้นในโหมดเปิดใช้งานการดึงขึ้นที่อ่อนแอเมื่อใช้สิ่งนี้จะมีโหมดเปิดใช้งานตรรกะสูงเมื่ออยู่ในสถานะเริ่มต้น
นอกจากนี้เมื่อเรากดแป้นจะมีเสียงแหลมหรือเสียงดังขึ้นพร้อมกับหน้าสัมผัสสวิตช์และเนื่องจากการกดสวิตช์หลายครั้งนี้เกิดขึ้นซึ่งไม่คาดคิด ดังนั้นก่อนอื่นเราจะตรวจจับการกดสวิตช์รอสองสามมิลลิวินาทีตรวจสอบอีกครั้งว่าสวิตช์ยังคงกดอยู่หรือไม่และหากสวิตช์ยังคงกดอยู่เราจะยอมรับการกดสวิตช์ในที่สุดมิฉะนั้นจะไม่ สิ่งนี้เรียกว่าเป็นการลดการกระดอนของสวิตช์
เราจะใช้สิ่งนี้ทั้งหมดในโค้ดของเราและทำการเชื่อมต่อกับ breadboard
ตรวจสอบวิธีการเชื่อมต่อปุ่มกด 4x4 กับไมโครคอนโทรลเลอร์อื่น ๆ:
- ปุ่มกดเชื่อมต่อกับ Arduino Uno
- 4x4 Matrix Keypad Interfacing กับไมโครคอนโทรลเลอร์ 8051
- 4x4 ปุ่มกดเชื่อมต่อกับไมโครคอนโทรลเลอร์ ATmega32
- ล็อครหัสดิจิทัล Raspberry Pi บน Breadboard
วัสดุที่ต้องการ:
- เขียงหั่นขนม
- Pic-kit 3 และสภาพแวดล้อมการพัฒนาในพีซีของคุณเช่น MPLABX
- สายไฟและขั้วต่อ
- ตัวอักษร LCD 16x2
- คริสตัล 20Mhz
- 2 ชิ้น 33pF ฝาดิสก์เซรามิก
- ตัวต้านทาน 4.7k
- 10k ที่ตั้งไว้ล่วงหน้า (ตัวต้านทานตัวแปร)
- ปุ่มกด 4x4 Matrix
- อะแดปเตอร์ 5 V
แผนภูมิวงจรรวม:
เราจะเชื่อมต่อคริสตัลและตัวต้านทานในพินที่เกี่ยวข้อง นอกจากนี้เรายังจะเชื่อมต่อจอแอลซีดีในโหมด 4 บิตทั่วPORTDเราเชื่อมต่อแป้นพิมพ์หกเหลี่ยมหรือเมทริกซ์ปุทั่วพอร์ตRB4
หากคุณยังใหม่กับ PIC ให้เริ่มต้นด้วยการเริ่มต้นใช้งานไมโครคอนโทรลเลอร์ PIC: ข้อมูลเบื้องต้นเกี่ยวกับ PIC และ MPLABX
คำอธิบายการเขียนโปรแกรม:
รหัสที่สมบูรณ์สำหรับการเชื่อมต่อ Matrix Keypad กับ PIC Microcontrollerจะได้รับในตอนท้าย รหัสเป็นเรื่องง่ายและอธิบายได้ด้วยตนเอง ไลบรารีปุ่มกดเป็นเพียงสิ่งเดียวที่ต้องเข้าใจในโค้ด ที่นี่เราได้ใช้ keypad.h และ lcd.h Library เพื่อเชื่อมต่อปุ่มกดและ LCD 16x2 มาดูกันว่าเกิดอะไรขึ้นภายในนั้น
ภายในปุ่มกดเราจะเห็นว่าเราได้ใช้ส่วนหัวxc.hซึ่งเป็นไลบรารีรีจิสเตอร์เริ่มต้นความถี่คริสตัลถูกกำหนดไว้สำหรับการใช้การหน่วงเวลาที่ใช้ในไฟล์kepad.c เรากำหนดพอร์ตปุ่มกดที่PORTRBทะเบียนและกำหนดหมุดแต่ละแถว (X)และคอลัมน์(Y)
นอกจากนี้เรายังใช้สองฟังก์ชั่นหนึ่งสำหรับการเริ่มต้นปุ่มกดซึ่งจะเปลี่ยนเส้นทางพอร์ตเป็นเอาต์พุตและอินพุตและสวิตช์กดสแกนซึ่งจะส่งคืนสถานะการกดสวิตช์เมื่อถูกเรียก
# รวม
ในปุ่มกด cเราจะเห็นว่าฟังก์ชันด้านล่างนี้จะส่งกลับการกดปุ่มเมื่อฟังก์ชันสแกนเนอร์ปุ่มกดไม่คืนค่า 'n'
ถ่าน switch_press_scan (โมฆะ) // รับคีย์จากผู้ใช้ { char key = 'n'; // สมมติว่าไม่มีการกดปุ่ม ในขณะที่ (key == 'n') // รอจนกว่าจะมีการกดปุ่ม key = keypad_scanner (); // สแกนคีย์อีกครั้งและ ส่งคืนคีย์ อีกครั้ง // เมื่อกดปุ่มแล้วจะคืนค่า}
ด้านล่างนี้คือฟังก์ชั่นการอ่านปุ่มกด ในแต่ละขั้นตอนเราจะทำให้แถว X1, X2, X3 และ X4 เป็น 0 และอ่านสถานะ Y1, Y2, Y3 และ Y4 การหน่วงเวลาใช้สำหรับเอฟเฟกต์ debounce เมื่อยังคงกดสวิตช์เราจะคืนค่าที่เกี่ยวข้อง เมื่อไม่มีการกดสวิตช์เราจะคืนค่า'n'
ถ่าน keypad_scanner (โมฆะ) { X_1 = 0; X_2 = 1; X_3 = 1; X_4 = 1; ถ้า (Y_1 == 0) {__delay_ms (100); ในขณะที่ (Y_1 == 0); กลับ '1'; } ถ้า (Y_2 == 0) {__delay_ms (100); ในขณะที่ (Y_2 == 0); กลับ '2'; } ถ้า (Y_3 == 0) {__delay_ms (100); ในขณะที่ (Y_3 == 0); กลับ '3'; } ถ้า (Y_4 == 0) {__delay_ms (100); ในขณะที่ (Y_4 == 0); กลับ 'A'; } X_1 = 1; X_2 = 0; X_3 = 1; X_4 = 1; ถ้า (Y_1 == 0) {__delay_ms (100); ในขณะที่ (Y_1 == 0); กลับ '4'; } ถ้า (Y_2 == 0) {__delay_ms (100); ในขณะที่ (Y_2 == 0); กลับ '5'; } ถ้า (Y_3 == 0) {__delay_ms (100); ในขณะที่ (Y_3 == 0); กลับ '6'; } ถ้า (Y_4 == 0) {__delay_ms (100); ในขณะที่ (Y_4 == 0); กลับ 'B'; } X_1 = 1; X_2 = 1; X_3 = 0; X_4 = 1; ถ้า (Y_1 == 0) {__delay_ms (100); ในขณะที่ (Y_1 == 0); กลับ '7'; } ถ้า (Y_2 == 0) {__delay_ms (100); ในขณะที่ (Y_2 == 0); กลับ '8'; } ถ้า (Y_3 == 0) {__delay_ms (100); ในขณะที่ (Y_3 == 0); กลับ '9'; } ถ้า (Y_4 == 0) {__delay_ms (100); ในขณะที่ (Y_4 == 0); กลับ 'C'; } X_1 = 1; X_2 = 1; X_3 = 1; X_4 = 0; ถ้า (Y_1 == 0) {__delay_ms (100); ในขณะที่ (Y_1 == 0); กลับ '*'; } ถ้า (Y_2 == 0) {__delay_ms (100); ในขณะที่ (Y_2 == 0); กลับ '0'; } ถ้า (Y_3 == 0) {__delay_ms (100); ในขณะที่ (Y_3 == 0); กลับ '#'; } ถ้า (Y_4 == 0) {__delay_ms (100); ในขณะที่ (Y_4 == 0); กลับ 'D'; } กลับ 'n'; }
นอกจากนี้เราจะตั้งค่าการดึงที่อ่อนแอในสี่บิตสุดท้ายและกำหนดทิศทางของพอร์ตเป็นอินพุต 4 ตัวสุดท้ายและ 4 ตัวแรกเป็นเอาต์พุต OPTION_REG & = 0x7F; ใช้เพื่อตั้งค่าโหมดดึงที่อ่อนแอบนพินสุดท้าย
เป็นโมฆะ InitKeypad (โมฆะ) { Keypad_PORT = 0x00; // ตั้งค่าพินของพอร์ตปุ่มกดเป็นศูนย์ Keypad_PORT_Direction = 0xF0; // อินพุต 4 พินสุดท้ายเอาต์พุต 4 พินแรก OPTION_REG & = 0x7F; }
ในโปรแกรม PIC หลัก (ตามที่ระบุด้านล่าง) ก่อนอื่นเราตั้งค่าบิตการกำหนดค่าและรวมไลบรารีที่จำเป็นบางส่วน จากนั้นใน ฟังก์ชัน void system_init เราจะเริ่มต้นปุ่มกดและ LCD และในที่สุด ใน หลัก ฟังก์ชั่นที่เราได้อ่านปุ่มกดโดยการเรียก switch_press_scan () ฟังก์ชั่นและกลับมาค่าเป็นจอแอลซีดี
ดาวน์โหลดโค้ดทั้งหมดพร้อมไฟล์ส่วนหัวจากที่นี่และตรวจสอบวิดีโอสาธิตด้านล่าง