三行按键法

   前言:最近找了好多写按键模块的方法,大部分都是延时和状态机方法,写了写不是很喜欢,于是找了半天才找到三行按键的代码。

众所周知,我们一般使用的都是机械按键,在我们触碰案件的时候都会出现抖动,所以消抖成了我们不可缺少的一部分,但是使用三行按键法可以完美解决此类问题。话不多说,上代码。

//第一步
 

  uint8_t Key_Scan(void)
{
  if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET)
  {
    return 1;
  }
  else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET)
  {
    return 2;
  }
  else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET)
  {
    return 3;
  }
  else if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
  {
    return 4;
  }
  
  return 0; // No key pressed
}

//第二步

void  Key_Pro(void)
{
  key_val  = Key_Scan();
  key_down = key_val&(key_val ^ key_old);
  key_up   = ~key_val&(key_val ^ key_old);
  key_old  =  key_val;
  
    if(key_down==1)
    {
    }    
  if( key_up==1)
    {

    }    

第一步就是使用回调函数判断哪个按键被按下。

第二步,就是我们三行按键法本身,先读取我们的键值 key_val ,然后 key_down用于判断是否被按下,按下为对应键值,没有则是0,这里使用了^也就相异则为1相同为0,如果按键被按下了,产生了下降沿,那么前后keyval和keyold肯定是不一样的,再加上一条保险&keyval,那么keydown的值肯定是对应的键值

同理,key_up  则是记录按键是否被弹起。keyold则用于保存上次按键状态。如果按键弹起,keyup就会变成当前键值,比方说我这边的1。在我最后两个if语句中可以对按下,弹起进行操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值