OpenEdv-开源电子网

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

电容触摸按键实验按键扫描程序问题

[复制链接]

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2013-11-27
在线时间
0 小时
发表于 2014-6-17 23:07:09 | 显示全部楼层 |阅读模式
5金钱
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,有效
{
  rval=TPAD_Get_MaxVal(sample);  
if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL)))//大于tpad_default_val+TPAD_GATE_VAL,有效
{
res=1;
}   
//printf("r:%d\r\n",rval);           
keyen=5; //至少要再过5次之后才能按键有效   
}else if(keyen>2)keyen=2; //如果检测到按键松开,则直接将次数将为2,以提高响应速度
if(keyen)keyen--;               
return res;
}

对于上面的程序有点不理解,我C语言不是很好。if语句的形式应该是:if(表达式)语句1   else if (表达式2)语句2  ……else if(表达式m) 语句m  else 语句n。   而上面没有else语句。而且if(rval>(tpad_default_val+TPAD_GATE_VAL))与else if(keyen>2)两个if语句内的表达式没有直接关系(如果表达式1不成立,则表达式2成立这种关系)。以上应该是我理解有问题,但是不知道错在哪,求指导。

最佳答案

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

[mw_shl_code=c,true]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,有效 { rv ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-17 23:07:10 | 显示全部楼层
[mw_shl_code=c,true]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,有效 { rval=TPAD_Get_MaxVal(sample); if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL)))//大于tpad_default_val+TPAD_GATE_VAL,有效 { res=1; } //printf("r:%d\r\n",rval); keyen=5; //至少要再过5次之后才能按键有效 }else if(keyen>2)keyen=2; //如果检测到按键松开,则直接将次数将为2,以提高响应速度 if(keyen)keyen--; return res; }[/mw_shl_code]
贴成这样,你再好好看看.
我的代码,实在容易读懂,很好找if,else结构.
好好自己再看看吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2013-11-27
在线时间
0 小时
 楼主| 发表于 2014-6-18 15:45:20 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我看了下《C语言程序设计现代方法》K.N.King这本书的55页对if有了进一步的了解,这里其实是级联式if语句。代码应该可以写成这样,以便理解吧:
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,有效
{
   rval=TPAD_Get_MaxVal(sample);  
if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL)))
{
res=1;
}    
//printf("r:%d\r\n",rval);               
keyen=5; //至少要再过5次之后才能按键有效   
}
        else 
        {
         if(keyen>2)keyen=2;  //如果检测到按键松开,则直接将次数将为2,以提高响应速度
}
        if(keyen)
        {
         keyen--;                       
}
         return res;
}
下面我说下这个程序的执行过程,您帮我看下说的对不对:
当按下电容触摸按键时,进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,接着进入if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL))){}函数内。res=1,keyen=5。此时如果一直按着电容触摸按键,程序进不了if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL))){},但程序会跳出if(rval>(tpad_default_val+TPAD_GATE_VAL)){}而不会一直在这个函数内部循环。跳出后进入if(keyen){keyen--;},keyen等于4。(此时按键依然按着)然后程序会进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){},但进不了它的内部if(){},keyen又会等于5,接着又进入if(keyen){keyen--;},keyen=4;如此循环下去。直到松开按键,程序进入else{if(keyen>2){keyen=2;}},keyen等于2,然后执行if(keyen){keyen--;}keyen等于1,然后再执行一次else{}但内部if进不去,出来执行if(keyen){keyen--;},keyen等于0。在下一次按下触摸按键的时候从头循环一次。
回复

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2013-11-27
在线时间
0 小时
 楼主| 发表于 2014-6-18 15:55:35 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我第二次贴的代码对齐方式有点问题,其中一点是:else if 其实是else{if();}吧。
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
40
金钱
40
注册时间
2015-11-25
在线时间
8 小时
发表于 2015-11-25 21:50:32 | 显示全部楼层
回复【4楼】上善若水19900927:
---------------------------------
但是五次按键才有效又是如何控制的
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-6-20
在线时间
13 小时
发表于 2016-7-23 18:18:34 | 显示全部楼层
本帖最后由 wanghuayang 于 2016-7-23 18:35 编辑

