[ บทความ : ลองใช้ภาษาซีกับบอร์ด 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 แต่ถ้าไม่มีการกดก็จะคืนค่าเป็น 0
	        else {
	            return_val = 0x00;
	        }

เสร็จแล้วในโปรแกรมหลักก็จะทำการส่งผลลัพธ์ที่ได้ออกมาแสดงที่เครื่อง PC แล้วก็ทำการวนรอบอย่างนี้ไปเรื่อยๆ ... การที่เราจะคอมไพล์โปรแกรมนี้ได้ ... ก่อนอื่นนจะต้องติดตั้งไลบรารี Munc5x ก่อนนะครับ เพราะผมเรียกใช้ ฟังก์ชัน และค่าคงที่ต่างๆ มาจากไลบรารีนี้พอสมควร... ส่วนผลลัพธ์ของการทำงานเป็นอย่างไร ก็ทดลองกันเอานะครับ... ส่วนใครมีวิธีที่ดีกว่านี้ก็แนะนำกันได้นะครับ ... แล้วผมจะได้เอามาปรับปรุง และอัพเดตให้ครับ ... ส่วนไลบรารี Munc5x ชุดที่สมบูรณ์ คือ มีฟังก์ชันรองรับการติดต่อกับแป้นพิมพ์ของบอร์ด ET-BOARD V6 และ MTOOL-7 นั้นต้องรอ ไปก่อนนะครับ ช่วงนี้ยังไม่ค่อยว่างเลยครับ แถมใกล้จะสอบ Final แล้วด้วย ... (ทำไมเวลามันมีแค่ 24 ชม.เองนะ) คราวหน้าคิดว่า ผมน่าจะเอาบทความเกี่ยวกับ ADC มาลงได้นะครับ เพราะตอนนี้วงจรทดลองเสร็จตั้งนานแล้ว เหลือ แต่โปรแกรมทดสอบการทำงานยังไม่ได้เขียนเลย ... เอาไว้ว่างมาทำเมื่อไร แล้วจะเอามาอัพเดตให้ล่ะกันครับ


เขียนโดย : ศุภชัย บุศราทิจ
Author : Supachai Budsaratij
e-mail : raek@se-ed.net
วันที่ทำการปรับปรุง : ๑๕ ก.ย. ๒๕๔๓