1. 程式人生 > >關於STM32F103型號的矩陣按鍵的程式書寫

關於STM32F103型號的矩陣按鍵的程式書寫

最近參加電子大賽要寫一個矩陣按鍵,剛開始寫了好長時間換了好幾個矩陣按鍵都不好使,但是 我感覺我的程式和原理都沒有錯,除錯了好久也沒有發現問題在哪?我按照我自己的思路把程式重寫了一遍bug消失了,程式很好的執行。程式貼出來,紀念一下。

#include "keypad.h"
#include "stm32f10x.h"
#include "delay.h"
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/

/*本檔案是矩陣按鍵功能檔案,使用方法是:直接調KEYPAD_Scan函式得到一個返回值*/

/*************************************************************************/
/*************************************************************************/
/*************************************************************************/

//函式名:KEYPad_Init1
//引數:無
//功能:行檢測初始化
//返回值;無
void KEYPad_Init1(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);//開啟時鐘,使能GPIOB時鐘
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	//上拉輸入 B0-B3
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOF, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;	//下拉輸入 B4-B7
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOF, &GPIO_InitStructure);
}

//函式名:KEYPad_Init2
//引數:無
//功能:列檢測初始化
//返回值:無
void KEYPad_Init2(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);//開啟時鐘,使能GPIOB時鐘
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;	//下拉輸入 B0-B3
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOF, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	//上拉輸入 B4-B7
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOF, &GPIO_InitStructure);
}

//函式名:掃描函式
//入口引數:無
//返回值:鍵值
//功能:矩陣按鍵掃描,返回一個鍵值
u16 KEYPAD_Scan()
{
	static u16 keyvalue = 0;
	u32 readvalue = 0;
	KEYPad_Init1();
	readvalue = GPIO_ReadInputData(GPIOF);
	readvalue &= 0x00ff;
	//return readvalue;
	if(readvalue != 0x000f)
	{
		delay_ms(8);//消抖10ms
		if(readvalue != 0x000f)
		{
			readvalue = GPIO_ReadInputData(GPIOF);//再次讀取狀態
			readvalue &= 0x00ff;
			//return readvalue;
			switch(readvalue)
			{
				case (0x001f):keyvalue = 0;break;
				case (0x002f):keyvalue = 1;break;
				case (0x004f):keyvalue = 2;break;
				case (0x008f):keyvalue = 3;break;
			}
			//return readvalue;
			KEYPad_Init2();
			delay_ms(5);
			readvalue = GPIO_ReadInputData(GPIOF);//再次讀取狀態
			readvalue |= 0x00f0;
			readvalue &= 0x00ff;
			//return readvalue;
			switch(readvalue)
			{
				case (0x00f1):keyvalue += 0;break;
				case (0x00f2):keyvalue += 4;break;
				case (0x00f4):keyvalue += 8;break;
				case (0x00f8):keyvalue += 12;break;
			}
			
			while(readvalue != 0x00f0)//檢測按鍵鬆開
			{
				readvalue = GPIO_ReadInputData(GPIOF);//再次讀取狀態
				readvalue |= 0x00f0;
				readvalue &= 0x00ff;
			}
			//return readvalue;
		}
	}
	return keyvalue;
}

相關推薦

關於STM32F103型號矩陣按鍵程式書寫

最近參加電子大賽要寫一個矩陣按鍵,剛開始寫了好長時間換了好幾個矩陣按鍵都不好使,但是 我感覺我的程式和原理都沒有錯,除錯了好久也沒有發現問題在哪?我按照我自己的思路把程式重寫了一遍bug消失了,程式很好的執行。程式貼出來,紀念一下。 #include "keypad.h"

STM32F103學習筆記(一):簡單的按鍵程式

通過幾個按鍵,來控制LED燈的開關狀態。沒有涉及到中斷,只是簡單的按鍵程式 程式包括key.c,key.h;led.c,led.h;以及main函式 一、LED程式 led.h #ifndef __LED__H #define __LED__H #include "

關於獨立按鍵矩陣按鍵程式(51微控制器)

