如何在STM32中实现扫描4*4矩阵键盘,当按键按下时,会在OLED 屏幕显示文字的前提下继续输入数字1234的代码程序
时间: 2024-02-06 19:09:00 浏览: 134
STM32控制矩阵按键,HAL库,cubemx配置,可控制4*4按键,使用扫描法,单片机STM32f103RCT6
5星 · 资源好评率100%
以下是基于STM32的HAL库的代码实现,实现扫描4*4矩阵键盘,当按键按下时,在OLED屏幕上显示输入的数字1234。
首先需要配置GPIO口的输入输出模式,将4*4矩阵键盘的行和列对应的GPIO口配置为输入和输出模式。
```c
GPIO_InitTypeDef GPIO_InitStruct;
// 配置行GPIO口为输入模式,列GPIO口为输出模式
GPIO_InitStruct.Pin = ROW_1_Pin|ROW_2_Pin|ROW_3_Pin|ROW_4_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(ROW_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = COL_1_Pin|COL_2_Pin|COL_3_Pin|COL_4_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(COL_GPIO_Port, &GPIO_InitStruct);
```
然后在主程序中循环扫描键盘,当检测到按键按下时,在OLED屏幕上显示输入的数字1234。
```c
uint8_t key_state[4][4] = {0}; // 记录每个按键的状态,0表示未按下,1表示按下
while (1)
{
// 扫描键盘
for (uint8_t i = 0; i < 4; i++)
{
// 首先将所有列的输出置为高电平
HAL_GPIO_WritePin(COL_GPIO_Port, COL_1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(COL_GPIO_Port, COL_2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(COL_GPIO_Port, COL_3_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(COL_GPIO_Port, COL_4_Pin, GPIO_PIN_SET);
// 然后将当前列的输出置为低电平
switch (i)
{
case 0:
HAL_GPIO_WritePin(COL_GPIO_Port, COL_1_Pin, GPIO_PIN_RESET);
break;
case 1:
HAL_GPIO_WritePin(COL_GPIO_Port, COL_2_Pin, GPIO_PIN_RESET);
break;
case 2:
HAL_GPIO_WritePin(COL_GPIO_Port, COL_3_Pin, GPIO_PIN_RESET);
break;
case 3:
HAL_GPIO_WritePin(COL_GPIO_Port, COL_4_Pin, GPIO_PIN_RESET);
break;
default:
break;
}
// 检测行的输入状态,如果有按键按下,则在OLED屏幕上显示数字1234
if (HAL_GPIO_ReadPin(ROW_GPIO_Port, ROW_1_Pin) == GPIO_PIN_RESET)
{
if (key_state[0][i] == 0)
{
key_state[0][i] = 1;
HAL_Delay(10); // 延时去抖动
OLED_Clear();
OLED_ShowString(0, 0, "1234");
}
}
else
{
key_state[0][i] = 0;
}
if (HAL_GPIO_ReadPin(ROW_GPIO_Port, ROW_2_Pin) == GPIO_PIN_RESET)
{
if (key_state[1][i] == 0)
{
key_state[1][i] = 1;
HAL_Delay(10); // 延时去抖动
OLED_Clear();
OLED_ShowString(0, 0, "1234");
}
}
else
{
key_state[1][i] = 0;
}
if (HAL_GPIO_ReadPin(ROW_GPIO_Port, ROW_3_Pin) == GPIO_PIN_RESET)
{
if (key_state[2][i] == 0)
{
key_state[2][i] = 1;
HAL_Delay(10); // 延时去抖动
OLED_Clear();
OLED_ShowString(0, 0, "1234");
}
}
else
{
key_state[2][i] = 0;
}
if (HAL_GPIO_ReadPin(ROW_GPIO_Port, ROW_4_Pin) == GPIO_PIN_RESET)
{
if (key_state[3][i] == 0)
{
key_state[3][i] = 1;
HAL_Delay(10); // 延时去抖动
OLED_Clear();
OLED_ShowString(0, 0, "1234");
}
}
else
{
key_state[3][i] = 0;
}
}
}
```
阅读全文