SysTick_Handler介绍
今天我给大家分享一个基于SysTick_Handler中断实现的按键扫描。SysTick_Handler是HAL库配置的stmf103芯片里运行时会每隔1ms被调用的一个回调函数,所以我在这个回调函数里面写了按键读取的程序Key_Scan();(这个是我参考别的大佬的程序,侵权的话请评论,马上删除),这个函数每隔1ms会在回调函数里面被调用一次按键接法是这样的,自然状态下引脚读取时高电平,按键按下时引脚读取时低电平
程序介绍
程序流程图如图所示:
这个程序判断按键按下需要2个条件:
- 按键持续按下时间超过32ms
- 按键在非按下状态
那这个程序是怎么实现消抖的呢?很简单,按键弹起的时候一直都是高电平,程序需要读到连续的32个毫秒的低电平才会判断为按键按下 这个判定为高电平时按键按下的时间的话每个调试者的习惯都不太一样,具体应用的时候可以根据实际情况做一个微调 计时期间哪怕有一个低电平的抖动,sw1Count计数器都会清零,重新开始32毫秒的计数,因此实现了消抖,而且程序在判断到了按键按下之后pushFlag1置1,这样在按键持续按下的时候就不会识别为多个按键按下的操作。
uint8_t sw1Count;
uint8_t pushFlag1;
void Key_Scan(void)
{
/*检测SW1是否按下 */
if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_RESET )
{
sw1Count++; //SW1键按下,计数sw1Count加1
if(sw1Count>=32) //1MS中断一次,sw1Count大于等于32,即按键已按下32ms
{
if(pushFlag1==0) //判断有没有重按键,1为有,0为没有
{
swState1=1; //设置按键标志
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,1);
sw1Count=0;
pushFlag1=1; //设置重按键标志
}
else
sw1Count=0;
}
else
swState1=0;
}
else //无按键按下
{
sw1Count=0; //清零sw1Count
swState1=0; //清除按键标志
pushFlag1=0; //清除重按键标志
}
}
按键识别应用
按键识别之后一般是作为用户的输入应用,在我的工程里面我是将按键输入作为退出我的while(1)循环的条件 那么为什么我要用中断来作为我读取按键的方法呢?轮询他不香吗?但是请仔细看我的程序,我的程序大部分时间都是在处理串口的收发,在单核的芯片中,因为一次处理串口的时间比较久,如果说用轮询控制按键的话很可能会因为我按下按键的时候刚好芯片在处理串口,这样我按下按键的动作就会被忽略了,这样就会造成按下了好几次的按键,但是芯片就是不会响应按键的情况,造成了极差的用户体验,但是中断就不一样了,只要满足中断条件,那么芯片就一定会响应,相应的变量就会改变,这就做到了即使芯片需要做长时间的连续工作,也可以准确响应我的按键动作。
(づ ̄3 ̄)づ╭❤~一键三连,这次一定(๑•̀ㅂ•́)و✧