Chào các bạn.
Mình không biết phương pháp này các bạn biết chưa, hoặc đã ai post chưa. Nhưng đó là mình suy nghĩ và code ra chứ không hề copy ý tưởng hay code của ai khác :D.
Phương pháp dựa trên dùng ngắt Timer0 dùng cho PIC16F887 do đó sẽ rất là tối ưu, tất nhiên có thể dùng cho tất cả các loại PIC và vi điều khiển khác.
Cấu tạo của Keypad:
Nội dung của phương pháp này như sau, rất đơn giản giống tư tưởng của các phương pháp scan truyền thống:
B1. Cho các cột = 1
B2. Đọc các hàng, nếu hàng nào = 1, thì sau khoảng 10 đến 15ms thì lại đọc tiếp. Nếu vẫn = 1 thì à, đúng là phím bấm rồi, ke ke. Như vậy xác định được hàng nào rồi nha. Cho vào biến row_num.
B3. Cho row_num = 1, đọc các cột xem, cột nào = 1 thì đó là cột bấm đó, gán vào biến col_num. Chờ khi phím nhả thì gọi hàm thực hiện theo từng phím key_function();
Rất đơn giản như thế nhưng mình thực hiện rất tối ưu, các bạn có thể tham khảo:
| void scanKeypad(void){ unsigned char i; // Define i as register later // if state 0 then set column to 1, and see the change of row switch(progress){ case 0: // set all column (4 low bit) as output, and row as input, and write ‘1′ to column tris_keypad = 0xF0; port_keypad |= 0×0F; // if value of row diffirent than 0,then set progress to 1 // and set Tcycle = 10 if ((port_keypad & 0xF0) != 0) { // Determine next state progress = 1; cycle_1 = 10; }else{ progress = 0; }; break; // Progress 1, check after 10 ms |
Bài toán của mình chỉ thực hiện sau khi nhấn phím nên mình mới chờ khi nhả phím. Còn để xác định phím hold hay là nhấn thì dùng thêm process thứ 3, sau thời gian khoảng 250ms nữa hoặc hơn tùy bạn, kiểm tra lại trạng thái của phím bấm đó, nếu thấy vẫn = 1 thì tức là trạng thái hold, còn lại là trạng thái nhấn phím.
Các biến được dùng trong hàm quét phím có thể được khai báo bằng Macro và khai báo biến global.Mình dùng các thanh ghi làm biến, các bạn chú ý dùng để không trùng vào các module đang dùng.
| //Define for keypad on PORTD #define port_keypad PORTD #define tris_keypad TRISD #define progress TXREG //process variable #define cycle_1 CCPR2H // 10ms |
Vậy chỉ cần thay PORTD bằng bất kì port nào khác mà keypad nối vào là được.
Còn hàm key_function() dùng để thực hiện các lệnh của phím, tùy các bạn.
| void key_function(void){ switch(row_num){ case 1: switch(col_num){ case 1: //Key 1 case 2: // Key 2 case 3: // Key 3 …………………. |
Chú ý: các bạn gọi hàm này trong hàm ngắt của Timer, bao nhiêu ms hay ns là tùy bạn.
Chúc các bạn thành công.
Các bài viết liên quan:
1 comment
Posted in Lập trình, Microchip PIC
Written on Fri, 18 July 2008 at 6:17 am
Tags: keypad, Microchip, PIC
If you liked this post, then consider subscribing to our full RSS feed.



có ai không giúp mình với mình sắp thi rui ma không biết thế nào về C cả……………………cảm ơn trước
Reply to Phạm Thành Nam