OpenEdv-开源电子网

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

按键输入改写求教

[复制链接]

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2013-11-12
在线时间
0 小时
发表于 2014-4-25 17:29:53 | 显示全部楼层 |阅读模式
我想利用战舰版上的KEY0,KEY1,KEY2,KEY_UP(WK_UP)四个键实现输入一个三位二进制数,其中KEY0,KEY1,KEY2为有效位,KEY_UP(WK_UP)为按键结束标志键,基于原子哥的KEY_Scan()函数,写了下面的函数:
u8 Position(void)
{    
    u8 t;
    u8 unit0=0;
    u8 unit1=0;
    u8 unit2=0;
    u8 location=0;
    while(1)
    {                        
        t=KEY_Scan(0);
        if(t==1||t==2||t==3)
        {
            switch(t)
            {
             case 1: unit0=1;break;
             case 2: unit1=1;break;
             case 3: unit2=1;break;
            }
        }
        else if(t==4)
        {
            location=4*unit2+2*unit1+unit0;
            return location;
        }
    }
}
编译没有问题,可是下到板子上却不能用,调试发现陷在循环里出不来,按键无效,不知是何原因,还想请各位指点一下。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

222

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2013-11-21
在线时间
0 小时
发表于 2014-4-25 17:37:56 | 显示全部楼层
回复【楼主位】humble:
---------------------------------
你判断完按键后,没有跳出while
回复 支持 反对

使用道具 举报

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2013-11-12
在线时间
0 小时
 楼主| 发表于 2014-4-26 09:52:34 | 显示全部楼层
回复【2楼】苦竹2009:
---------------------------------
我是通过return location直接返回函数值的,因为要求KEY0,KEY1,KEY2按下的时候只能是改变各位的数值,只有当KEY_UP键按下的时候才能返回函数值的,是不是return不能跳出循环啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-26 16:43:19 | 显示全部楼层
回复【3楼】humble:
---------------------------------
代码没问题,return可以退出循环的。
怀疑KEY_Scan没有返回需要的结果。
所以一直在循环。
是不是KEY_Init忘了初始化?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2013-11-12
在线时间
0 小时
 楼主| 发表于 2014-4-28 19:12:33 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
查了一下,KEY_Init初始化了的。不过的确是KEY_Scan没有返回需要的结果,单步调试时,发现按下任何一个键,if....else if....均只是判断条件不符合,所以任何赋值语句均未得到执行,所以跳不出循环了。原子哥能解释下吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-28 19:23:17 | 显示全部楼层
回复【5楼】humble:
--------------------------------
仿真进入KEY_Scan里面,看看IO状态。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2013-11-12
在线时间
0 小时
 楼主| 发表于 2014-5-5 20:58:54 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
试了下,KEY_UP键与程序里的不一样,KEY_Scan()里是当KEY3=1时,表示按下,而实际操作是KEY3=0时表示按下。还有就是还想问一下,
这个KEY_UP也就是KEY3在硬件上和其他三个键有什么不同?为什么我在跑程序时,连续两次调用原帖中的Position函数,第一次调用效果很好,
第二次调用时,不需按下KEY3(即不需按下确认键),而只需按下KEY0,1,2中的任何一个,就有返回值了?很是不解。是KEY3按下之后需要
做特殊处理,才能按下第二次吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-5 23:51:23 | 显示全部楼层
回复【7楼】humble:
---------------------------------
WKUP按键是高电平有效的。
其它按键则是低电平有效。
所以判断WK_UP是否按下,就是判断是否等于1.其它的则是是否等于0.

你说的第二次调用,不需要WK_UP按下就可以得到WK_UP的键值,应该不可能的。
你没有改动我们的KEY_Scan函数吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2013-11-12
在线时间
0 小时
 楼主| 发表于 2014-5-6 15:01:43 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
改了,就是把判断时的KEY3等于1还是0互换了一下,因为按原来的调试时,不能检测到KEY3按下,虽然其他的三个键没问题,
但这样就没办法退出循环了。
改了之后,能用的,单步调试时没问题,是在检测到第二次按下KEY3的按下才退出的,但是在下到板子上测试时,就出现了如上的
问题。求支招!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 22:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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