萌新的STM32学习20–按键输入实验
在了解完蜂鸣器的实验之后我们又进行一个小实验 又是正点原子没有上课讲解的实验
对于这种不平滑的情况我们更多的也会去选择方法进行消除抖动
软件消抖:方法很多,我们例程中使用最简单的延时消抖。检测到按键按下后,一般进行10ms 延时,用于跳过抖动的时间段,如果消抖效果不好可以调整这个 10ms 延时,因为不同类型的按键抖动时间可能有偏差。待延时过后再检测按键状态,如果没有按下,那我们就判断这是抖动或者干扰造成的;如果还是按下,那么我们就认为这是按键真的按下了。对按键释放的判断同理。
例程要求
通过开发板上的三个独立按键控制 LED 灯和蜂鸣器: KEY_UP 控制蜂鸣器翻转,KEY1控制 LED1 翻转,KEY0 控制 LED0/LED1 同时翻转。
这就需要用到了我们上面讲述的蜂鸣器和LED控制还有新加入按键的实现
这里可以按照我们之前的逻辑判别
这里我们在此处介绍几个新的函数
HAL_GPIO_ReadPin
读出管脚的作用
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
前面一部分指的是GPIO多少
后面一部分说的是管脚号用的是从0到15中的任何一个
我们在使用GPIO的时候 无论用到哪一个 用到一个就请你使能该方向的GPIO 可以是GPIOA 也可以是GPIOE 等等
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
流程图
对于代码部分的简单解析
由硬件设计小节,我们知道 KEY0、KEY1 和 KEY_UP 分别来连接到 PE4、PE3 和 PA0 上
我们接下来重点分析一下扫描函数的实现
其实就是说其他
表示KEY00 KEY10 是低电平有效
WK_UP==1是高电平有效
然后很多人对这个static 不明显 static其实是静态变量仅能初始一次
剩下的mode 当处于1 下面是 表示key_up 一直松开 随时随地接收数据的改变
而优先级问题是这么解释的
我wk_up 在最下面,程序的顺序执行 会使得最下面的优先级最高,你这么想 反正我要到最后才会传递数据,哪怕我前面已经修改了数据,但是到了最后我一再收束修改条件 ,不是还是算作WK_up 的功劳吗
下面是main.c
int main(void){ uint8_t key; HAL_Init(); /* 初始化 HAL 库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟
, 72Mhz */ delay_init(72);
/* 延时初始化 */ led_init(); /* 初始化 LED */ beep_init(); /* 初始化蜂鸣器 */ key_init();/* 初始化按键 */ LED0(0);/* 先点亮 LED0 */
while(1) { key = key_scan(0); /* 得到键值 */if (key)
{ switch (key)
{ case WKUP_PRES: /* 控制蜂鸣器 */ BEEP_TOGGLE(); /* BEEP 状态取反 */
break; case KEY1_PRES: /* 控制 LED1(GREEN)翻转 */
LED1_TOGGLE(); /* LED1 状态取反 */
break;case KEY0_PRES:
/* 同时控制 LED0, LED1 翻转 */ LED0_TOGGLE();/* LED0 状态取反 */ LED1_TOGGLE();/* LED1 状态取反 */ break; } }
else { delay_ms(10); } }}