1. cấu tạo ma trận phím 4x4.
- Ma trận phím 4x4 gồm 16 nút bấm được kết nối thành 4 hàng và 4 cột.
- Phím bấm được nối thành ma trận gồm 4 hàng và 4 cột, các hàng và các cột được nối với các chân cổng vào ra của vi điều khiển. Khi một phím được bấm, nó sẽ nối một hàng và một cột tương ứng. Như vậy ta sẽ có 8 nút nhấn mà chỉ mất 8 chân vi điều khiển . Khi nút 1 được nhấn thì nó nối giưa cột 1 hàng 1. Còn nút 2 được nhấn thì cột 2 và hàng 1 được nối hay nút 10 được nhấn thì nối giưa cột 2 và hàng 3… cứ như vậy tới nút thứ 16.
- Việc ghép nối giao tiếp với bàn phím với vi sử lý được ghép nối thành một ma trận hay gọi là ma trận phím. Một ma trận n hàng và m cột có thể ghép nối với nhau tối đa m*n phím chức năng.
- Các phím nhấn phân ra làm 2 kiểu: Kiểu phím nhấn thường hở và kiểu phím nhấn thường đóng.
- Khi sử dụng các phím nhấn, chúng ta thường gặp vấn đề sau:
+ Sự rung phím: Khi phím hở thì nó cho mức áp cao, ngay khi phím được nhấn xuống, nó sẽ kéo mức áp xuống mức thấp, nhưng do hiện tượng rung phím, lúc này có sự rung động ở tiếp xúc điểm, khiến cho tiếp điểm lúc dính lúc hở và mức áp sẽ dao động lúc lên lúc xuống và phải sau một lúc mới ổn định được ở mức thấp. Khi bỏ phím nhấn ra, chúng ta cũng gặp hiện tượng tương tự nhưng ít tác hại hơn. Khi dùng phím nhấn với các ic lập trình có phản ứng cực nhanh hiện tượng rung phím sẽ gây ra các điều khiển sai. Khi viết chương trình cho các phím nhấn, chúng ta phải chú ý đến ảnh hưởng của hiện tượng rung phím, nhất là mỗi khi phím được đóng lại. Trong thực hành, người ta thường dùng một đoạn chương trình làm chậm khoảng 3ms đến 10ms và cho dò lại lần nữa trạng thái của phím để tránh sự sai lầm có thể xẩy ra do hiện tượng rung phím.
2. Thuật toán quét phím.
Để đọc giá trị của phím bấm ta sẽ sử dụng thuật toán “quét phím”. Có 2 cách quét phím là quét theo cột hay quét theo hàng
- Quét hàng: Ta lần lượt xuất tín hiệu mức 0 ra các hàng (khi một hàng là mức 0 thì tất cả các hàng khác phải là mức 1). Sau đó kiểm tra các cột nếu cột nào có mức logic 0 thì phím có tọa độ hàng và cột đó được ấn.
- Quét cột: Ta lần lượt xuất tín hiệu mức 0 ra các cột. sau đó kiểm tra các hàng nếu hàng nào có mức logic 0 thì phím có tọa độ hàng và cột đó được ấn.
-Các chân P1.0, P1.1, P1.2, P1.3 (các hàng) được thiết lập là các chân INPUT, còn lại các chân P1.4, P1.5, P1.6, P1.7 (các cột) là các chân OUTPUT (ở mức logic ‘0’).
+ Cho COL1 = 0 (COL[2..4] = 1), kiểm tra trạng thái của các hàng: ROWA= ROWB= ROWC= ROWD=1: vậy kết luận không có nút được bấm trên COL1.
+ Cho COL2 = 0 (COL[1,3,4] = 1), kiểm tra trạng thái của các hàng: ROWA=ROWB=ROWD=1, ROWC =0: vậy kết luận có nút nằm trên hàng C, cột 2 được bấm (SW9).
+ Cho COL3 = 0 (COL[1,2,4]=1): ROWA = ROWB = ROWC= ROWD=1: vậy kết luận không có nút được bấm trên COL3.
+ Cho COL4 = 0 (COL[1,2,3]=1): ROWA= ROWB= ROWC= ROWD=1: vậy kết luận không có nút được bấm trên COL4.
Quét tương tự đối với những nút bấm khác.
3. Các hàm với ma trận phím.
- Tạo mã cho ma trận phím 4X4:
static unsigned char KEY_4X4[4][4]={'1','2','3','4', '5','6','7,’8’, '9','10','11','12', '13','14','15','16'}; - Hàm kiểm tra nút có được bấm hay không.
int1 ButtonIsPush(void) {
output_low(ROW1); output_low(ROW2); output_low(ROW3);
output_low(ROW4); if((input(COL1)==0)|(input(COL2)==0)|(input(COL3)==0)|(input(COL4)==0)) return 1; else return 0; } - Hàm lấy giá trị phím bấm: unsigned char get_key_4x4() { unsigned char i; if(ButtonIsPush()) { delay_ms(5); if(ButtonIsPush()) { for(i=0;i<4;i++) { check_row(i);
if(!input(COL1)) return KEY_4X4[3-i][0]; if(!input(COL2)) return KEY_4X4[3-i][1]; if(!input(COL3)) return KEY_4X4[3-i][2]; if(!input(COL4)) return KEY_4X4[3-i][3]; }
} } return 0; }