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,以便进行下一次的消抖处理。
  • 按键消抖的原理:

    1. 按键状态变化的检测:为了防止按键的抖动导致误判,代码通过异或操作 (Key_Old ^ Key_Val) 来检查按键是否发生了变化。
    2. 按键按下 (Key_Down):当按键被按下时,相对于前一个状态,如果按键的状态发生了变化且现在是按下状态(1),则 Key_Down1,表示按键被按下。
    3. 按键松开 (Key_Up):当按键松开时,相对于前一个状态,如果按键的状态发生了变化且现在是松开状态(0),则 Key_Up1,表示按键已松开。

    按键过程中的三种情况:

    情况1:按键 B4 产生下降沿

  • 初始状态:Key_Val = 0(无按键按下)。
  • 经过 100ms 扫描后,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

    物联沃分享整理
    物联沃-IOTWORD物联网 » stm32 剖析按键处理函数

    发表回复