STM32--矩陣鍵盤的設計實現
關於STM32的矩陣鍵盤實現
專案開發或者日常實驗中有時候需要用到多個按鍵,但微控制器IO口資源本身並不多,如果為每一個按鍵都分配一個IO的話未免太過浪費,所以使用矩陣鍵盤可以儘可能的節省微控制器IO口資源。
開發準備:
1.系統:Windows
2.軟體:Keil5
3.微控制器:STM32F103C8T6
矩陣鍵盤與普通的一個IO對應一個按鍵的普通鍵盤不同。如圖所示,16個按鍵通過圖中的電路連線,構成了行和列,而只僅僅引出了8條線路,所以只需要8個IO口就能識別16個按鍵。與之類似的還有4x2矩陣鍵盤、3x3矩陣鍵盤等。
掃描矩陣鍵盤的鍵值可以使用逐行(列)掃描法。在STM32中,4個行IO設定為上拉輸入,4個列IO設定為推輓輸出低電平。當其中一個按鍵按下時,該按鍵對應的行IO口會被置為低電平,這時,將4個列IO逐個拉高,每拉高一個的同時檢測行IO的電平,如果行IO的電平隨著變化的話,就能確定哪個按鍵按下。當然,設定列IO為輸入,或者下拉也是可以的,原理同上。
實驗裡使用2x4的矩陣鍵盤檢測(原理一樣,只是少了兩行掃描而已)。
/*****GPIO口配置*****/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pins : Rowline1_Pin Rowline2_Pin */
GPIO_InitStruct.Pin = Rowline1_Pin|Rowline2_Pin; //行IO下拉輸入
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pins : Column1_Pin Column2_Pin Column3_Pin Column4_Pin */
GPIO_InitStruct.Pin = Column1_Pin|Column2_Pin|Column3_Pin|Column4_Pin;//列IO推輓輸出,無上下拉
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, Column1_Pin|Column2_Pin|Column3_Pin|Column4_Pin, GPIO_PIN_SET);
}
/*********列IO操作巨集定義*********/
#define Column1_OUT_Low HAL_GPIO_WritePin(Column1_GPIO_Port, Column1_Pin, GPIO_PIN_RESET)
#define Column2_OUT_Low HAL_GPIO_WritePin(Column2_GPIO_Port, Column2_Pin, GPIO_PIN_RESET)
#define Column3_OUT_Low HAL_GPIO_WritePin(Column3_GPIO_Port, Column3_Pin, GPIO_PIN_RESET)
#define Column4_OUT_Low HAL_GPIO_WritePin(Column4_GPIO_Port, Column4_Pin, GPIO_PIN_RESET)
#define Column1_OUT_High HAL_GPIO_WritePin(Column1_GPIO_Port, Column1_Pin, GPIO_PIN_SET)
#define Column2_OUT_High HAL_GPIO_WritePin(Column2_GPIO_Port, Column2_Pin, GPIO_PIN_SET)
#define Column3_OUT_High HAL_GPIO_WritePin(Column3_GPIO_Port, Column3_Pin, GPIO_PIN_SET)
#define Column4_OUT_High HAL_GPIO_WritePin(Column4_GPIO_Port, Column4_Pin, GPIO_PIN_SET)
/*********行IO操作巨集定義*********/
#define Rowline1_INPUT_Read HAL_GPIO_ReadPin(Rowline1_GPIO_Port, Rowline1_Pin)
#define Rowline2_INPUT_Read HAL_GPIO_ReadPin(Rowline2_GPIO_Port, Rowline2_Pin)
uint8_t key_scan(void){
uint8_t i, keynum = 0;
if (Rowline1_INPUT_Read == GPIO_PIN_SET){ //當有按鍵按下
for (i = 1; i <= 4; i++){
if (i == 1) Column1_OUT_Low; //逐個拉低每列的IO
else if (i == 2) Column2_OUT_Low;
else if (i == 3) Column3_OUT_Low;
else if (i == 4) Column4_OUT_Low;
if (Rowline1_INPUT_Read == GPIO_PIN_RESET){ //如果檢測到行IO電平跟著變化,則判斷為該按鍵按下
keynum = i;
if (i == 1) Column1_OUT_High;
else if (i == 2) Column2_OUT_High;
else if (i == 3) Column3_OUT_High; //每次列IO電平操作之後記得復原
else if (i == 4) Column4_OUT_High;
break;
}
}
}else if (Rowline2_INPUT_Read == GPIO_PIN_SET){
for (i = 1; i <= 4; i++){
if (i == 1) Column1_OUT_Low;
else if (i == 2) Column2_OUT_Low;
else if (i == 3) Column3_OUT_Low;
else if (i == 4) Column4_OUT_Low;
if (Rowline2_INPUT_Read == GPIO_PIN_RESET){
KeyValue.keynum = i+4;
if (i == 1) Column1_OUT_High;
else if (i == 2) Column2_OUT_High;
else if (i == 3) Column3_OUT_High;
else if (i == 4) Column4_OUT_High;
break;
}
}
}
return keynum;
}
上述程式碼可以檢測到哪個按鍵按下,但在實際專案開發途中,按下以及鬆開都需要進行一系列的消抖操作來判斷到底是真的按下跟真的鬆開。關於這個問題,下文會詳細的描述。
相關文章
- 矩陣鍵盤原理剖析矩陣
- C51矩陣鍵盤掃描程式矩陣
- 51、52微控制器使用矩陣鍵盤矩陣
- 51微控制器—矩陣鍵盤-程式碼矩陣
- C++實現蛇形矩陣C++矩陣
- OpenCL之矩陣乘法實現矩陣
- 程式設計師的鍵盤程式設計師
- Hadoop 2.6 使用Map Reduce實現矩陣相乘1 矩陣轉置Hadoop矩陣
- 矩陣計算矩陣
- 數倉實踐:匯流排矩陣架構設計矩陣架構
- 計算矩陣的秩矩陣
- iOS表情鍵盤的完整實現iOS
- 巨大的矩陣(矩陣加速)矩陣
- 51微控制器P1口的4*4矩陣鍵盤電路上…矩陣
- 資料結構實驗 二維矩陣的實現資料結構矩陣
- C#實現的三種方式實現模擬鍵盤按鍵C#
- Windows 8鍵盤設計的背後Windows
- 矩陣:如何使用矩陣操作進行 PageRank 計算?矩陣
- c語言中實現4行3列矩陣和3行4列矩陣的運算C語言矩陣
- C語言實現矩陣螺旋輸出C語言矩陣
- 灰度共生矩陣GLCM及其matlab實現矩陣Matlab
- 12.2 實現鍵盤模擬按鍵
- js實現阻止指定鍵盤按鍵效果JS
- 資料結構:陣列,稀疏矩陣,矩陣的壓縮。應用:矩陣的轉置,矩陣相乘資料結構陣列矩陣
- 3D圖形:矩陣的行列式,矩陣的逆、正交矩陣、齊次矩陣3D矩陣
- 抖音矩陣管理工具,一鍵分發影片,矩陣管理賬號矩陣
- 矩陣中最大的二維矩陣矩陣
- 求任意矩陣的伴隨矩陣矩陣
- 【.NET 與樹莓派】矩陣按鍵樹莓派矩陣
- 生成螺旋矩陣(方陣、矩陣)矩陣
- 機器學習中的矩陣向量求導(五) 矩陣對矩陣的求導機器學習矩陣求導
- Python+numpy實現矩陣的行列擴充套件Python矩陣套件
- 6-Windows程式設計 -鍵盤Windows程式設計
- verilog實現矩陣卷積運算矩陣卷積
- 鄰接矩陣、度矩陣矩陣
- 奇異矩陣,非奇異矩陣,偽逆矩陣矩陣
- 基於51微控制器的矩陣按鍵矩陣
- matlab如何統計矩陣各元素的出現次數Matlab矩陣