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;
}
上述程式碼可以檢測到哪個按鍵按下,但在實際專案開發途中,按下以及鬆開都需要進行一系列的消抖操作來判斷到底是真的按下跟真的鬆開。關於這個問題,下文會詳細的描述。
相關文章
- 矩陣鍵盤原理剖析矩陣
- 51、52微控制器使用矩陣鍵盤矩陣
- 程式設計師的鍵盤程式設計師
- 數倉實踐:匯流排矩陣架構設計矩陣架構
- 計算矩陣的秩矩陣
- 矩陣計算矩陣
- 巨大的矩陣(矩陣加速)矩陣
- VIVADO vhdl verilog 實現矩陣運算矩陣
- verilog實現矩陣卷積運算矩陣卷積
- 資料結構實驗 二維矩陣的實現資料結構矩陣
- c語言中實現4行3列矩陣和3行4列矩陣的運算C語言矩陣
- 矩陣:如何使用矩陣操作進行 PageRank 計算?矩陣
- Python+numpy實現矩陣的行列擴充套件Python矩陣套件
- C語言實現矩陣螺旋輸出C語言矩陣
- 資料結構:陣列,稀疏矩陣,矩陣的壓縮。應用:矩陣的轉置,矩陣相乘資料結構陣列矩陣
- 12.2 實現鍵盤模擬按鍵
- 求任意矩陣的伴隨矩陣矩陣
- matlab如何統計矩陣各元素的出現次數Matlab矩陣
- 【.NET 與樹莓派】矩陣按鍵樹莓派矩陣
- 抖音矩陣管理工具,一鍵分發影片,矩陣管理賬號矩陣
- 非科班程式設計師才不知道的矩陣Matrix程式設計師矩陣
- 鄰接矩陣、度矩陣矩陣
- 基於51微控制器的矩陣按鍵矩陣
- 奇異矩陣,非奇異矩陣,偽逆矩陣矩陣
- 6-Windows程式設計 -鍵盤Windows程式設計
- matlab計算含有未知數的矩陣Matlab矩陣
- stm32 F103C8T6 4x4矩陣鍵盤使用矩陣
- 向量化實現矩陣運算最佳化(一)矩陣
- Bert結構手動矩陣運算實現(Transform)矩陣ORM
- 機器學習中的矩陣向量求導(五) 矩陣對矩陣的求導機器學習矩陣求導
- 矩陣矩陣
- 深度學習中需要的矩陣計算深度學習矩陣
- PAT1029 舊鍵盤(java實現)Java
- 伴隨矩陣和逆矩陣的關係證明矩陣
- 求矩陣中向量兩兩間的歐氏距離(python實現)矩陣Python
- C#實現圖的鄰接矩陣和鄰接表結構C#矩陣
- Java畢業設計_基於MySQL網盤管理系統的設計與實現JavaMySql
- 矩陣和陣列矩陣陣列