功能描述:
实现矩阵按键验证,将矩阵按键的按键值,通过串口显示,便于后面使用。
实物图

原理图:

编程原理:
原理很简单,就是通过循环设置引脚为低电平,另外引脚扫描读取电平值,如果是低电平则表示按键按下,就是一个矩阵关系,这里直接将扫描代码分享给大家,使用最简单的思路实现。
接线表:
| 矩阵按键 | STM32 | 模式 |
| R4 | PB12 | 上拉输入模式 |
| R3 | PB13 | 上拉输入模式 |
| R2 | PB14 | 上拉输入模式 |
| R1 | PB15 | 上拉输入模式 |
| C1 | PA8 | 推挽输出模式 |
| C2 | PA9 | 推挽输出模式 |
| C3 | PA10 | 推挽输出模式 |
| C4 | PA11 | 推挽输出模式 |
| - | PA2 | USART2_TX |
| - | PA3 | USART2_RX |
cubeMX配置:

代码如下:
uint16_t keyScan(void)
{
HAL_GPIO_WritePin(GPIOA, COL1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, COL2_Pin|COL3_Pin|COL4_Pin, GPIO_PIN_SET);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 4\r\n", 8, 0XFFFF);
return 4;
}
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 8\r\n", 8, 0XFFFF);
return 8;
}
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 12\r\n", 9, 0XFFFF);
return 12;
}
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 16\r\n", 9, 0XFFFF);
return 16;
}
HAL_GPIO_WritePin(GPIOA, COL2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, COL1_Pin|COL3_Pin|COL4_Pin, GPIO_PIN_SET);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 3\r\n", 9, 0XFFFF);
return 3;
}
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 7\r\n", 9, 0XFFFF);
return 7;
}
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 11\r\n", 9, 0XFFFF);
return 11;
}
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 15\r\n", 9, 0XFFFF);
return 15;
}
HAL_GPIO_WritePin(GPIOA, COL3_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, COL1_Pin|COL2_Pin|COL4_Pin, GPIO_PIN_SET);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 2\r\n", 9, 0XFFFF);
return 2;
}
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 6\r\n", 9, 0XFFFF);
return 6;
}
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 10\r\n", 9, 0XFFFF);
return 10;
}
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 14\r\n", 9, 0XFFFF);
return 14;
}
HAL_GPIO_WritePin(GPIOA, COL4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, COL1_Pin|COL2_Pin|COL3_Pin, GPIO_PIN_SET);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW4_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 1\r\n", 9, 0XFFFF);
return 1;
}
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW3_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 5\r\n", 9, 0XFFFF);
return 5;
}
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW2_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 9\r\n", 9, 0XFFFF);
return 9;
}
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin))
{
HAL_Delay(20);
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin))
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
while(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOB, ROW1_Pin));
//HAL_UART_Transmit(&huart2, (uint8_t *)"key: 13\r\n", 9, 0XFFFF);
return 13;
}
return 0;
}
实现效果
如下:


源码链接:
STM32CubeMXHAL库实现矩阵按键资源-CSDN文库
吾心电子
![[Leetcode 128][Medium] 最长连续序列](https://img-blog.csdnimg.cn/direct/338622f76aa04351a2ed42de9922e83b.png)


