我是菜鸟,我个人理解是样的(如果有错误,请大家指正)
当mode=0时,按下电容触摸按键时,进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,接着进入if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL))){}函数内。res=1,keyen=5,紧接着进入if(keyen)keyen--;因此keyen=4,此时如果一直按着电容触摸按键,程序能进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,但进不了if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL))){},keyen=5,紧接着进入if(keyen)keyen--;因此keyen=4,res=0;如果松开了,程序不能进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,此时keyen=4,紧接着进入else if(keyen>2)keyen=2;和if(keyen)keyen--;因此keyen=1,res=0,扫描速度很快,因此很快变成keyen=1,res=0;如果去触摸,进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,接着进入if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL))){}函数内。res=1,keyen=5,紧接着进入if(keyen)keyen--;因此keyen=4,res=1,如此循环.........
当mode=1时,按下电容触摸按键时(无论有没有触摸,keyen=0),进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,接着进入if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL))){}函数内。res=1,keyen=5,紧接着依次进入if(keyen)keyen--;因此keyen=4,res=1,此时如果一直按着电容触摸按键,程序能进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,由于keyen=0,可以进入if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL))){},res=1,keyen=5,紧接着依次进入if(keyen)keyen--;因此keyen=4,res=1;如果松开了,程序不能进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,此时keyen=0,res=0,如果去触摸,进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,接着进入if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL))){}函数内。res=1,keyen=5,紧接着依次进入if(keyen)keyen--;因此keyen=4,res=1,如此循环.........
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-6-20
在线时间
13 小时
发表于 2016-7-23 18:38:51 | 显示全部楼层
这里要注意一下keyen这个变量是静态变量,还有一个就是
if(mode)
        {
                sample=6;        //支持连按的时候,设置采样次数为6次
                keyen=0;        //支持连按          
        }
这个函数就是支持连续触摸的
回复

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-6-20
在线时间
13 小时
发表于 2016-7-23 18:39:41 | 显示全部楼层
我是菜鸟,我个人理解是样的(如果有错误,请大家指正)
当mode=0时,按下电容触摸按键时,进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,接着进入if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL))){}函数内。res=1,keyen=5,紧接着进入if(keyen)keyen--;因此keyen=4,此时如果一直按着电容触摸按键,程序能进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,但进不了if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL))){},keyen=5,紧接着进入if(keyen)keyen--;因此keyen=4,res=0;如果松开了,程序不能进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,此时keyen=4,紧接着进入else if(keyen>2)keyen=2;和if(keyen)keyen--;因此keyen=1,res=0,扫描速度很快,因此很快变成keyen=1,res=0;如果去触摸,进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,接着进入if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL))){}函数内。res=1,keyen=5,紧接着进入if(keyen)keyen--;因此keyen=4,res=1,如此循环.........
当mode=1时,按下电容触摸按键时(无论有没有触摸,keyen=0),进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,接着进入if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL))){}函数内。res=1,keyen=5,紧接着依次进入if(keyen)keyen--;因此keyen=4,res=1,此时如果一直按着电容触摸按键,程序能进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,由于keyen=0,可以进入if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL))){},res=1,keyen=5,紧接着依次进入if(keyen)keyen--;因此keyen=4,res=1;如果松开了,程序不能进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,此时keyen=0,res=0,如果去触摸,进入if(rval>(tpad_default_val+TPAD_GATE_VAL)){}函数内,接着进入if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL))){}函数内。res=1,keyen=5,紧接着依次进入if(keyen)keyen--;因此keyen=4,res=1,如此循环.........
回复

使用道具 举报

12

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-1-5
在线时间
22 小时
发表于 2017-8-7 15:18:08 | 显示全部楼层
看的眼花缭乱啊
天道酬勤
回复

使用道具 举报

4

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2017-5-22
在线时间
30 小时
发表于 2017-11-29 12:23:32 | 显示全部楼层
上善若水19900927 发表于 2014-6-18 15:45
回复【2楼】正点原子:
---------------------------------
我看了下《C语言程序设计现代方法》K.N.King这本 ...

这边是不支持连按的,而你说的应该是支持连按的程序吧
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 12:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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