[ บทความ : ลองใช้ภาษาซีกับบอร์ด ET-BOARD V6 [ภาค MCS-51] ] ตอนที่ 7 ติดต่อกับแป้นพิมพ์ |
เผลอแผลบเดียว เราก็มาถึงการประยุกต์ใช้ภาษาซีกับ MCS-51 เป็นตอนที่ 7 แล้วครับ ... ถ้าจะย้อนกลับไป บทความเก่าๆ จะพบว่าผมกล่าวถึงแต่ระบบการแสดงผลเท่านั้น ไม่ยังมีบทความเกี่ยวกับการ ติดต่อกับคีย์บนบอร์ดบ้างเลย ... ตอนนี้ก็ถึงเวลาของการเขียนโปรแกรมติดต่อกับคีย์แบบ Matrix บนบอร์ด ET-BOARD V6 กันแล้วครับ ... ก่อนอื่นเรามาดูวงจรของแป้นพิมพ์กันก่อนเลยครับจากวงจรจะเห็นว่า บอร์ด ET-V6 นั้นใช้คีย์เมตริกซ์แบบ 8x3 (24 คีย์) โดยมีส่วนควบคุมการทำงาน อยู่ 2 ตัว คือ PA0-PA2 สำหรับเป็น BIT-OUTPUT (ส่งสัญญาณจาก 8255 ไปยังวงจรของแป้นพิมพ์) สำหรับส่งสัญญาณไปยังหลักต่างๆ ของคีย์ ซึ่งมีวงจรดังนี้ครับ
ในวงจรจะใช้ 74LS145 เป็นตัว Decode ว่าเรากำลังเลือกติดต่อกับหลักใดของแป้นพิมพ์ และ PC4-PC6 จะเป็นตัวที่ทำหน้าที่เป็น Bit-Input (รับสัญญาณจากแป่นพิมพ์มาที่ 8255) ดังรูปด้านล่าง
หลักการทำงานของโปรแกรมที่เราจะเขียนก็คือ เราจะส่งสัญญาณเลือกหลัก (Column) ไปทางพอร์ต PA0-PA3 ไปทีละหลัก และทำการอ่านข้อมูลของแต่ละหลักว่า PC4-PC6 มีบิตใดบ้างที่เป็น 0 ถ้าบิตใดเป็น 0 นั่นก็จะหมายความว่า ปุ่มที่แถว (Row) นั้นถูกกด ซึ่งค่าของปุ่มต่างๆ จะเป็นดังรูปต่อไปนี้
ในรูปจะเห็นว่ามีการเชื่อมต่อระหว่างแต่ละหลักกับแต่ละแถว ซึ่งจุดเชื่อมต่อดังกล่าวนั้น จริงๆ แล้ว เป็นวงจรการต่อ switch แบบกดติดปล่อยดับ ดังวงจรด้านล่างนี้นั่นเอง
ส่วนรูปของแป้นพิมพ์ของบอร์ดจริงๆ แล้วจะเป็นดังรูปต่อไปนี้ครับ (ช่วงนี้ยังไม่ได้ติดตั้งโปรแกรมวาดวงจร เลยอาศัยการวาดด้วยมือ แล้วก็จับภาพด้วย CCD แบบสีเอาครับ ... )
จากแนวคิดที่ว่า เราจะส่งข้อมูลไปเลือกแถวที่เราต้องการก่อน เสร็จแล้วก็ทำการอ่านค่าของแต่ละแถวขึ้นมา เพื่อดูว่า บิตใดมีค่าเป็น 0 เพื่อจะได้รู้ว่ามีการกดปุ่มนั้น ๆ ... พอเขียนโปรแกรมก็จะได้ผลออกมาดังนี้ครับ
/* * Filename : MatKey.c * Author : Supachai Budsaratij * School of Computer and Advanced Technologies * Rajabhat Institute Phetchaburi * e-mail : raek@se-ed.net * Date : 23-08-2000 [dd-mm-yyyy] * Compiler : Micro-C/51 * cc51 MatKey -pio m=l * Processor : MCS-51 * MainBoard : ET-BOARD V6 [MCS-51 mode] * * Notr : Read matrix key. */ #define USE_RS232 #define USE_8255 #include <8051io.h> #include "etv6.h" int ReadMatKey() { int return_val; unsigned char col_data; /* Keep row no. */ unsigned char col_loops; for (col_loops = 0x00; col_loops < 0x08; col_loops++) { i8255Write(s8255PA, col_loops); /* Choose column no. */ col_data = i8255Read(s8255PC); /* Read column data */ if (col_data != 0x70) { return_val = col_data | col_loops; break; } else { return_val = 0x00; } } return(return_val); } main() { int loops; PowerOnReset(); for (loops = 0; loops < 100; loops++) printf("/n"); gotoxy(15,5); printf("- Read MATRIX key -"); gotoxy(15,6); printf("- For ET-BOARD 6 -"); gotoxy(5,10); printf("Scan key = [ 0x ]"); while(1) { gotoxy(20,10); printf("%02x",ReadMatKey()); } }จากโปรแกรม ส่วนที่สำคัญที่สุดจะเป็นฟังก์ชัน ReadMatKey() ซึ่งมันจะทำหน้าที่ตรวจสอบว่ามีการกดคีย์ใดหรือไม่ ถ้ามีการกด
if (col_data != 0x70) { return_val = col_data | col_loops; break; }ก็จะกำหนดค่าของ return_val เป็น col_data | col_loops แต่ถ้าไม่มีการกดก็จะคืนค่าเป็น 0else { return_val = 0x00; }เสร็จแล้วในโปรแกรมหลักก็จะทำการส่งผลลัพธ์ที่ได้ออกมาแสดงที่เครื่อง PC แล้วก็ทำการวนรอบอย่างนี้ไปเรื่อยๆ ... การที่เราจะคอมไพล์โปรแกรมนี้ได้ ... ก่อนอื่นนจะต้องติดตั้งไลบรารี Munc5x ก่อนนะครับ เพราะผมเรียกใช้ ฟังก์ชัน และค่าคงที่ต่างๆ มาจากไลบรารีนี้พอสมควร... ส่วนผลลัพธ์ของการทำงานเป็นอย่างไร ก็ทดลองกันเอานะครับ... ส่วนใครมีวิธีที่ดีกว่านี้ก็แนะนำกันได้นะครับ ... แล้วผมจะได้เอามาปรับปรุง และอัพเดตให้ครับ ... ส่วนไลบรารี Munc5x ชุดที่สมบูรณ์ คือ มีฟังก์ชันรองรับการติดต่อกับแป้นพิมพ์ของบอร์ด ET-BOARD V6 และ MTOOL-7 นั้นต้องรอ ไปก่อนนะครับ ช่วงนี้ยังไม่ค่อยว่างเลยครับ แถมใกล้จะสอบ Final แล้วด้วย ... (ทำไมเวลามันมีแค่ 24 ชม.เองนะ) คราวหน้าคิดว่า ผมน่าจะเอาบทความเกี่ยวกับ ADC มาลงได้นะครับ เพราะตอนนี้วงจรทดลองเสร็จตั้งนานแล้ว เหลือ แต่โปรแกรมทดสอบการทำงานยังไม่ได้เขียนเลย ... เอาไว้ว่างมาทำเมื่อไร แล้วจะเอามาอัพเดตให้ล่ะกันครับ