OpenEdv-开源电子网

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

学习触摸按键课程,键盘扫描部分遇到的一个问题

[复制链接]

2

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-1-3
在线时间
5 小时
发表于 2016-1-5 16:49:14 | 显示全部楼层 |阅读模式
2金钱
本帖最后由 stm32435765875 于 2016-1-5 18:40 编辑

#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--;        ————》if(keyen==1)keyen--;                                          ------------》else keyen--  ;                    这里有三个写法去替代前面的,只有最后一个 if(keyen>0)是对的!也就是实验现象正确,上面两个不行么?原因是?
                                      ————》 if(keyen>0) keyen--;                                                                                                                                         
        return res;
}        

最佳答案

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

1.if(keyen == 1)keyen--;这个不对,前面赋值keyen=3,这里只有为1的时候才自减,3的时候没进行任何操作,也就是这条判断永远不会执行 2.看你的问题真是费劲,问问题前先捋一下思路,把问题表达清楚一些,四种情况标出个一二三四,你这叫一个乱
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-1-5 16:49:15 | 显示全部楼层
stm32435765875 发表于 2016-1-5 18:32
//扫描触摸按键
//mode:0,不支持连续触发(按下一次必须松开才能按下一次);1,支持连续触发(可以一直按下)
...

1.if(keyen == 1)keyen--;这个不对,前面赋值keyen=3,这里只有为1的时候才自减,3的时候没进行任何操作,也就是这条判断永远不会执行
2.看你的问题真是费劲,问问题前先捋一下思路,把问题表达清楚一些,四种情况标出个一二三四,你这叫一个乱
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

30

主题

282

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2015-8-24
在线时间
241 小时
发表于 2016-1-5 17:09:51 | 显示全部楼层
不太明白你的意思,那里的if里面你到底想改成什么??  keyen是u8类型,你还要注意一下。
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2016-1-5 17:51:18 | 显示全部楼层
邏輯死角

if(keyen) 代表 keyen==1 對吧?
你程式裡沒有讓他 keyen=1 的時候
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-1-3
在线时间
5 小时
 楼主| 发表于 2016-1-5 18:21:20 | 显示全部楼层
沉默焚烧 发表于 2016-1-5 17:09
不太明白你的意思,那里的if里面你到底想改成什么??  keyen是u8类型,你还要注意一下。

if里面参考例程本来写的是keyen,但是我自己写的时候改成是else就不行
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-1-3
在线时间
5 小时
 楼主| 发表于 2016-1-5 18:23:15 | 显示全部楼层
Rocks 发表于 2016-1-5 17:51
邏輯死角

if(keyen) 代表 keyen==1 對吧?

if(keyen) 是例程程序里写的     我自己写的时候把他改成else就不可以了,改成==1也不可以,只有改成>0才可以...所以才不理解为什么
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-1-3
在线时间
5 小时
 楼主| 发表于 2016-1-5 18:32:11 | 显示全部楼层
本帖最后由 stm32435765875 于 2016-1-5 18:36 编辑

//扫描触摸按键
//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--;        ***************************
        //if(keyen==1)keyen--;***************************        //if(keyen>0)keyen--;******这四行行加注释是四个写法,只有第一个 if(keyen) 和第三个if(keyen>0)是对的,其他两个是错的....为什么呀..??
        //else keyen--******************************
        return res;
}
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-1-3
在线时间
5 小时
 楼主| 发表于 2016-1-7 10:30:19 | 显示全部楼层
这个地方没有人可以帮忙解释一下么?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-1-7 22:53:30 | 显示全部楼层
仿真下
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-1-3
在线时间
5 小时
 楼主| 发表于 2016-1-11 17:55:53 | 显示全部楼层
龙之谷 发表于 2016-1-5 16:49
1.if(keyen == 1)keyen--;这个不对,前面赋值keyen=3,这里只有为1的时候才自减,3的时候没进行任何操 ...

嗯嗯,不好意思,新人有点毛糙了,多问一句,if(K)如果写完全的话是不是if(k==1)?
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-1-11 18:36:50 | 显示全部楼层
stm32435765875 发表于 2016-1-11 17:55
嗯嗯,不好意思,新人有点毛糙了,多问一句,if(K)如果写完全的话是不是if(k==1)?

不是,if(k)只要k不等于0就为真,C语言亟待加强
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 20:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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