You are currently viewing Ghép nối bo mạch FRDM-KL46Z với bàn phím

Ghép nối bo mạch FRDM-KL46Z với bàn phím

Để giảm số lượng các chân I/O của vi điều khiển được sử dụng khi ghép nối với bàn phím, bàn phím được tổ chức thành một ma trận các hàng và cột. Vi điều khiển truy cập cả hàng và cột thông qua các cổng của nó. Như vậy với hai cổng 8 bit, vi điều khiển có thể kết nối được với một ma trận 8×8 gồm 64 phím. Nếu một phím được nhấn sẽ tạo ra một kết nối giữa một hàng và một cột; ngược lại sẽ không có kết nối giữa các hàng và cột. Trong bàn phím của máy tính PC, một vi điều khiển nhúng trong bàn phím sẽ thực hiện tất cả chức năng phần cứng và phần mềm giao tiếp với người dùng bàn phím. Trong các hệ thống như vậy, vi điều khiến nhúng sẽ quét liên tục các phím để xác định phím nào đã được kích hoạt và báo hiệu cho CPU trên bo mạch chủ. Trong phần này, chúng ta xem xét cơ chế vi điều khiển nhúng quét và xác định một phím trên bàn phím được bấm hay không thông qua một số ví dụ cụ thể.

a)     Quét và nhận diện một phím bấm

Hình 3‑20 cho thấy một bàn phím dạng ma trận 4×4 được kết nối với hai cổng của vi điều khiển. Các hàng được kết nối với một cổng đầu ra và các cột được kết nối với một cổng đầu vào. Tất cả các chân đầu vào đều được kết nối với điện trở kéo lên nguồn VCC. Như vậy, nếu không có phím nào được nhấn, đọc cổng đầu vào sẽ trả lại giá trị 1 trên tất cả các cột. Nếu tất cả các hàng được điều khiển ở mức thấp và một phím được nhấn, cột chứa phím đó sẽ đọc được giá trị 0 do phím được nhấn đã ngắn mạch cột đó với hàng được điều khiển ở mức thấp. Chức năng của bộ vi xử lý là quét liên tục bàn phím để phát hiện và xác định phím được nhấn. Phần sau sẽ giải thích chi tiết chức năng này được thực hiện thế nào.

Kết nối bàn phím với FRDM-KL46Z

Hình 3‑20. Kết nối bàn phím tới các cổng của vi điều khiển.

(1)     Phát hiện trạng thái nhấn phím:

Để phát hiện phím được nhấn hay không, bộ vi điều khiển xuất mức logic thấp tới tất cả các hàng sau đó đọc các cột. Nếu dữ liệu được đọc từ các cột là D7÷D4 = 1111 có nghĩa là không có phím nào được nhấn và quá trình quét tiếp tục cho đến khi phát hiện có nhấn phím. Tuy nhiên, nếu một trong các bit cột có giá trị 0 thì điều này có nghĩa là có phím được nhấn. Ví dụ, nếu D7÷D4 = 1101, điều này có nghĩa là một phím trong cột D5 đã được nhấn.

Chương trình 3‑9 dưới đây thực hiện chức năng phát hiện xem có bất kỳ phím nào được nhấn hay không.

Chương trình 39: Bật LED màu xanh khi phát hiện có phím được nhấn

/* Keypad_Detect.c: Matrix keypad detect
* This program checks a 4x4 matrix keypad to see whether a key is pressed or not.
* When a key is pressed, it turns on the blue LED.
* PortC 9-6 are connected to the columns and PortC 4, 2-0 are connected to the rows.
* Therefor PortC 9-6 are configured as inputs, PortC 4, 2-0 are configured as outputs
*/
#include <MKL45Z4.H>
#define GREEN_LED_PIN          (1<<5)

