基于正点原子STM32zet6精英板开发板的电容触摸按键实验长按和不长按的学习理解

作为大一小白刚学到这个实验的时候在理解这个电容触摸按键是如何决定长按和不长按的代码时迷茫了一段时间,实在理解不了的一部分在问学长的时候突然灵光一闪在学长没打完字之前我就打出了我的理解😁

 下面说说我的理解

首先把代码放上来

u8 TPAD_Scan(u8 mode)
{
    static u8 keyen=0;    //0,可以开始检测;>0,还不能开始检测     
    u8 res=0;
    u8 sample=3;        //默认采样次数为3次     
    u16 rval;
    if(mode)
    {
        sample=6;        //支持连按的时候,设置采样次数为6次
        keyen=0;        //支持连按      
    }
    rval=TPAD_Get_MaxVal(sample); 
    if(rval>(tpad_default_val+TPAD_GATE_VAL))//大于tpad_default_val+TPAD_GATE_VAL,有效
    {                             
        if(keyen==0)res=1;        //keyen==0,有效 
        //printf("r:%d\r\n",rval);                                            
        keyen=3;                //至少要再过3次之后才能按键有效   
    } 
    if(keyen)keyen--;                                                                                      
    return res;
}    

 这里先假设设置为不支持长按 mode=0;

标志位设为keyen设置为0后面是用来决定返回值res是否有效,然后sample是你时间的扫描次数这个是另外一个函数里的我就不放了大家懂就行,reval是用来寄存获取到的触摸扫描时间至于(tpad_default_val+TPAD_GATE_VAL)则是正点原子官方调试出来的一个比较值。

只要你触摸有效就会大于这个比较值,此时你的keyen是0则返回的值res为1这就代表这一次有效

之后keyen被赋值为3.

假设此时你的手没有离开触摸的位置,当主函数的while(1)第二次进入按键扫描函数u8 TPAD_Scan(u8 mode) 这个时候keyen因为是标志位不会初始化此时keyen=3而res=0。

当进入这个if的时候发生了变化

 if(rval>(tpad_default_val+TPAD_GATE_VAL))//大于tpad_default_val+TPAD_GATE_VAL,有效
    {                             
        if(keyen==0)res=1;        //keyen==0,有效 
        //printf("r:%d\r\n",rval);                                            
        keyen=3;                //至少要再过3次之后才能按键有效   
    } 

此时不会再进入 if(keyen==0)执行res=1; 因此返回的值res=0;在主函数里面TPAD_Scan(u8 mode)等于0无效的,但此时keyen也不会自减因为你一直在进入下面这个if一直在赋值即使后面自减为2在循环进入的时候还会赋值为3

 if(rval>(tpad_default_val+TPAD_GATE_VAL))//大于tpad_default_val+TPAD_GATE_VAL,有效
    {                             
        if(keyen==0)res=1;        //keyen==0,有效 
        //printf("r:%d\r\n",rval);                                            
        keyen=3;                //至少要再过3次之后才能按键有效   
    } 

只有当你的手离开reval才等于零if里面的rval>(tpad_default_val+TPAD_GATE_VAL)就不会成立为假就不会一直赋值了之后就会一直自减直到keyen=0;

 这里假设设置为支持长按 mode=1;

那么扫描次数sample的增加只是为了数据更准确而keyen设置为0就代表下面的keyen=3已经没有用了因为之后再进入触摸扫描函数的时候keyen在

    if(mode)
    {
        sample=6;        //支持连按的时候,设置采样次数为6次
        keyen=0;        //支持连按      
    }

里面已经又被赋值为0也就是说后面的会一直执行 if(keyen==0)res=1;   res返回的值也一直是1也就是一直扫描有效了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值