按键的长按,短按,以及按键按下后不松开,只计算一次有效按下

判断按键长按还是短按,就需要引入时间的概念了。

对于STM32G431RBT6这块板子来说,直接开启一个定时器用来检测即可。

 这里要讲到一个定时器时间计算公式

TIM(S)=\frac{(ARR+1)(PSC+1)}{TLCK(MHz)}

TLCK指的就是系统时钟频率,设置为100MHz的话,用公式计算,定时器6就是10ms产生一次定时中断。

 生成工程文件后,编程代码如下:

这样就可以每10ms检测一次按键

unsigned int count = 0,flag = 0;

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)  //定时中断回调函数
{
    if(htim -> Instance == TIM6)
        {   
            if( HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0) ==0 )    //读取B1的状态,按下为0
                {
                    count++;                                //按键按下时,每10ms count就+1
                }else if(count > 80)                //如果按键按下大于800ms,就判断是长按

                        {
                              x = 1;                 //标志变量x = 1 长按  
                        }

                  else if(count > 10 &&count <80)   //如果按下时长不足 800ms 就判断是短按
                            x = 2;
        }

}



当然使用定时器还要在主函数中启动它,用这句

HAL_TIM_Base_Start_IT(&htim6);

上面就是判断长按短按的方法。

还有一种就是,按下按键不松手的时候,系统会一直去执行按下的操作,但是当我们需要计数的时候,比如按下一次就令x++;这个时候按下一次,由于系统工作的速度是微秒级别的,会让x+上很多数,不能实现按一次就+1;

这个时候就要根据 按键按下前和按下后的两个状态来判断一次按下。

unsigned int flag = 0;            //定义全局标志变量flag
void Key_scan()
{
    static unsigned int x = 0;                        //定义静态变量 x 用于判断按键状态 



if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)== 0 && x == 0) 

        {    
                                   //如果按键按下,且前一瞬间没有按下,才算一次有效按下            
            x = 1;               //x =1 表示前一次按键已经按下                            
            flag = 1 ;
            
        }else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)== 1) 
                x = 0;     //如果不满足上面的状态,并且按键没有按下,x=0,表示前一瞬间没有按下
}

代码有一点点绕,仔细看的话逻辑起始挺简单的。

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 在C语言中实现按键按、短按和双击功能可以通过多线程的方式来实现。 首先,我们需要一个全局变量来记录按键的状态,比如键盘按下状态(pressed)和释放状态(released)。然后,我们可以使用一个线程来不断地监测键盘的状态,判断按键按、短按和双击。 对于按功能,我们可以通过判断按键按下时间是否超过设定的时间来实现。当按键按下时,我们记录按下的时间,然后在监测线程中判断按键是否已经释放,如果按键释放时间大于设定的时间,则判定为按。 对于短按功能,我们可以在按键按下记录按下的时间,在监测线程中判断按键是否已经释放,如果按键释放时间小于设定的时间,则判定为短按。 对于双击功能,我们可以在监测线程中记录按键按下时间和释放时间,如果两次按键的时间间隔小于设定的时间,则判定为双击。 在实现按键功能时,需要注意多线程的同步问题,可以使用锁来确保多个线程对全局变量的操作不会冲突。 以上是一个简单的思路,具体的实现还需要根据具体的应用场景进行调整。同时,还需要考虑到编译器和硬件的差异,以及其他相关的因素,来确保按键功能能够在不同的环境中正常运行。 ### 回答2: 在C语言中,我们可以通过监听键盘的按键事件,来实现检测按键按、短按和双击效果。 首先,我们需要定义一些变量来记录按键的状态和时间。我们可以使用一个布尔型变量来表示按键的状态,例如isPressed表示按键是否被按下,以及两个整型变量来记录按键按下松开的时间。 对于检测按效果,我们可以在每次按键按下记录当前的系统时间,并通过不断监听键盘事件来检测按键是否持续按下。如果按键一直被按下,并且按键按下的时间超过一定的阈值(可以自行设定),就可以判断为按。 对于检测短按效果,我们可以判断按键是否在很短的时间内被按下松开,例如在100毫秒内,即可判断为短按。 对于检测双击效果,我们可以通过记录按键按下的次数来实现。每次按键按下时,我们可以检测两次按键的时间间隔是否在一定的范围内(比如200毫秒内),如果是,则可以判断为双击效果。 总之,通过监听键盘事件,并结合一些时间和状态的记录,我们可以在C语言中实现按键按、短按和双击效果。 ### 回答3: C语言中,我们可以利用计时器和状态机来检测按键按、短按和双击操作。 首先,我们需要定义一个变量作为计时器,用来记录按键按下的时间。我们假设按下按键时,将这个变量初始化为0。 当按键按下后,我们可以在主循环中进行延时操作,然后检测按键是否仍然被按下,如果仍然被按下,就将计时器加1。 接着,我们可以设置一个阈值,用来判断按键按下的时间是短按还是按。如果计时器记录的时间小于阈值,就可以判定为短按;如果计时器记录的时间大于等于阈值,就可以判定为按。 同时,我们还需要维护一个状态机来记录双击操作。当按键短按时,状态机将记录一次短按操作,并等待一定的时间,如果这段时间内再次检测到按键短按,就可以判定为双击操作。 综上所述,通过利用计时器和状态机,我们可以在C语言中实现按键按、短按和双击功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值