OpenEdv-开源电子网

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

电容触摸按键效果不好!!

[复制链接]

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-9-23
在线时间
3 小时
发表于 2015-9-23 22:45:34 | 显示全部楼层 |阅读模式
u8 TPAD_Scan(u8 mode)
{
static u8 keyen=1; //0,可以开始检测;>0,还不能开始检测  
u8 sample=3; //默认采样次数为3次  
u16 rval;
if(mode)
{
sample=6; //支持连按的时候,设置采样次数为6次
keyen=1; //支持连按  
}
rval=TPAD_Get_MaxVal(sample); 
if(keyen&&(rval>(tpad_default_val+TPAD_GATE_VAL)&&rval<(10*tpad_default_val)))//大于tpad_default_val+TPAD_GATE_VAL,且小于10倍tpad_default_val,则有效
{  
keyen=0; 

return 1;
}
else if(!((rval>(tpad_default_val+TPAD_GATE_VAL)&&rval<(10*tpad_default_val)))&&((rval>tpad_default_val-100)&&(rval<tpad_default_val+100)))keyen=1;

return 0;
}


在看电容触摸按键这一个实验的时候感觉按键效果不是很好,按住的时候会一直闪
于是自己参照按键那一实验进行修改为上面代码,亲测感觉比原来的效果要好,特来分享,如有哪里写得不好之处,请大家指出
还有就是感觉老师写的不是很好理解,看了我好久,不知道老师为何要这么写?

第一次发帖  新来的  还请多多关照!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-9-24 00:14:19 | 显示全部楼层
谢谢分享.....

第一次发帖就能编辑的简洁清楚,很厉害
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-24 09:39:26 | 显示全部楼层
谢谢分享.
代码不应该存在按住不放就闪烁的现象.
你用的哪款开发板?

现在战舰V3的代码是这样的:
[mw_shl_code=c,true]//扫描触摸按键 //mode:0,不支持连续触发(按下一次必须松开才能按下一次);1,支持连续触发(可以一直按下) //返回值:0,没有按下;1,有按下; #define TPAD_GATE_VAL 100 //触摸的门限值,也就是必须大于tpad_default_val+TPAD_GATE_VAL,才认为是有效触摸. 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; } [/mw_shl_code]

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-9-23
在线时间
3 小时
 楼主| 发表于 2015-9-24 10:36:48 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
我开发板是探索者F4
那个是我自己改的   原来的代码就是你那样的 
我就是发现原来的那个按住不放就闪烁的现象   
所以自己改了后发现改后的那个会好一点

还有就是寄存器版本的   tpad例程   TIM2->SR&0X04==0
检测的0x04是不是错了  不是应该0x02吗?
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-9-23
在线时间
3 小时
 楼主| 发表于 2015-9-24 10:40:06 | 显示全部楼层
回复【2楼】龙之谷:
---------------------------------
谢谢    以后还要多向你学习呢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-24 19:50:49 | 显示全部楼层
回复【4楼】Kevem:
---------------------------------
反复闪烁的问题,没有测出。
不过&0X04确实是有问题,应该是0X02,你是对的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2015-5-25
在线时间
39 小时
发表于 2015-12-31 11:44:37 | 显示全部楼层
正点原子 发表于 2015-9-24 19:50
回复【4楼】Kevem:
---------------------------------
反复闪烁的问题,没有测出。
不过&0X04确实是有问题 ...

也发现了同样的问题,这个&0X04应该是0x02。
原来有前辈已经发现了。哈哈
回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

高级会员

Rank: 4

积分
701
金钱
701
注册时间
2017-7-19
在线时间
91 小时
发表于 2017-7-20 13:38:55 | 显示全部楼层
大神,我的F4板子,用原程序和你修改的程序还是不行啊。
在不支持连续按的情况下,按住后还是隔不同的时间闪烁。
不过我把程序中加了printf语句。
再修改下sample和keyen的参数就好了。
不明白这是什么原因。
刚开始以为是延时的原因,但是用延时delay_ms()函数来代替printf语句,还是不行。
实在搞不懂,这是什么原因。


一下是我的程序:
u8 TPAD_Scan(u8 mode)
{
    static u8 keyen=0;  //0,可以开始检测;>0,还不能开始检测     
    u8 res=0;
    u8 sample=10;        //默认采样次数为10次  ,因为这个电容充电时捕获的上升沿时间差异教大,有的会小于未加TPAD电容的时间。
    u16 rval;
    if(mode)
    {      
        keyen=0;        //支持连按   
    }
    rval=TPAD_Get_MaxVal(sample);
     delay_ms(10);                //此处之所以采用延时还是为了rval的值稳定
                printf("rval:%d\r\n",rval);  //可以把延时去掉,把printf加上去,因为都是起延时的作用
                                             //若把printf去掉就必须加延时
    if(rval>(tpad_default_val+TPAD_GATE_VAL))//大于tpad_default_val+TPAD_GATE_VAL,有效
    {                           
        if(keyen==0)res=1;      //keyen==0,有效
        printf("keyen:%d\r\n",keyen);    //此处的printf对实验有很大的影响                                    
        keyen=5;                //至少要再过4次,因为以防按下时,rval的值不稳定出现连续小于tpad_default_val+TPAD_GATE_VAL值的情况。
    }
    if(keyen)keyen--;               
    return res;
}


回复 支持 反对

使用道具 举报

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2018-7-17
在线时间
11 小时
发表于 2018-7-19 17:00:44 | 显示全部楼层
Sai520 发表于 2017-7-20 13:38
大神,我的F4板子,用原程序和你修改的程序还是不行啊。
在不支持连续按的情况下,按住后还是隔不同的时间 ...

你这个代码感觉有问题呀。你这个代码只能第一次进去的时候能够使得res的值为1以后都不行了啊,因为每次你都把keyen的值重置成5了,感觉是这样,请多多指教
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2018-10-2
在线时间
42 小时
发表于 2018-12-26 22:12:24 | 显示全部楼层
本帖最后由 liutext 于 2018-12-26 22:16 编辑

解决了,感谢前辈
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 08:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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