發一個51微控制器的鍵盤掃描程式,演算法簡單有效                                       再給大家分享一個不錯按鍵程式(來自ourdev)/**************************************** 鍵盤_不採用定時

51單片機:獨立按鍵矩陣按鍵控制數碼管

#define clas 4行 ++ 浪費 down 技術分享 sig .com 一,獨立按鍵註意一下幾點 >按下的時候,電壓被拉低,所以IO口要傳低電平( 0x0 ) >按下的時候要消除抖動 ( 延時10ms ),在判斷,是否還是低電平,再做業務處理 下

C51 矩陣按鍵 個人筆記

矩陣按鍵 電路 每個按鍵一端和同行一端相連(JP4的高4位),另一端和同列一端相連(JP4的低4位) 判斷按鍵是否按下: 法一:逐行掃描 for(int i = 8 ; i>3 ; i-- ) { JP4^i = 0; If ( 低四位不全為1)

曉萌最近在做一個翻轉圖片的應用,你可能也知道,圖片其實是由一個個的點組成的。於是,曉萌想先做一個可以翻轉矩陣程式,來解決他問題的核心部分。

曉萌最近在做一個翻轉圖片的應用,你可能也知道,圖片其實是由一個個的點組成的。於是,曉萌想先做一個可以翻轉矩陣的程式,來解決他問題的核心部分。 輸入格式 輸入第一行包括由空格分開的整數 M,N,T(0<N,M<200),T 的值為 0 或 1。其中M 和 N 分別表示待

51微控制器-矩陣按鍵

1 /**************************************************************************************

關於CT107D開發板矩陣按鍵前兩列不工作問題的研究

CT107D開發板矩陣按鍵原理圖如下所示: 其中CON3的1引腳和2引腳相連構成矩陣鍵盤。 //經典矩陣按鍵處理函式 unsigned char keyProcess(void) { unsigned char keyTemp = 0; unsigned c

獨立按鍵矩陣按鍵

 我們和微控制器之間進行資訊互動,主要包含兩大類,輸入裝置和輸出裝置。前邊講的LED小燈、數碼管、點陣都是輸出裝置,這節課我們學習一下最常用的輸入裝置——按鍵。在本節課的學習過程中我們還會穿插介紹一點硬體設計的基礎知識。 8.1 微控制器最小系統電路解析

c語言程式書寫風格----空格的合理使用

程式規範的重要性: 對於許多初學者來說,敲程式碼的時候根本不知道程式的書寫還有規範這一說,如果從事程式設計師IT行業,試想一下以後工作的時候需要你敲得程式碼將會是成千上萬行,如果按照你的隨意去書寫或者不規範的方法去書寫,當軟體測試時,誰能看懂你的程式碼,就算能看懂,效率也會降低幾倍,所以每個公司

Java 程式書寫規範

Java 程式書寫規範 任何一門語言都是用來交流的,都有自己的一套書寫規範,Java 也不例外。好的命名規範可以讓你的程式更專業,更容易被別人理解,更好維護。瞭解命名規範,可以更好的學習和記憶 Java 類庫中類和函式。下面的幾個原則是編寫 Java 程式必須遵守的如果沒有非

STM32F407實現矩陣鍵盤程式

由於最近在做一個有關按鍵的專案,有用到矩陣鍵盤,因為網上有關矩陣鍵盤的程式很少,所以我就自己寫一個發上去供大家參考,該程式所用到的GPIO口是PD0--PD7,至於矩陣鍵盤的原理就不一一描述了,直接上程式,具體程式如下: //GPIO初始化函式 void GPIO_Con

51微控制器:獨立按鍵矩陣按鍵控制數碼管

一,獨立按鍵注意一下幾點 >按下的時候,電壓被拉低,所以IO口要傳低電平( 0x0 ) >按下的時候要消除抖動 ( 延時10ms ),在判斷,是否還是低電平,再做業務處理 下面這段程式,就是通過一個獨立按鍵連線到p1口,控制靜態數碼管的 一段 進行亮和滅的切換。 #include &l

msm8909矩陣按鍵驅動筆記

此文章僅作本人自己筆記使用,文章結束部分有本人除錯過程,可以借鑑,由於沒有仔細排版,所以可閱讀性不高,讀者見諒! 一般按鍵驅動有兩種,一個是矩陣鍵盤驅動,一個是GPIO介面鍵盤驅動 矩陣鍵盤路徑 : kernel/driers/input/keyboard/matrix_keypad.c :一

基於STM32L151//STM32F407的矩陣鍵盤程式(不規則介面):

void KeyPress(void){           int KeyValues;    while(1)  {   if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)||GPIO_

arm驅動程式——按鍵程式4_poll(韋東山的視訊總結及針對linux-2.6.30)

static irqreturn_t button_irq(int irq,void *dev) {    irq_dec = (struct pindec*)dev;    /*修改定時器的超時時間*/    mod_timer(&second_key_timer,jiffies+HZ/100); 

微控制器矩陣按鍵長短按

實習的時候,同事給了我一個矩陣鍵盤程式,竟然長達1千多行程式碼,當時我就嚇尿了。仔細分析程式碼,也未見其獨到之處,僅僅是普通的按鍵掃描以及判斷長短按。但其中使用的結構很複雜,中間產生的臨時變數特別多,而且指標很多,也不容易移植。稍微搜尋一下網上的程式,也並不是很詳盡。這裡貼

STM32按鍵程式

u8 KEY_Scan(u8 mode) { static u8 key_up=1;//按鍵按鬆開標誌 if(mode)key_up=1; //支援連按 if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1

MPI實現矩陣乘法程式--實現MPI傳遞連續陣列

怎麼樣用用MPI編寫兩個n階的方陣A和B的相乘程式,結果存放在方陣C中,A、B和C都在節點0中呢? //#include<stdio.h> //#include<math.h> //#pragma comment(lib,"mpi.lib") #

51微控制器簡潔按鍵程式

最為精闢和實用的按鍵處理程式;1.新型的按鍵掃描程式;不過我在網上游逛了很久,也看過不少源程式了,沒有;同時,這裡面用到了一些分層的思想,在微控制器當中也;以下假設你懂C語言,因為純粹的C語言描述,所以和;核心演算法:;unsignedcharTrg;;unsignedcha