4X4矩陣鍵盤掃描程式
4X4矩陣鍵盤掃描:
1. 4根行線的GIO均設為Output,根列線的GIO均設為Input;
2. 4根行線的GIO分別置為0111、1011、1101、1110,讀逐一讀取列線GIO的值,可確定是哪一個按鍵;
電路圖如下:
注意:
1. 圖中用作輸入的GIO,一定要有一個上拉電阻。
2. 晶片中的每一個引腳是否用作了GPIO口來用,需配置晶片的暫存器,使引腳當作GPIO口來使用,才會有效。
測試程式碼如下:
#define KEY_GIO_ROW_1 37 #define KEY_GIO_ROW_2 33 #define KEY_GIO_ROW_3 32 #define KEY_GIO_ROW_4 35 #define KEY_GIO_COL_1 22 #define KEY_GIO_COL_2 23 #define KEY_GIO_COL_3 24 #define KEY_GIO_COL_4 36 int scanKey() { int keyValue = 0; int col1Value=0,col2Value=0,col3Value=0,col4Value=0,row1Value=0,row2Value=0,row3Value=0,row4Value=0; static int press1=0,press2=0,press3=0,press4=0; static int press5=0,press6=0,press7=0,press8=0; static int press9=0,press10=0,press11=0,press12=0; static int press13=0,press14=0,press15=0,press16=0; dm365SetGPIO(KEY_GIO_ROW_1, 0); dm365SetGPIO(KEY_GIO_ROW_2, 1); dm365SetGPIO(KEY_GIO_ROW_3, 1); dm365SetGPIO(KEY_GIO_ROW_4, 1); col1Value = dm365GetGPIO(KEY_GIO_COL_1); col2Value = dm365GetGPIO(KEY_GIO_COL_2); col3Value = dm365GetGPIO(KEY_GIO_COL_3); col4Value = dm365GetGPIO(KEY_GIO_COL_4); keyValue = col1Value | (col2Value << 1) | (col3Value << 2) | (col4Value << 3); // printf("=1==keyValue = %x\n",keyValue); switch(keyValue) { case 0x0E: { if(!press1) { press1 = 1; printf("KEY 1\n"); } } break; case 0x0D: { if(!press2) { press2 = 1; printf("KEY 2\n"); } } break; case 0x0B: { if(!press3) { press3 = 1; printf("KEY 3\n"); } } break; case 0x07: { if(!press4) { press4 = 1; printf("KEY 4\n"); } } break; default: { press1 = 0; press2 = 0; press3 = 0; press4 = 0; } break; } dm365SetGPIO(KEY_GIO_ROW_1, 1); dm365SetGPIO(KEY_GIO_ROW_2, 0); dm365SetGPIO(KEY_GIO_ROW_3, 1); dm365SetGPIO(KEY_GIO_ROW_4, 1); col1Value = dm365GetGPIO(KEY_GIO_COL_1); col2Value = dm365GetGPIO(KEY_GIO_COL_2); col3Value = dm365GetGPIO(KEY_GIO_COL_3); col4Value = dm365GetGPIO(KEY_GIO_COL_4); keyValue = col1Value | (col2Value << 1) | (col3Value << 2) | (col4Value << 3); // printf("=2==keyValue = %x\n",keyValue); switch(keyValue) { case 0x0E: { if(!press5) { press5 = 1; printf("KEY 5\n"); } } break; case 0x0D: { if(!press6) { press6 = 1; printf("KEY 6\n"); } } break; case 0x0B: { if(!press7) { press7 = 1; printf("KEY 7\n"); } } break; case 0x07: { if(!press8) { press8 = 1; printf("KEY 8\n"); } } break; default: { press5 = 0; press6 = 0; press7 = 0; press8 = 0; } break; } dm365SetGPIO(KEY_GIO_ROW_1, 1); dm365SetGPIO(KEY_GIO_ROW_2, 1); dm365SetGPIO(KEY_GIO_ROW_3, 0); dm365SetGPIO(KEY_GIO_ROW_4, 1); col1Value = dm365GetGPIO(KEY_GIO_COL_1); col2Value = dm365GetGPIO(KEY_GIO_COL_2); col3Value = dm365GetGPIO(KEY_GIO_COL_3); col4Value = dm365GetGPIO(KEY_GIO_COL_4); keyValue = col1Value | (col2Value << 1) | (col3Value << 2) | (col4Value << 3); // printf("=3==keyValue = %x\n",keyValue); switch(keyValue) { case 0x0E: { if(!press9) { press9 = 1; printf("KEY 9\n"); } } break; case 0x0D: { if(!press10) { press10 = 1; printf("KEY 10\n"); } } break; case 0x0B: { if(!press11) { press11 = 1; printf("KEY 11\n"); } } break; case 0x07: { if(!press12) { press12 = 1; printf("KEY 12\n"); } } break; default: { press9 = 0; press10 = 0; press11 = 0; press12 = 0; } break; } dm365SetGPIO(KEY_GIO_ROW_1, 1); dm365SetGPIO(KEY_GIO_ROW_2, 1); dm365SetGPIO(KEY_GIO_ROW_3, 1); dm365SetGPIO(KEY_GIO_ROW_4, 0); col1Value = dm365GetGPIO(KEY_GIO_COL_1); col2Value = dm365GetGPIO(KEY_GIO_COL_2); col3Value = dm365GetGPIO(KEY_GIO_COL_3); col4Value = dm365GetGPIO(KEY_GIO_COL_4); keyValue = col1Value | (col2Value << 1) | (col3Value << 2) | (col4Value << 3); // printf("=4==keyValue = %x\n",keyValue); switch(keyValue) { case 0x0E: { if(!press13) { press13 = 1; printf("KEY 13\n"); } } break; case 0x0D: { if(!press14) { press14 = 1; printf("KEY 14\n"); } } break; case 0x0B: { if(!press15) { press15 = 1; printf("KEY 15\n"); } } break; case 0x07: { if(!press16) { press16 = 1; printf("KEY 16\n"); } } break; default: { press13 = 0; press14 = 0; press15 = 0; press16 = 0; } break; } return keyValue; } void *KeyMngThread() { int resetValue = 1; int resetCout = 0; int alarmInValue = 1; int alarmInCout = 0; while(1) { resetValue = dm365GetGPIO(GIO_RESET); if(0 == resetValue) { resetCout++; } else if(1 == resetValue) { resetCout = 0; } if(resetCout == 30) { resetCout = 0; system("rm -f /mnt/nand/sysenv.cfg"); system("/bin/sync"); // System("reboot"); system("/tmp/shutdown -r now \n"); } alarmInValue = dm365GetGPIO(GIO_ALARM_IN); if(0 == alarmInValue) { dm365SetGPIO(GIO_LED,0); //control led off . } else if(1 == alarmInValue) { dm365SetGPIO(GIO_LED,1); //control led on . } scanKey(); usleep(100000); } }
程式碼中dm365SetGPIO( )裡將GPIO預設設定為Output,
dm365GetGPIO( )中將GPIO預設設定為Input,
通過字元裝置驅動實現應用層操作底層GPIO。
相關推薦
4X4矩陣鍵盤掃描程式
4X4矩陣鍵盤掃描: 1. 4根行線的GIO均設為Output,根列線的GIO均設為Input; 2. 4根行線的GIO分別置為0111、1011、1101、1110,讀逐一讀取列線GIO的值,可確定是哪一個按鍵; 電路圖如下: 注意: 1. 圖中用作輸入的GIO,一
樹莓派的矩陣鍵盤掃描程式,python開發
樹莓派可以很方便的拓展矩陣鍵盤用做人機互動,今天教大家如何驅動4*4矩陣鍵盤。 先貼上程式碼: import time class keypad(object):KEYPAD=[['1','2','3','*'],['4','5','6','#'],['7','8','9
51微控制器(AT89C52)矩陣鍵盤檢測程式
矩陣鍵盤檢測思路:行線設為輸出、列線設為輸入獲得列碼,行線設為輸入、列線設為輸出獲得行碼,由行列碼確定鍵值。 本程式可改進的地方:按鍵狀態機中,將等待按鍵釋放語句移到第三個狀態中,可進一步提高按鍵掃描程式效率。 #include<reg52.h> #define
矩陣鍵盤掃描原理詳解——微控制器
矩陣鍵盤掃描原理詳解 根據原理圖 鍵盤掃描方法是:行線P10~P13為輸出線,列線P14~P17為輸入線。一開始微控制器將行線(P10~P13)全部輸出低電平,此時讀入列線資料,若列線全為高電平則沒有鍵按下,當列線有出現低電平時呼叫
五、基於Verilog的低功耗矩陣鍵盤掃描設計
1、前言 本次設計了一個低功耗的矩陣鍵盤驅動電路驅動一個 16 鍵( 4x4 )的矩陣鍵盤。每個按鍵對應 0~15 的一個值成為按鍵對應的鍵值。當某個按鍵被按下時,輸出該按鍵對應的鍵值;按鍵被釋放後,該鍵值不再輸出。 2、鍵盤電路分析 如下圖,鍵盤電路中共有 16 個
【按鍵】短按,長按,按鍵釋放,三種模式的按鍵掃描程式(軟體消抖動)--- 矩陣鍵盤
請先閱讀上篇: 短按,長按,按鍵釋放,三種模式的按鍵掃描程式(軟體消抖動) 上面的程式適用於單個按鍵,那是不是也可以適用於矩陣鍵盤呢? 答案是肯定的。 接下來在這裡做一個簡單的擴充套件,具體框架不用改變,所以具體的框架內容和思路在這裡不詳述了,自行參考上篇文章,這裡就說說擴充套件
51單片機實現矩陣鍵盤行掃描
order 方式 [] image 51單片機 char borde 矩陣鍵盤 結果 ———————————————————————————————————————————— 分類: 按結構原理分: 觸點式開關按鍵 無觸點開關按鍵 接入方式 獨立式
疑問----單片機矩陣鍵盤行列反轉掃描法
inux png src 網上 target nbsp 檢測 開發板 col 學到矩陣鍵盤這一塊對網上別人寫的C代碼有些疑問,希望有能看到的大牛幫助解答。 矩陣鍵盤和獨立鍵盤原理圖: 原理:對於圖右側的矩陣鍵盤,把P3口的低四位(P3.0 ~ P3.3)和高四位(P3
C51中4X4鍵盤掃描(非反轉法)
#include <reg52.h> #define uchar unsigned char #define uint unsigned int uchar KEYIN; void DelayMs(uint ms); //延時函式宣告; uc
STM32F407實現矩陣鍵盤程式
由於最近在做一個有關按鍵的專案,有用到矩陣鍵盤,因為網上有關矩陣鍵盤的程式很少,所以我就自己寫一個發上去供大家參考,該程式所用到的GPIO口是PD0--PD7,至於矩陣鍵盤的原理就不一一描述了,直接上程式,具體程式如下: //GPIO初始化函式 void GPIO_Con
基於STM32L151//STM32F407的矩陣鍵盤程式(不規則介面):
void KeyPress(void){ int KeyValues; while(1) { if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)||GPIO_
單片機入門-矩陣鍵盤控制數碼管顯示
矩陣 right 控制 入門 i/o num .cn mar oid 任務簡述:通過按下4X4矩陣鍵盤實現數碼管對應顯示數字 實現方式:通過行列分接法,可以節省使用單片機的I/O口,掃描矩陣鍵盤是否有按下,判斷P2端口得到的值。 protues 硬件系統 單片機晶振復位電
【按鍵】短按,長按,按鍵釋放,三種模式的按鍵掃描程式(軟體消抖動)
先來說一下這三種模式的意思: 1. 短按模式:單擊按鍵時,返回一次有效按鍵值;長按時也只返回一次有效按鍵值。這樣可以有效地排除因不小心長按帶來的返回多次有效按鍵,進而執行多次按鍵處理程式。 2. 長按模式: 單擊按鍵時,返回一次有效按鍵;長按時,返回多次有效按鍵值。這樣可以很快的調節
基於ROS使用Arduino讀取矩陣鍵盤的輸入
1. 硬體 Arduino控制板:1個; 矩陣鍵盤:1個; 杜邦線:若干; 1.1 接線方式 接線方式為: 來張實際的照片(略麻煩): 2 程式 #include <Keypad.h> #include &l
51微控制器——矩陣鍵盤的檢測
4x4鍵盤檢測程式,按下鍵後相應的程式碼顯示在數碼管上 #include<reg51.h> sbit dula=P2^6; sbit wela=P2^7; unsigned char i=100; unsigned char j,k,temp,key; void del
使用Python+OpenCV構建文件掃描程式
首先給各位展示原始圖片: 使用自己搭建的文件掃描程式掃描效果如下圖: 圖一:查詢輪廓 圖二:邊緣檢測 圖三:應用透視變換和閾值 使用OpenCV構建文件掃描程式只需三個簡單步驟即可完成: 第1步:&n
鍵盤對於程式設計師的價值
導語:有的準程式設計師,並沒有把自己的鍵盤當作養家餬口的工具,更沒有把它當作實現自我價值、創造自我輝煌的夥伴,而是狼狽為奸,用它打小報告,以期幹掉那些所謂對自己不利的人。他們敲出來的已經不是一行行精彩絕倫的程式碼,而是一段段斷章取義、顛倒黑白的漢字。如此年少,便已深入歧途。 &
新型的按鍵掃描程式(轉載)
不過我在網上游逛了很久,也看過不少源程式了,沒有發現這種按鍵處理辦法的蹤跡,所以,我將他共享出來,和廣大同僚們共勉。我非常堅信這種按鍵處理辦法的便捷和高效,你可以移植到任何一種嵌入式處理器上面,因為C語言強大的可移植性。 同時,這裡面用到了一些分層的思想,在微控
AC620FPGA學習筆記——矩陣鍵盤
AC620FPGA學習筆記——矩陣鍵盤 keyboard 硬體結構 整體框架 引腳配置 程式碼部分 頂層程式碼 Keyboard keyboard 工程地址:h
網路漏洞掃描程式OpenVAS
開放漏洞評估系統(Open Vulnerability Assessment System,Open VAS)是一個開源的漏洞評估掃描器,也是攻擊者通常用來大規模掃描網路的漏洞管理工具,其中包括大約有47000個漏洞的資料庫,然而,與其他商業工具如Nessus 、nexpose相比,這可以被認為是一個慢的網路