您好,登錄后才能下訂單哦!
本篇內容主要講解“單片機矩陣按鍵設計方法的實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“單片機矩陣按鍵設計方法的實現”吧!
如果我們每個按鍵用兩個位表示,那么一組端口8只引腳則可以實現C82=16個按鍵的輸入。按鍵4×4布置,按鍵的鍵位表示為行和列的交點,同樣可以準確的表示按鍵輸入。
1. 設計電路。
按鍵布置為4行×4列。P1.0、P1.1、P1.2、P1.3分別連接第1、2、3、4行按鍵,P1.4、P1.5、P1.6、P1.7分別連接第4、3、2、1列按鍵。
當某一按鍵被按下時,對應的行和列對應的引腳被接通而發生變化。由于每一個按鍵對應了唯一的行列,因此可以精確確定按鍵的位置。
2. 程序設計的思路。
逐行輸出低電平,其它引腳輸出高電平。對于輸出低電平每一行,如果某一列有按鍵被按下,則對應的引腳會被下拉為低電平。檢測低電平所在的位置,即可得到按鍵所在列。行和列都確定的情況下,即得到按鍵的所處位置。
本設計中,程序功能設計為當按下某一按鍵時,動態數碼管上顯示按鍵所在行列。
3. 行和列的按鍵編碼
(1)掃描檢測行時P1輸出的編碼
正在檢測的行 | P1輸出 | |||||
P1.3 | P1.2 | P1.1 | P1.0 | 二進制編碼 | 十六進制編碼 | |
1 | 1 | 1 | 1 | 0 | 11111110 | 0xFE |
2 | 1 | 1 | 0 | 1 | 11111101 | 0xFD |
3 | 1 | 0 | 1 | 1 | 11111011 | 0xFB |
4 | 0 | 1 | 1 | 1 | 11110111 | 0xF7 |
(2)檢測時編碼所對應的列
P1輸入 | 被按下按鍵對應的列 | |||||
P1.7 | P1.6 | P1.5 | P1.4 | 二進制編碼 | 十六進制編碼* | |
1 | 1 | 1 | 0 | 1110 | 0xEX | 4 |
1 | 1 | 0 | 1 | 1101 | 0xDX | 3 |
1 | 0 | 1 | 1 | 1011 | 0xBX | 2 |
0 | 1 | 1 | 1 | 0111 | 0x7X | 1 |
*X表示因所在行不同,數值有所變化。 |
4. 程序設計
(1)列數的檢測
/** * @brief 獲取按鍵所在列 * * @return 返回1-4或F。F表示無按鍵。 */ UCHAR getColumn() { UCHAR tmp = P1; tmp = tmp >> 4; // 請結合P1輸入表思考:這是什么操作? switch (tmp) { case 0xF /* 0b1111 */: return 0xf; case 0xE /* 0b1110 */: return 4; case 0xD /* 0b1101 */: return 3; case 0xB /* 0b1011 */: return 2; case 0x7 /* 0b0111 */: return 1; } }
(2)行數和按鍵的檢測
/** * @brief 掃描輸入的按鍵并將序號顯示在數碼管上。 * */ void inputKeyScan() { UCHAR row = 0x10, column = 0x10; UCHAR i; const UCHAR rows[] = {0xFE, 0xFD, 0xFB, 0xF7}; delayNms (20); // 消除抖動 for (i = 0; i < 4; i++) { P1 = rows[i]; if (getColumn() != 0xf) { row = 0x10, column = 0x10; row = i + 1; column = getColumn(); display4N(0x10, 0x10, row, column); } } display4N(0x10, 0x10, 0x10, 0x10); // 請思考這是為什么? }
(3)主函數調用
/** * @brief 主函數 * */ void main() { P1 = 0xFF; while (1) { inputKeyScan(); } }
分別在4個數碼管上顯示數字的函數
/** * @brief 分別在4根數碼管上顯示數字。每個數字的范圍都是0-F。 * * @param n1 第一個數碼管上顯示的數字。 * @param n2 第二個數碼管上顯示的數字。 * @param n3 第三個數碼管上顯示的數字。 * @param n4 第四個數碼管上顯示的數字。 */ void display4N(UCHAR n1, UCHAR n2, UCHAR n3, UCHAR n4) { P2 = 0x01; // 選擇第一個數碼管 if (n1 >= 0 && n1 < 0x10) P0 = HexBCD[n1]; // 顯示n1 else P0 = 0xFF; delayNms(5); P2 = 0x02; // 選擇第二個數碼管 if (n2 >= 0 && n2 < 0x10) P0 = HexBCD[n2]; // 顯示n2 else P0 = 0xFF; delayNms(5); P2 = 0x04; // 選擇第三個數碼管 if (n3 >= 0 && n3 < 0x10) P0 = HexBCD[n3]; // 顯示n3 else P0 = 0xFF; delayNms(5); P2 = 0x08; // 選擇第四個數碼管 if (n4 >= 0 && n4 < 0x10) P0 = HexBCD[n4]; // 顯示n4 else P0 = 0xFF; delayNms(5); }
到此,相信大家對“單片機矩陣按鍵設計方法的實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。