OpenEdv-开源电子网

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

程序没看懂--KEY_Scan

[复制链接]

12

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-3-13
在线时间
0 小时
发表于 2015-4-20 22:52:18 | 显示全部楼层 |阅读模式
5金钱
独立看门狗实验中,有如下代码(mode=0):
u8 KEY_Scan(u8 mode)
{  
    static u8 key_up=1;//按键按松开标志
    if(mode)key_up=1;  //支持连按    
    if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
    {
        delay_ms(10);//去抖动 
        key_up=0;
        if(KEY0==0)return KEY0_PRES;
        else if(KEY1==0)return KEY1_PRES;
        else if(WK_UP==1)return WKUP_PRES; 
    }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;     
return 0;// 无按键按下
}

main中截取关键句:
while(1)
{
    if(KEY_Scan(0)==WKUP_PRES)IWDG_Feed();//如果WK_UP按下,则喂狗
    delay_ms(10);
};

mode=0,可以忽略灰色阴影的条件。
1s内KEY0按下,即KEY0==0,运行黄色的if函数,这时key_up=0,但看门狗仍旧重启。这个没疑问。
再接着,按下WKUP,但此时key_up==0了,就无法进入到黄色的if中,则永远不会return WKUP_PRES,没能喂狗。

但硬件测试的时候
却有喂狗,请详细说明我错在哪里了?万分感谢。

最佳答案

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

回复【4楼】正点原子: --------------------------------- 这个吧 首先看一下 这四个按键的端口配置。将K0、K1、K2配置为上拉输入、将wk_up配置为下拉输入(上拉就是该端口产生高电平、下拉则端口产生低电平)搞清了这个,他们取值为0或1 所表示按下 或松开 就不难理解了吧。本人理解程序是 u8 KEY_Scan(u8 mode) {   static u8 key_up=1;//这个static声明将key_up赋值为1,但 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

20

帖子

0

精华

高级会员

Rank: 4

积分
530
金钱
530
注册时间
2015-2-5
在线时间
45 小时
发表于 2015-4-20 22:52:19 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
这个吧 首先看一下 这四个按键的端口配置。将K0、K1、K2配置为上拉输入、将wk_up配置为下拉输入(上拉就是该端口产生高电平、下拉则端口产生低电平)搞清了这个,他们取值为0或1 所表示按下 或松开 就不难理解了吧。本人理解程序是
u8 KEY_Scan(u8 mode)
{  
static u8 key_up=1;//这个static声明将key_up赋值为1,但并不执行。之后循环过来时 ,隐藏起来 不执行
if(mode)key_up=1;  //   
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))
{
delay_ms(10);//
key_up=0;
if(KEY0==0)return KEY_RIGHT;
else if(KEY1==0)return KEY_DOWN;
else if(KEY2==0)return KEY_LEFT;
else if(KEY3==1)return KEY_UP;                  //至此能否连按其实已经判断完毕
}
                else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1; //这句话只是最开始都没按的状态吧。     
  return 0;//
}
假如mode=0,即不支持连按。
①key_up=1,②跳过if ③进入if 判断到有键按下。将key_up=0④跳过else ⑤再次执行时,跳过static (隐藏) ⑥ 跳过if(此时key_up=0)⑦跳过if ⑧ 判断else 如果全松开了 又回到①
假如mode=1,即支持连按。
① key_up=1,②判断if 则, key_up=1始终成立③ 进入if 判断结果为:如果按下了哪个键 ,则该循环就会一直循环下去,达到了持续按键的效果。。。。。
我不懂你们所说的奋斗,我喜欢认真做自己的事情。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-20 23:52:45 | 显示全部楼层
你没看到这句么? 
else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-3-13
在线时间
0 小时
 楼主| 发表于 2015-4-22 22:18:20 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
这句话的意思不是三个按键都按下吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-22 23:16:37 | 显示全部楼层
回复【3楼】Youngw:
---------------------------------
不是。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

20

帖子

0

精华

高级会员

Rank: 4

积分
530
金钱
530
注册时间
2015-2-5
在线时间
45 小时
发表于 2015-4-25 12:14:07 | 显示全部楼层
猜测 你要是按着key0、key1、或wk_up键不放的话就不会有喂狗事件了,只要你松开了,让它检测到了有全松开的时候,则key_up=1
我不懂你们所说的奋斗,我喜欢认真做自己的事情。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-25 21:58:57 | 显示全部楼层
回复【5楼】littlecloud:
---------------------------------
是的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2015-11-3
在线时间
0 小时
发表于 2015-11-12 16:28:34 | 显示全部楼层
回复【5楼】littlecloud:
---------------------------------
学习了,非常清楚,感谢!
回复

使用道具 举报

9

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2015-10-6
在线时间
25 小时
发表于 2016-4-5 13:22:11 | 显示全部楼层
littlecloud 发表于 2015-4-25 11:56
回复【4楼】正点原子:
---------------------------------
这个吧 首先看一下 这四个按键的端口 ...

⑥ 跳过if(此时key_up=0)这步不能理解,
回复

使用道具 举报

9

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2015-10-6
在线时间
25 小时
发表于 2016-4-5 13:25:36 | 显示全部楼层
littlecloud 发表于 2015-4-25 11:56
回复【4楼】正点原子:
---------------------------------
这个吧 首先看一下 这四个按键的端口 ...

⑥跳过if(此时key_up=0),为什么会跳过,不应该再执行判断吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 11:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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