芯片STM32F407ZGT6
注意:这芯片的按键不是矩阵按键
分类:
-
按结构原理分:
- 触点式开关按键
- 无触点开关按键
-
接入方式
- 独立式按键
- 矩阵式键盘
————————————————————————————————————————————
矩阵式键盘识别方法(行扫描法)
五向按键,这种按键的按键检测方法比较简单,配置起来也很简单。配置相应的引脚即可。(注意:大部分五向按键直接按下是复位键,这里就是)
SYS:
RCC:
按键在芯片的位置:
GPIO:
我这芯片PF6到PF9都是按键引脚,PE3、PE4、PG9分别是三个LED,PG7时蜂鸣器。(嫌吵可以不用蜂鸣器)
剩下的都是老样子了,然后直接生成代码,之前不懂得可以看看这篇,我们直接进入代码。https://blog.csdn.net/weixin_53000184/article/details/124246194?spm=1001.2014.3001.5502
我们想要写个按键扫描的函数,如下:
void Scan_Keys() {
if(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_9)==GPIO_PIN_RESET) {
HAL_Delay(30);
if(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_9)==GPIO_PIN_RESET) {
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_3);
while(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_9)==GPIO_PIN_RESET);
}
}
if(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_8)==GPIO_PIN_RESET) {
HAL_Delay(30);
if(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_8)==GPIO_PIN_RESET) {
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_4);
while(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_8)==GPIO_PIN_RESET);
}
}
if(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_6)==GPIO_PIN_RESET) {
HAL_Delay(30);
if(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_6)==GPIO_PIN_RESET) {
HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_7);
while(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_6)==GPIO_PIN_RESET);
}
}
if(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_7)==GPIO_PIN_RESET) {
HAL_Delay(30);
if(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_7)==GPIO_PIN_RESET) {
HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_9);
while(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_7)==GPIO_PIN_RESET);
}
}
}
里面四个其实一样的,我就拿一个来讲解。其他的都差不多。
if(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_9)==GPIO_PIN_RESET) { //这个检测按键是否按下
HAL_Delay(30); //这个时延时函数,里面参数以ms为单位,直接调用即可,延时、消抖
if(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_9)==GPIO_PIN_RESET) { //检测按键按下
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_3); //反转PE3的电平,之前是低电平就变高电平
while(HAL_GPIO_ReadPin(GPIOF,GPIO_PIN_9)==GPIO_PIN_RESET);
//上面这行是检测按键是否长按
}
}
编写好按键扫描函数就差不多了。然后再main函数里调用就可以了,当然,按键扫描函数的内容也可以直接放主函数里直接使用。
效果就不展示了,就是按下按键相应的LED(蜂鸣器)就会亮(响)。