通过应用HAL库的GPIO相关函数制作一个矩阵键盘,思想:定义一个2x3的矩阵键盘控制三个灯,上面一行实现灯的开关,下面一行实现灯的闪烁,引脚配置如下
如上图所示,PB6、PC11、PD2配置成输入,接上拉电阻;PC6、PC8配置成输出,初始电平为低电平;通过扫描检测PB6、PC11、PD2的电位判断哪一列按键按下,然后再置PC8为高电平判断是哪一行被按下,分别实现灯的控制
/* USER CODE BEGIN 3 */
if(HAL_GPIO_ReadPin(H1_GPIO_Port,H1_Pin) == GPIO_PIN_RESET)
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(H1_GPIO_Port,H1_Pin) == GPIO_PIN_RESET)
{
HAL_GPIO_WritePin(KEY1_GPIO_Port,KEY1_Pin,GPIO_PIN_SET);
if(HAL_GPIO_ReadPin(H1_GPIO_Port,H1_Pin) == GPIO_PIN_SET)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
HAL_GPIO_WritePin(KEY1_GPIO_Port,KEY1_Pin,GPIO_PIN_RESET);
HAL_Delay(500);
}
else
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
HAL_Delay(500);
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
HAL_GPIO_WritePin(KEY1_GPIO_Port,KEY1_Pin,GPIO_PIN_RESET);
}
}
}
else if(HAL_GPIO_ReadPin(H2_GPIO_Port,H2_Pin) == GPIO_PIN_RESET)
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(H2_GPIO_Port,H2_Pin) == GPIO_PIN_RESET)
{
HAL_GPIO_WritePin(KEY1_GPIO_Port,KEY1_Pin,GPIO_PIN_SET);
if(HAL_GPIO_ReadPin(H2_GPIO_Port,H2_Pin) == GPIO_PIN_SET)
{
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
HAL_GPIO_WritePin(KEY1_GPIO_Port,KEY1_Pin,GPIO_PIN_RESET);
HAL_Delay(500);
}
else
{
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
HAL_Delay(500);
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
HAL_GPIO_WritePin(KEY1_GPIO_Port,KEY1_Pin,GPIO_PIN_RESET);
}
}
}
else if(HAL_GPIO_ReadPin(H3_GPIO_Port,H3_Pin) == GPIO_PIN_RESET)
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(H3_GPIO_Port,H3_Pin) == GPIO_PIN_RESET)
{
HAL_GPIO_WritePin(KEY1_GPIO_Port,KEY1_Pin,GPIO_PIN_SET);
if(HAL_GPIO_ReadPin(H3_GPIO_Port,H3_Pin) == GPIO_PIN_SET)
{
HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);
HAL_Delay(500);
HAL_GPIO_WritePin(KEY1_GPIO_Port,KEY1_Pin,GPIO_PIN_RESET);
}
else
{
HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);
HAL_Delay(500);
HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);
HAL_GPIO_WritePin(KEY1_GPIO_Port,KEY1_Pin,GPIO_PIN_RESET);
}
}
}
演示视频如下
矩阵键盘演示