OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9598|回复: 9

电容触摸按键实验TPAD_Scan函数关于keyen值的困惑

[复制链接]

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2017-9-20
在线时间
27 小时
发表于 2017-10-10 12:52:38 | 显示全部楼层 |阅读模式
1金钱

请教下各位:

   当mode=0时,TPAD按下,主函数循环一次后,TPAD_SCAN(0)函数运行一次,keyen值为2,此时若没有松手,再循环一次,keyen值为1,再循环一次为0。若此时还没有松手,keyen为0了,TPAD_SCAN(0)的值又为1了,这句函数if(TPAD_Scan(0))        {LED1=!LED1;        }应该要运行了,led应该要动作。那么led1应该是keyen每三次闪烁一下行

可是实际上,led1只是在按键后一直保持着亮。这是该怎么理解呢?



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;
}       

int main(void)
{       
        u8 t=0;         
        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(115200);         //串口初始化为115200
        LED_Init();                             //LED端口初始化
  TPAD_Init(6);                        //初始化触摸按键
           while(1)
        {                                                                                                             
                if(TPAD_Scan(0))        //成功捕获到了一次上升沿(此函数执行时间至少15ms)
                {
                        LED1=!LED1;                //LED1取反
                }
                t++;
                if(t==15)                 
                {
                        t=0;
                        LED0=!LED0;                //LED0取反,提示程序正在运行
                }
                delay_ms(10);
        }
}





最佳答案

查看完整内容[请看2#楼]

你仿真跟踪看看,就知道为什么了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-10-10 12:52:39 | 显示全部楼层
你仿真跟踪看看,就知道为什么了
回复

使用道具 举报

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2017-9-20
在线时间
27 小时
 楼主| 发表于 2017-10-11 10:48:29 | 显示全部楼层
正点原子 发表于 2017-10-11 01:13
你仿真跟踪看看,就知道为什么了

谢谢原子哥回复,硬件仿真后弄明白了。只要不松手,kenyen的值就一直是3,运行后是2.
回复

使用道具 举报

4

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2017-5-22
在线时间
30 小时
发表于 2017-11-29 16:10:39 | 显示全部楼层
924583269 发表于 2017-10-11 10:48
谢谢原子哥回复,硬件仿真后弄明白了。只要不松手,kenyen的值就一直是3,运行后是2.

求问如何进行硬件仿真
回复

使用道具 举报

1

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2020-5-11
在线时间
91 小时
发表于 2020-6-28 14:15:56 | 显示全部楼层
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--执行后变成2,但在if中又变成了3,所以不松手的话keyen的值会一直是2,
也就是说要检测到3次的松手上升沿读取后,即if条件不满足,才能将keyen变成0。
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2020-7-16 18:38:50 | 显示全部楼层
例程中当触摸一次电容按键时 keyen为3,执行keyen--后变为2,。松开手后完成了一次电容按键的触摸。TPAD_Scan(0)在while(1)循环被使用,当再次执行TPAD_Scan(0)且手指不触摸电容按键时 keyen为1,当再次执行TPAD_Scan(0)且手指不触摸电容按键是keyen为0.当keyen为0的时候,res才为1,并返回1,这个时候keye从2变为0这样变化3次才能表示是一次有效的触摸。
如果一直按着电容触摸按键,每次TPAD_Scan(0)执行后一直为2,等你松手后才keyen值才递减。所以至少要过三次后才表示按键有效
回复

使用道具 举报

2

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2020-6-16
在线时间
4 小时
发表于 2020-10-9 17:01:00 | 显示全部楼层
peng1554 发表于 2020-7-16 18:38
例程中当触摸一次电容按键时 keyen为3,执行keyen--后变为2,。松开手后完成了一次电容按键的触摸。TPAD_Sca ...

key=3  到0的过程是为了防抖吗
回复

使用道具 举报

1

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2020-11-7
在线时间
44 小时
发表于 2020-12-23 17:06:56 | 显示全部楼层
331337667 发表于 2020-10-9 17:01
key=3  到0的过程是为了防抖吗

为了防止太过灵敏(相对于人)
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2021-2-5
在线时间
1 小时
发表于 2021-3-9 17:15:00 | 显示全部楼层
mode=0 不支持连按模式,  若按键一直按下  if(rval>(tpad_default_val+TPAD_GATE_VAL))会一直执行, keyen一直为3 ,按键无效,返回值为0 ,只有放开按键,在主程序里按键扫描第3次  keyen才会为1  按键才有效
mode=1   支持连按模式  若按键一直按下 if(rval>(tpad_default_val+TPAD_GATE_VAL))会一直执行 但在上个if(mode)中  会赋值keyen=0  所以 下面的 if中 按键有效

这个逻辑太感人
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2021-2-5
在线时间
1 小时
发表于 2021-3-9 17:21:25 | 显示全部楼层
331337667 发表于 2020-10-9 17:01
key=3  到0的过程是为了防抖吗

目的不是为了防抖
目的是为了在不支持连按模式下,保证 在按下触摸按键一段时间后  放开触摸按键   否则 若没有放开触摸按键 keyen会一直为3   TPAD_Scan返回值一直为0  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 17:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表