void delayUs (int n);
void keypad_init (void);
char keypad_kbhit (void);
int main (void)
{
keypad_init();
SIM->SCGC5 |= SIM_SCGC5_PORTD_MASK; /* enable clock to Port D */
PORTD->PCR[5] = PORT_PCR_MUX(1); /* make PTD5 pin as GPIO */
PTD->PDDR |= GREEN_LED_PIN; /* make PTD5 as output pin */
while(1)
{ if (keypad_kbhit() != 0) /* if a key is pressed? */
    PTD->PSOR |= GREEN_LED_PIN; /* if not, turn off green LED */
else
   PTD->PCOR |= GREEN_LED_PIN; /* turn on green LED */
}
}
/* this function initializes PortC that is connected to the keypad.
* All pins are configured as GPIO input pin with pullup resistor enabled.
*/
void keypad_init(void)
{
SIM->SCGC5 |= 0x0800; /* enable clock to Port C */
PORTC->PCR[0] = 0x103; /* make PTC0 pin as GPIO and enable pullup resistor*/
PORTC->PCR[1] = 0x103; /* make PTC1 pin as GPIO and enable pullup resistor */
PORTC->PCR[2] = 0x103; /* make PTC2 pin as GPIO and enable pullup resistor */
PORTC->PCR[4] = 0x103; /* make PTC4 pin as GPIO and enable pullup resistor */
PORTC->PCR[6] = 0x103; /* make PTC6 pin as GPIO and enable pullup resistor */
PORTC->PCR[7] = 0x103; /* make PTC7 pin as GPIO and enable pullup resistor */
PORTC->PCR[8] = 0x103; /* make PTC8 pin as GPIO and enable pullup resistor */
PORTC->PCR[9] = 0x103; /* make PTC9 pin as GPIO and enable pullup resistor */

PTC->PDDR = 0x017; 
/* make PTC9-6 as input pins and PTC4 and PTC2-0 as output pins */
}
/* This is a non-blocking function.
* If a key is pressed, it returns 1.
* Otherwise, it returns a 0 (not ASCII ‘0’). */
char keypad_kbhit(void)
{
int col;
PTC->PDDR |= 0x017; /* enable all rows */
PTC->PCOR = 0x017; /* Clear all row */
delayUs(2); /* wait for signal return */
col = PTC->PDIR & 0x3C0; /* read all columns */
PTC->PDDR = 0; /* disable all rows */
if (col == 0x3C0)
return 0; /* no key pressed */
else
return 1; /* a key is pressed */
}
void delayUs(int n)
{
int i; int j;
for(i = 0 ; i < n; i++) {
for(j = 0; j < 8; j++) ;
}
(2)     Nhận diện phím được nhấn

Sau khi trạng thái nhấn phím được phát hiện, bộ vi xử lý sẽ thực hiện quá trình xác định phím được nhấn là phím nào. Bằng cách quét lần lượt các hàng và đọc trên các cột ta sẽ xác định được phím bấm. Chẳng hạn bắt đầu từ hàng trên cùng, bộ vi xử lý lần lượt điều khiển một hàng xuống mức thấp tại một thời điểm, sau đó nó đọc các cột. Nếu kết quả dữ liệu đọc được tất cả là bit 1, có nghĩa không có phím nào trong hàng đó được nhấn và quá trình được chuyển sang hàng tiếp theo. Quá trình này tiếp tục cho đến khi xác định được một hàng khiến một trong các cột có giá trị bằng 0. Ví dụ 3-1 minh họa quá trình xác định một phím được nhấn.

Ví dụ 31
Từ Hình 3‑20, xác định hàng và cột của phím được nhấn cho mỗi tình huống sau đây.

(a) Trạng thái hàng D3 – D0 = 1110, Trạng thái cột D7 – D4 = 1011

(b) Trạng thái hàng D3 – D0 = 1101, Trạng thái cột D7 – D4 = 0111

Lời giải:

Từ Hình 3‑20 hàng và cột có thể được sử dụng để xác định phím được nhấn.

(a) Hàng ứng với D0 = 0 là hàng số 1 từ trên xuống và cột ứng với D6 = 0 là cột số 2 từ trái qua phải; do đó, phím số 2 đã được nhấn.

(b) Hàng ứng với D1 = 0 là hàng số 2 từ trên xuống và cột ứng với D7 = 0 là cột số 1 từ trái qua phải; do đó, phím số 4 đã được nhấn.

Hình 3-8 là lưu đồ thuật toán phát hiện và xác định phím được nhấn.

Lưu đồ thuật toán phát hiện và xác định phím được nhấn trên FRDM-KL46Z

Hình 3‑21. Lưu đồ thuật toán phát hiện và xác định phím được nhấn.

b)     Chống rung cơ học cho các phím bấm

