OpenEdv-开源电子网

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

mini板子做的按键问题

[复制链接]

6

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
203
金钱
203
注册时间
2016-10-15
在线时间
21 小时
发表于 2017-8-30 16:22:17 | 显示全部楼层 |阅读模式
1金钱
新手跟着原子的视频做的按键实验(mini版,就是按键控制LED灯的那个),做完之后发现有两个问题:
1、出现了一个警告, snipaste_20170830_160741.png snipaste_20170830_160822.png
2、把程序下进单片机后发现,第一次按下按键效果是对的,但是再一次按下按键就没反应了。我的程序是刚开始初始化为LED0、LED1都是熄灭,按下KEY0则LED0状态翻转,按下KEY1则KEY1状态翻转,按下WK_UP则LED0、LED1都翻转,但是下了程序之后按下按键发现第一次按下按键KEY0,LED0亮,此时现象正确,再按按键KEY0,LED0就没反应,还是亮,复位后,按下KEY1和WK_UP也是同样现象 snipaste_20170830_161738.png (主函数), snipaste_20170830_161914.png (按键初始化和扫描)
希望大神讲解一下,谢谢

最佳答案

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

这函数里你改错了, 没有按键按下,不会有返回值 u8 KEY_Scan(u8 mode) { static u8 key_up=1; //按键松开标志 if(mode) key_up=1; //支持连按 if(key_up&&(KEY1==0||KEY1==0||KEY2==0||WK_UP==0)) //有按键按下 { delay_ms(10); //按键去抖 key_up=0; if(KEY2==0) return 1; else if(KEY1==0) return 2; // ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-30 16:22:18 | 显示全部楼层
不要这样啦 发表于 2017-8-30 18:03
你好,我发现是我的按键扫描的最后,判断按键没有按下时我给他写到按键按下的if语句里面去了,但是我写了 ...

这函数里你改错了, 没有按键按下,不会有返回值
u8 KEY_Scan(u8 mode)
{
        static u8 key_up=1;   //按键松开标志
        if(mode) key_up=1;  //支持连按
        if(key_up&&(KEY1==0||KEY1==0||KEY2==0||WK_UP==0)) //有按键按下
        {
                delay_ms(10);  //按键去抖
                key_up=0;
                if(KEY2==0) return 1;
                else if(KEY1==0) return 2;
//                else if(KEY0==0) return 3;
                else if(WK_UP==0) return 4;
        }else if(KEY1==1&&KEY1==1&&KEY2==1&&WK_UP==1)                {
          key_up=1;
          return 0; //无按键按下
         }
}


这样才对的,没有按键按下,会有返回值0
u8 KEY_Scan(u8 mode)
{
        static u8 key_up=1;   //按键松开标志
        if(mode) key_up=1;  //支持连按
        if(key_up&&(KEY1==0||KEY1==0||KEY2==0||WK_UP==0)) //有按键按下
        {
                delay_ms(10);  //按键去抖
                key_up=0;
                if(KEY2==0) return 1;
                else if(KEY1==0) return 2;
//                else if(KEY0==0) return 3;
                else if(WK_UP==0) return 4;
        }else if(KEY1==1&&KEY1==1&&KEY2==1&&WK_UP==1)key_up=1;
        return 0; //无按键按下
}
回复

使用道具 举报

1

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2011-12-1
在线时间
110 小时
发表于 2017-8-30 16:33:18 | 显示全部楼层
你在你的while(1)大循环的case语句后面把你的scan的值赋值为0,或者在你的KEY_Scan的函数判断有无按键的if语句后面加个else return 0;这样子你的警告也会没有了!
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
发表于 2017-8-30 16:59:51 | 显示全部楼层
那个警告的意思大概是 KEY_Scan();函数缺少一个状态返回,应该是你KEY_Scan函数里的问题。你检查一下你那几个返回变量的定义吧。应该是那有问题。
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-30 17:10:48 | 显示全部楼层
本帖最后由 huanghan 于 2017-8-30 19:08 编辑

这函数里你改错了, 没有按键按下,不会有返回值
u8 KEY_Scan(u8 mode)
{
        static u8 key_up=1;   //按键松开标志
        if(mode) key_up=1;  //支持连按
        if(key_up&&(KEY1==0||KEY1==0||KEY2==0||WK_UP==0)) //有按键按下
        {
                delay_ms(10);  //按键去抖
                key_up=0;
                if(KEY2==0) return 1;
                else if(KEY1==0) return 2;
//                else if(KEY0==0) return 3;
                else if(WK_UP==0) return 4;
        }else if(KEY1==1&&KEY1==1&&KEY2==1&&WK_UP==1)                {
          key_up=1;
          return 0; //无按键按下

         }
}


这样才对的,没有按键按下,会有返回值0
u8 KEY_Scan(u8 mode)
{
        static u8 key_up=1;   //按键松开标志
        if(mode) key_up=1;  //支持连按
        if(key_up&&(KEY1==0||KEY1==0||KEY2==0||WK_UP==0)) //有按键按下
        {
                delay_ms(10);  //按键去抖
                key_up=0;
                if(KEY2==0) return 1;
                else if(KEY1==0) return 2;
//                else if(KEY0==0) return 3;
                else if(WK_UP==0) return 4;
        }else if(KEY1==1&&KEY1==1&&KEY2==1&&WK_UP==1)key_up=1;
        return 0; //无按键按下
}



回复

使用道具 举报

6

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
203
金钱
203
注册时间
2016-10-15
在线时间
21 小时
 楼主| 发表于 2017-8-30 17:19:09 | 显示全部楼层
q247341184 发表于 2017-8-30 16:59
那个警告的意思大概是 KEY_Scan();函数缺少一个状态返回,应该是你KEY_Scan函数里的问题。你检查一下你那几 ...

但是已经有返回值了呀
回复

使用道具 举报

6

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
203
金钱
203
注册时间
2016-10-15
在线时间
21 小时
 楼主| 发表于 2017-8-30 18:03:01 | 显示全部楼层
huanghan 发表于 2017-8-30 17:10
这函数里你改错了
u8 KEY_Scan(u8 mode)
{

你好,我发现是我的按键扫描的最后,判断按键没有按下时我给他写到按键按下的if语句里面去了,但是我写了下面写还是不行
u8 KEY_Scan(u8 mode)
{
        static u8 key_up = 1;//°′¼üû°′ê±key_upÎa1
        if(mode)key_up=1;  //Ö§3Öᬰ′               
        if(key_up && (KEY0 == 0 || KEY1 == 0 || WK_UP == 1)) //ÅD¶Ï°′¼üêÇ·ñ°′ÏÂ
        {
                delay_ms(10);
                key_up = 0;//°′¼ü°′ÏÂê±Îa0
                if (KEY0 == 0)
                {
                        return KEY0_PRE;
                }
                else if(KEY1 == 0)
                {
                        return KEY1_PRE;
                }
                else if(WK_UP == 1)
                {
                        return WK_UP_PRE;
                }
        }
                else if (KEY0 == 1 && KEY1 == 1 && WK_UP == 0)
                {
                        key_up = 1;
                        return 0;
                }

}


但是换成这种写法就可以
u8 KEY_Scan(u8 mode)
{
        static u8 key_up = 1;//°′¼üû°′ê±key_upÎa1
        if(mode)key_up=1;  //Ö§3Öᬰ′               
        if(key_up && (KEY0 == 0 || KEY1 == 0 || WK_UP == 1)) //ÅD¶Ï°′¼üêÇ·ñ°′ÏÂ
        {
                delay_ms(10);
                key_up = 0;//°′¼ü°′ÏÂê±Îa0
                if (KEY0 == 0)
                {
                        return KEY0_PRE;
                }
                else if(KEY1 == 0)
                {
                        return KEY1_PRE;
                }
                else if(WK_UP == 1)
                {
                        return WK_UP_PRE;
                }
        }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;              
        return 0;

,这两个有什么区别呢,麻烦讲解一下,谢谢
回复

使用道具 举报

6

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
203
金钱
203
注册时间
2016-10-15
在线时间
21 小时
 楼主| 发表于 2017-8-30 19:25:53 | 显示全部楼层
huanghan 发表于 2017-8-30 19:08
这函数里你改错了, 没有按键按下,不会有返回值
u8 KEY_Scan(u8 mode)
{

我知道我的第一个有问题,但是我感觉两个是一样的啊,第一个判断按键没按下时,key_up=1;返回0,和下面的那个程序有什么区别呢?能不能详细解释一下
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-30 19:32:51 | 显示全部楼层
本帖最后由 huanghan 于 2017-8-30 19:55 编辑

u8 KEY_Scan(u8 mode)
{
        static u8 key_up=1;   //按键松开标志
        if(mode) key_up=1;  //支持连按
        if(key_up&&(KEY1==0||KEY1==0||KEY2==0||WK_UP==0)) //有按键按下
        {
                delay_ms(10);  //按键去抖
                key_up=0;
                if(KEY2==0) return 1;
                else if(KEY1==0) return 2;
//                else if(KEY0==0) return 3;
                else if(WK_UP==0) return 4;
        }
         else if(KEY1==1&&KEY1==1&&KEY2==1&&WK_UP==1)                
         
          {
          key_up=1;
          return 0; //这里放在外面,                                                                                                                                                                                               }}

标准函数内形,编译器只认识这个,语法上的错
u8 KEY_Scan(void)   
{....;
....;
....;
     return 0;
}






回复

使用道具 举报

6

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
203
金钱
203
注册时间
2016-10-15
在线时间
21 小时
 楼主| 发表于 2017-8-30 22:33:51 | 显示全部楼层
huanghan 发表于 2017-8-30 19:32
u8 KEY_Scan(u8 mode)
{
        static u8 key_up=1;   //按键松开标志

能不能详细解释一下呢
回复

使用道具 举报

10

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2017-7-27
在线时间
98 小时
发表于 2017-8-30 22:35:47 | 显示全部楼层
去找度娘吧!
回复

使用道具 举报

0

主题

9

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2017-9-1
在线时间
2 小时
发表于 2017-9-1 09:30:32 | 显示全部楼层
......
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 16:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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