OpenEdv-开源电子网

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

怎么处理按键和while循环呀?

[复制链接]

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
发表于 2017-5-24 15:31:44 | 显示全部楼层 |阅读模式
使用F4开发板,想做一个,按K1键后LED1键,间隔闪烁,按K2键后,LED2间隔闪烁,但是在处理按键后,闪烁的时候,在while(1)里面循环一直不出来了,并且写入k2键按下跳出的判断也没有用,我要怎么去实现呢?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-1-8
在线时间
544 小时
发表于 2017-5-27 15:33:51 | 显示全部楼层
用if语句实现,while(1)肯定出不来
回复 支持 1 反对 0

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2017-5-25 09:22:57 | 显示全部楼层
直接在按K1键弹起来之后给个标志位置位,然后检测到这个标志位置位后就让LED1闪烁,同样的方法处理K2和LED2就好了
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-5-27 10:54:00 | 显示全部楼层
lzq12 发表于 2017-5-25 09:22
直接在按K1键弹起来之后给个标志位置位,然后检测到这个标志位置位后就让LED1闪烁,同样的方法处理K2和LED2 ...

不是呀,我想做的是按下K1键后,LED1闪烁,按下K2键,只有LED2闪烁,代码如下:if (ucKeyCode != KEY_NONE)
                {
                        switch (ucKeyCode)
                        {
                                case KEY_DOWN_K1:               
                                        bsp_LedOn(1);
                                       
                                        break;

                                case KEY_UP_K1:       
                                       
                                while(1)
                                {
                                        bsp_LedOn(1);
                                        delay_ms(500);
                                        bsp_LedOff(1);       
                                }
                                       
                                        break;

                                case KEY_DOWN_K2:               
                                        bsp_LedOn(2);
                                       
                                        break;

只要进入while就进入死循环了,怎么办?
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2017-5-27 11:46:45 | 显示全部楼层
假如爱有天意123 发表于 2017-5-27 10:54
不是呀,我想做的是按下K1键后,LED1闪烁,按下K2键,只有LED2闪烁,代码如下:if (ucKeyCode != KEY_NON ...

LED灯闪烁程序不要放在按键检测里面,while(1)
                                {
                                        bsp_LedOn(1);
                                        delay_ms(500);
                                        bsp_LedOff(1);        
                                }
把这些语句直接替换成一个标志位置位,如K1_UP = 1;,然后在main里面的那个while里面去判断if(K1_UP){
K1_UP  = 0;
bsp_LedOn(1);
                                        delay_ms(500);
                                        bsp_LedOff(1);   
}
回复 支持 反对

使用道具 举报

8

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2016-12-30
在线时间
37 小时
发表于 2017-5-27 14:11:28 | 显示全部楼层
bangding..........
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-5-27 14:29:57 | 显示全部楼层
lzq12 发表于 2017-5-27 11:46
LED灯闪烁程序不要放在按键检测里面,while(1)
                                {
                   ...

没有明白是怎么回事,主函数里面是这样的
        while (1)
        {
                bsp_Idle();               

                if (bsp_CheckTimer(0))       
                {
                       
                        bsp_LedToggle(4);       
                }       
if (ucKeyCode != KEY_NONE)
                {
                        switch (ucKeyCode)
                        {
                                case KEY_DOWN_K1:                       
                                        bsp_LedOn(1);
                                        break;
                                case KEY_UP_K1:       
                                        while(1)
                                {
                                        bsp_LedOn(1);
                                        delay_ms(500);
                                        bsp_LedOff(1);       
                                }
                                        break;
                                case KEY_DOWN_K2:                       
                                        bsp_LedOn(2);
                                        break;
                                case KEY_UP_K2:                               
                                        bsp_LedOff(2);
                                        break;
}
}
能不能说的简单明了一点,我才学这个,弄不明白
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-5-27 15:02:16 | 显示全部楼层
lzq12 发表于 2017-5-27 11:46
LED灯闪烁程序不要放在按键检测里面,while(1)
                                {
                   ...

我把while死循环改为定时器,为啥也不行呢?
微信图片_20170527145841.png
微信图片_20170527145841.png
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-5-27 16:29:33 | 显示全部楼层
Sun_Fly 发表于 2017-5-27 15:33
用if语句实现,while(1)肯定出不来

那怎么写,求解救
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-5-27 16:30:06 | 显示全部楼层

怎么绑定,跪求解决方案
回复 支持 反对

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-1-8
在线时间
544 小时
发表于 2017-5-27 16:36:29 | 显示全部楼层

switch  case  换成 if  这不必用帮你写了把  
回复 支持 反对

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2017-5-27 16:54:36 来自手机 | 显示全部楼层
你这代码莫名其妙的……可以用一个标记来确定时间到了之后是led1点亮还是led2点亮。这样子的话流程是:扫描按键(这里是直接读数)->按键分支{按下:关闭并重设定时器,点亮led;抬起:打开定时器,关闭led,设置led点亮标记(led1或led2)}->读定时器是否到时,到了则根据led变量来点亮led。以上循环就可以了
回复 支持 反对

使用道具 举报

1

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2015-10-13
在线时间
34 小时
发表于 2017-5-30 17:49:02 | 显示全部楼层
每个LED等单独写个控制函数
1、延时用定时器来延时。
2、LED函数里面不能出现while 死循环,可以让它工作一次,函数就关闭。
3、赋值一个全局变量key,用来保存按键键值。
4、用switch来判断按键键值,通过键值来运行需要控制小灯的函数
5、在switch判断语句里面,可以写   default:key=0;break;
这样就达到了,按键按下小灯亮,延时,亮,延时的循环了,而且你按下按键立马响应
不要把钱当成你们的首要追求的目标,你们只需要追求两个字,卓越,你只要去追求它, 这个钱它自然就会跟着你,当你有了远大的目标跟志向的时候, 你自己本身它就是一个财富,钱,它就变成了一个副产品.
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2017-5-31 09:54:52 | 显示全部楼层
假如爱有天意123 发表于 2017-5-27 15:02
我把while死循环改为定时器,为啥也不行呢?

同意13楼的说法,不过你刚开始学,还是一点点来吧,多编写和多看一下别人好的编程思路对自己的编程能力有比较大的提高的,可以参考原子哥的例程的,他讲得还是挺详细的,而且他的编程思路都可以用在项目上,慢慢养成严谨的编程习惯这个是比较重要的
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-6-1 14:47:03 | 显示全部楼层
安尚科技 发表于 2017-5-30 17:49
每个LED等单独写个控制函数
1、延时用定时器来延时。
2、LED函数里面不能出现while 死循环,可以让它工作 ...

C:\Users\Administrator\Desktop\1.png
C:\Users\Administrator\Desktop\2.png
使用if就不行,使用switch就可以,这是怎么回事,
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-6-1 14:47:43 | 显示全部楼层
使用if就不行,使用switch就可以,这是怎么回事,
1.png
2.png
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-6-1 14:49:52 | 显示全部楼层
安尚科技 发表于 2017-5-30 17:49
每个LED等单独写个控制函数
1、延时用定时器来延时。
2、LED函数里面不能出现while 死循环,可以让它工作 ...

帮我分析分析这个是什么情况为什么不能行呢?还有你写的这个步骤,我使用安富莱stm32f407IG,根本就不知道怎么写,怎么办?
1.png
2.png
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-6-1 14:50:24 | 显示全部楼层
Sun_Fly 发表于 2017-5-27 15:33
用if语句实现,while(1)肯定出不来

if写了,但是不能使用,根本没有效果了
回复 支持 反对

使用道具 举报

1

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2015-10-13
在线时间
34 小时
发表于 2017-6-1 15:02:23 | 显示全部楼层
假如爱有天意123 发表于 2017-6-1 14:49
帮我分析分析这个是什么情况为什么不能行呢?还有你写的这个步骤,我使用安富莱stm32f407IG,根本就不知 ...

用if ,就要有else,这样执行会根据判断条件运行,写程序主要是思路,不在乎你用的什么样的单片机,好的思路就会造就好的程序,注意细节,你的程序会越来越完美。
不要把钱当成你们的首要追求的目标,你们只需要追求两个字,卓越,你只要去追求它, 这个钱它自然就会跟着你,当你有了远大的目标跟志向的时候, 你自己本身它就是一个财富,钱,它就变成了一个副产品.
回复 支持 反对

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-1-8
在线时间
544 小时
发表于 2017-6-1 15:15:32 | 显示全部楼层
假如爱有天意123 发表于 2017-6-1 14:50
if写了,但是不能使用,根本没有效果了

去掉  break,break直接跳出while循环了,你仿真看看,如过你的 这几个状态不是都要执行的,其他就改成elseif
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-6-1 15:51:24 | 显示全部楼层
安尚科技 发表于 2017-6-1 15:02
用if ,就要有else,这样执行会根据判断条件运行,写程序主要是思路,不在乎你用的什么样的单片机,好的思 ...

确实是使用else if就可以了,但是我要怎么才能做到,按k1键的时候led1灯闪烁,按k2键的时候只有led2灯闪烁呢?
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-6-1 15:51:36 | 显示全部楼层
Sun_Fly 发表于 2017-6-1 15:15
去掉  break,break直接跳出while循环了,你仿真看看,如过你的 这几个状态不是都要执行的,其他就改成el ...

确实是使用else if就可以了,但是我要怎么才能做到,按k1键的时候led1灯闪烁,按k2键的时候只有led2灯闪烁呢?
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-6-1 15:57:27 | 显示全部楼层
目前把原来的代码,改为if,,else if后,也是能实现按k1键,led1亮,按k2键,led2亮,但是我想让按k1键的时候led1灯闪烁,按k2键的时候只有led2灯闪烁呢,并且是k1和k2是分开执行的,可以相互打断执行,一直没有想出好的思路来,跪求指教
3.png
回复 支持 反对

使用道具 举报

1

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2015-10-13
在线时间
34 小时
发表于 2017-6-1 16:00:58 | 显示全部楼层
假如爱有天意123 发表于 2017-6-1 15:57
目前把原来的代码,改为if,,else if后,也是能实现按k1键,led1亮,按k2键,led2亮,但是我想让按k1键的 ...

灯亮的函数单独写,另外延时用定时器,在函数里面关闭其他灯,只让你想亮的亮,
不要把钱当成你们的首要追求的目标,你们只需要追求两个字,卓越,你只要去追求它, 这个钱它自然就会跟着你,当你有了远大的目标跟志向的时候, 你自己本身它就是一个财富,钱,它就变成了一个副产品.
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-6-1 16:06:14 | 显示全部楼层
安尚科技 发表于 2017-6-1 16:00
灯亮的函数单独写,另外延时用定时器,在函数里面关闭其他灯,只让你想亮的亮,

灯亮,灯的关闭,我都是在另一个.c文件里面写的,并且你看上面的图,我加的有定时器,但是在循环里面我在去判断就出错了,不会写,原谅我一个纯软件的,来弄这个东西,确实欠缺太多了
回复 支持 反对

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-1-8
在线时间
544 小时
发表于 2017-6-1 16:17:02 | 显示全部楼层
假如爱有天意123 发表于 2017-6-1 15:51
确实是使用else if就可以了,但是我要怎么才能做到,按k1键的时候led1灯闪烁,按k2键的时候只有led2灯闪 ...

是应为你去掉了break,不是应为加了else if
K1 K2做成中断,有中断就置1,对应不同的if语句
回复 支持 反对

使用道具 举报

1

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2015-10-13
在线时间
34 小时
发表于 2017-6-1 16:25:09 | 显示全部楼层
假如爱有天意123 发表于 2017-6-1 16:06
灯亮,灯的关闭,我都是在另一个.c文件里面写的,并且你看上面的图,我加的有定时器,但是在循环里面我在 ...

哈哈,思路不对。
给你个例程自己研究吧


        key+=KEY_Scan(0);
        switch(key)
        {
                case 0:关闭小灯;key+=1;break;
                case 1:执行灯亮函数1;break;
                case 2:关闭小灯;key+=1;break;
                case 3:执行灯亮函数2;break;
                case 4:关闭小灯;key+=1;break;
                case 5:执行灯亮函数3;break;
                case 6:关闭小灯;key+=1;break;
                case 7:执行灯亮函数4;break;
                case 8:关闭小灯;key=0;break;
                default :break;
        }

//下面为定时器延时500ms图片变化的函数,可以改为小灯


void HP6_BMP(u8 x,u8 y)
{
        if(delay_hp6>999)
                {
                        delay_hp6=0;
                        OLED_DisplayBMP(x,y,40,40,HP6[0]);
                       
                }
                        else if(delay_hp6>499&&delay_hp6<1000)
                {
                        OLED_DisplayBMP(x,y,40,40,HP6[1]);
                               
                }
OLED_Refresh_Gram();//刷新OLED屏用的
}
不要把钱当成你们的首要追求的目标,你们只需要追求两个字,卓越,你只要去追求它, 这个钱它自然就会跟着你,当你有了远大的目标跟志向的时候, 你自己本身它就是一个财富,钱,它就变成了一个副产品.
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-6-2 09:34:40 | 显示全部楼层
Sun_Fly 发表于 2017-6-1 16:17
是应为你去掉了break,不是应为加了else if
K1 K2做成中断,有中断就置1,对应不同的if语句

为什么我这个判断死循环没有用呢?进入死循环后就出不来了
4.png
回复 支持 反对

使用道具 举报

16

主题

111

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1248
金钱
1248
注册时间
2017-3-18
在线时间
316 小时
发表于 2017-6-2 10:03:13 | 显示全部楼层
goto:
回复 支持 反对

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-1-8
在线时间
544 小时
发表于 2017-6-2 10:11:01 | 显示全部楼层
假如爱有天意123 发表于 2017-6-2 09:34
为什么我这个判断死循环没有用呢?进入死循环后就出不来了

无语了,去掉while(1),把整个if括到while里面  你C语言没学好,谁教你的
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-6-2 10:17:19 | 显示全部楼层
Sun_Fly 发表于 2017-6-2 10:11
无语了,去掉while(1),把整个if括到while里面  你C语言没学好,谁教你的

我要是不用这个while(1),就不能实现这个灯的闪烁状态了,一直没有想到解决的办法,才学这个
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-6-2 10:17:43 | 显示全部楼层

我能说没有用过goto语句不
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-6-2 10:18:09 | 显示全部楼层

我能说没有用过goto语句不
回复 支持 反对

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-1-8
在线时间
544 小时
发表于 2017-6-2 10:23:02 | 显示全部楼层
假如爱有天意123 发表于 2017-6-2 10:18
我能说没有用过goto语句不

把工程发过来  给你改一下,或者你的当前.c文件
回复 支持 反对

使用道具 举报

6

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-5-24
在线时间
13 小时
 楼主| 发表于 2017-6-2 10:32:40 | 显示全部楼层
Sun_Fly 发表于 2017-6-2 10:23
把工程发过来  给你改一下,或者你的当前.c文件

我能加你qq或者微信吗?我qq929691208,微信为18339928817,我不知道在这个上面怎么发工程,我发送不动
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-19 21:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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