1. 程式人生 > >4X4矩陣鍵盤掃描程式

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相比,這可以被認為是一個慢的網路