Khi một phím bấm cơ học được đóng hoặc mở, các tiếp điểm sẽ không tạo ra tiếp xúc hoặc ngắt tiếp xúc ngay lập tức, thay vào đó các tiếp điểm sẽ mở và đóng nhiều lần trước khi chúng ổn định. Hiện tượng này được gọi là sự nảy cơ học của các tiếp xúc trong phím bấm (xem Hình 3‑22). Vì vậy, có thể xảy ra tình huống khi chương trình lần đầu tiên phát hiện một phím bấm được nhấn nhưng khi xác nhận lại xem có đúng có phím được nhấn hay không nó lại nhận được trạng thái phím không được nhấn. Một vấn đề khác được gây ra bởi sự nảy của tiếp xúc cơ học là cùng một lần nhấn phím có thể được chương trình nhận dạng thành nhiều lần nhấn phím. Sự nảy của tiếp xúc cơ học cũng xảy ra khi phím bấm được nhả. Vì các điểm tiếp xúc của phím bấm chuyển trạng thái mở và đóng nhiều lần trước khi chúng ổn định, chương trình có thể nhận biết phím khi phím được nhả như một trạng thái nhấn.

Đối với nhiều ứng dụng, nó rất quan trọng phải đảm bảo rằng mỗi lần nhấn phím hoặc nhả phím chỉ được nhận dạng là một thao tác. Một giải pháp phần mềm đơn giản để chống rung cơ khí phím bấm là khi phát hiện thấy sự chuyển đổi trạng thái tiếp xúc của phím bấm, chẳng hạn như phím được nhấn hoặc phím được giải phóng, phần mềm sẽ thực hiện trì hoãn khoảng 10 – 20 ms để chờ qua khoảng thời gian nảy cơ học của tiếp điểm trước khi đọc lại trạng thái của phím bấm để xác định có hay không một thao tác bấm hay nhả phím.

Kết nối phím bấm tới FRDM-KL46Z

(a)

Hiện tượng nảy cơ học của phím bấm

(b)

Hình 3‑22. Hiện tượng nảy cơ học của các phím bấm.

Nguyễn Kiêm Hùng

Hung K. Nguyen studied “Electronic Engineering” in both his bachelor’s and master’s degrees at the Vietnam National University, Hanoi, Vietnam. He received the bachelor’s degree in 2003. After receiving his bachelor’s degree, He worked as an internship in the Research Center of Electronics and Telecommunications. In 2006, He received the master’s degree in electronic engineering from VNU University of Engineering and Technology (VNU-UET). Before pursuing his Ph.D’s degree, He worked as a researcher at the Laboratory for Smart Integrated Systems in VNU University of Engineering and Technology for two years. In 2008, He went to Southeast University, Nanjing, China to get his Ph.D degree. He received the Ph.D. degree in Microelectronics and Solid State Electronics from Southeast University in 2013. After got his Ph.D’s degree, He returned to VNU University of Engineering and Technology to continue his research in VLSI design. He works currently as an assistant professor and senior researcher at VNU Key Laboratory for Smart Integrated Systems. His research interests mainly include multimedia processing, reconfigurable computing, and SoC designs.

Trả lời