stm32 剖析按键处理函数
//按键扫描专用变量
unsigned char Key_Val, Key_Down, Key_Up, Key_Old;
//控制key_proc的执行速度
__IO uint32_t uwTick_Set_Point = 0;
void Key_Proc(void)
{
//减速处理
if((uwTick - uwTick_Set_Point) < 100)
return;
uwTick_Set_Point = uwTick;
减速处理函数
uwTick
:通常在嵌入式系统中,uwTick
是一个系统定时器的计数值(比如一个定时器中断的计数),它记录了系统运行的时间。每次定时器溢出时,uwTick
会递增,表示系统已经运行了多少个时间单位(如毫秒、微秒等,具体依赖于定时器的配置)。
假设系统刚上电时,uwTick
的值非常大(系统启动时,计时器可能已经运行了一段时间),而 uwTick_Set_Point
刚上电时通常是 0。因此,uwTick - uwTick_Set_Point
的差值会很大(通常大于 100)。但是,在刚启动时,因为 uwTick
的值可能会突变或刚刚开始增加,程序通过这个判断语句避免了刚启动时的误操作,确保只有在时间差超过一定阈值时(这里是 100)才执行减速处理。uwTick_Set_Point = uwTick;
这一行代码的作用是使用uwTick_Set_Point
记录当前的时间点,以便下次计算和比较时间差。
//按键消抖
Key_Val = Key_Scan();
Key_Down = Key_Val & (Key_Old ^ Key_Val);
Key_Up = ~Key_Val & (Key_Old ^ Key_Val);
Key_Old = Key_Val;
if(Key_Down == 4)
{
LED_Disp(0xff);
}
if(Key_Down == 3)
{
LED_Disp(0x00);
}
}
按键处理函数:
Key_Scan()
:这是一个读取按键状态的函数。它返回一个表示当前按键状态的值,通常是一个二进制数,每一位表示一个按键的状态。1
可能表示按键被按下,0
表示按键没有被按下。Key_Val
存储的是当前读取到的按键状态。Key_Old
:这是一个存储前一次按键状态的变量,比较当前按键状态和之前的状态。Key_Val ^ Key_Old
:这个操作用来找出当前按键状态和上次按键状态不同的地方。比如,如果某个按键在当前状态和上次状态之间发生了变化,那么这个异或的结果会在对应的位上为 1
。Key_Val & (Key_Old ^ Key_Val)
:接下来,这个结果会与当前的按键状态 (Key_Val
) 进行按位与操作。按位与的结果会保留当前按键状态和状态变化不同的部分。这个结果表示的是当前按键按下的部分。因此,Key_Down
的结果表示当前被按下的按键。~Key_Val & (Key_Old ^ Key_Val)
:这一步与上面的逻辑类似,但是这里是为了找出当前松开的按键。它首先取反当前按键的状态,然后和之前的状态变化结果进行按位与运算。最终结果 Key_Up
表示当前被松开的按键。Key_Old = Key_Val;
:这一行将当前的按键状态 Key_Val
保存为下次比较的基础。它为下一次按键状态的变化提供参考。每次按键状态更新后,都需要更新 Key_Old
,以便进行下一次的消抖处理。按键消抖的原理:
- 按键状态变化的检测:为了防止按键的抖动导致误判,代码通过异或操作
(Key_Old ^ Key_Val)
来检查按键是否发生了变化。 - 按键按下 (
Key_Down
):当按键被按下时,相对于前一个状态,如果按键的状态发生了变化且现在是按下状态(1),则Key_Down
为1
,表示按键被按下。 - 按键松开 (
Key_Up
):当按键松开时,相对于前一个状态,如果按键的状态发生了变化且现在是松开状态(0),则Key_Up
为1
,表示按键已松开。
按键过程中的三种情况:
情况1:按键 B4 产生下降沿
Key_Val = 0
(无按键按下)。Key_Val = 4
(按键 B4 按下)。Key_Down = 4
(按键 B4 被按下)。Key_Up = 0
(没有按键松开)。Key_Old = 4
。情况2:按键 B4 一直按着
Key_Val
保持 4(按键 B4 按下)。Key_Down = 0
(没有新的按下事件)。Key_Up = 0
(没有松开)。Key_Old = 4
。情况3:按键 B4 没有按到底
Key_Val = 0
(无按键按下)。Key_Val
仍为 0。Key_Down = 0
(没有按键按下)。Key_Up = 0
(没有松开)。Key_Old = 0
。在消抖部分大家可以带入具体数值进行计算,个人理解有限❀❀❀
作者:s158112