功能描述:
实现矩阵按键验证,将矩阵按键的按键值,通过串口显示,便于后面使用。
实物图
原理图:
编程原理:
原理很简单,就是通过循环设置引脚为低电平,另外引脚扫描读取电平值,如果是低电平则表示按键按下,就是一个矩阵关系,这里直接将扫描代码分享给大家,使用最简单的思路实现。
接线表:
矩阵按键 | 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文库
吾心电子