OpenEdv-开源电子网

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

按键一按下进入参数一显示在3位数码管,但是死循环出不来。

[复制链接]

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
发表于 2023-4-12 23:09:22 | 显示全部楼层 |阅读模式
5金钱
//主程序死循环的程序//

                key = KEY_scan(0);  //读取键值 模式0
                if(key)
                {
                        switch(key)
                        {
                                case KEY1_D:    //按键一按下
                                        canshu_flag1 = canshu_flag1 + 1;//数码管显示参数标志位
//                                        LED1 = !LED1;//翻转LED0电平
//                                  display_data(x = (x + 100),i);
                                        if(canshu_flag1 < 4)            //4个参数
                                        {
                                                switch(canshu_flag1)        
                                                {
                                                        case 1:                     //参数一
                                                                LED1 = !LED1;
                                                                for(;;)
                                                                {
                                                                        send_data(num[11],1);//数码管第一位
                                                                        delay_ms(1);
                                                                        send_data(num[1],2);//数码管第二位
                                                                        delay_ms(1);
                                                                        send_data(num[14],3);//数码管第三位
                                                                        delay_ms(1);
                                                                        if(canshu_flag1 == 2)break;
                                                                }
                                                        break;
                                                        case 2:                    //参数二
                                                                LED0 = !LED0;
                                                                for(;;)
                                                                {
                                                                        send_data(num[12],1);
                                                                        delay_ms(1);
                                                                        send_data(num[1],2);
                                                                        delay_ms(1);
                                                                        send_data(num[14],3);
                                                                        delay_ms(1);
                                                                }
                                                        break;
                                                        case 3:
                                                                for(;;)
                                                                {
                                                                        send_data(num[13],1);
                                                                        delay_ms(1);
                                                                        send_data(num[1],2);
                                                                        delay_ms(1);
                                                                        send_data(num[14],3);
                                                                        delay_ms(1);
                                                                }
                                                        break;
                                                }
                                        }
                                        else if(canshu_flag1 >= 4)
                                        {
                                                canshu_flag1 = 1;
                                        }
                                       
                                break;
                                case KEY2_D:
//                                LED1 = !LED1;//翻转LED1电平
//                                display_data(x = (x + 10),i);
                                break;
                                case KEY3_D:
//                                BEEP = !BEEP;//翻转蜂鸣器电平
//                                display_data(x = (x + 1),i);
                                break;
                                case KEY4_D:
                                        while(1)
                                        {
                                                if(a < 100)
                                                {
                                                        for(i = 1; i < 4;i ++)
                                                        {
                                                                display_data(x,i);
                                                                delay_ms(1);
                                                        }
                                                         a++;
                                                }
                                               
                                                if(a == 100)
                                                {
                                                        send_data(num[10],2);
                                //                  delay_ms(1);
                                                        for(i=1;i<3;i++)
                                                        {
                                                                display_data(x,i);           //所有位正常显示
                                                                delay_ms(1);
                                                        }
                                                        b++;
                                                        if(b == 100)
                                                        {
                                                                a = 0;
                                                                b = 0;
                                                        }
                                                }       
                                        }
//                                LED0 = !LED0;//翻转LED1电平
//                                BEEP = !BEEP;//翻转蜂鸣器电平
                                break;
                                case KEY5_D:
                                        LED0 = !LED0;
                                       
                                break;
                                case KEY_0:
                                       
                                break;
                               
                        }
                }else delay_ms(10);

最佳答案

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

给你举个例子 while(1) { key(); led(); } uint8_t num0; uint8_t num1; uint8_t num2; void key() { switch(KEY_scan(0)) { case KEY1_D: canshu_flag1++;if((canshu_flag1>3)canshu_flag1=0;break; case KEY2_D: switch(canshu_flag1) { case 0:num0++;if(num0>9) num0=0;break; case 1:num1++;if(num1>9) num1=0;break; case 2:num2++;if(num2>9) num2=0;break; } } } void led() { switch(cans ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2021-9-8
在线时间
54 小时
发表于 2023-4-12 23:09:23 | 显示全部楼层
openresistance 发表于 2023-4-13 15:20
谢谢大佬。
程序实现功能:四个按键(设置,加,移位,进入)
上电不显示,按设置键切换3个参数,按进 ...

给你举个例子
while(1)
{
key();
led();
}
uint8_t num0;
uint8_t num1;
uint8_t num2;
void key()
{
switch(KEY_scan(0))
{
case KEY1_D:  canshu_flag1++;if((canshu_flag1>3)canshu_flag1=0;break;
case KEY2_D:
switch(canshu_flag1)
{
case 0:num0++;if(num0>9) num0=0;break;
case 1:num1++;if(num1>9) num1=0;break;
case 2:num2++;if(num2>9) num2=0;break;
}
}
}
void led()
{
switch(canshu_flag1)
{
case 0:
send_data(num[11],1);//数码管第一位
delay_ms(1);
send_data(num[1],2);//数码管第二位
delay_ms(1);
send_data(num[num0],3);//数码管第三位
break;
case 1:
send_data(num[12],1);//数码管第一位
delay_ms(1);
send_data(num[1],2);//数码管第二位
delay_ms(1);
send_data(num[num1],3);//数码管第三位
break;
case 2:
send_data(num[13],1);//数码管第一位
delay_ms(1);
send_data(num[1],2);//数码管第二位
delay_ms(1);
send_data(num[num2],3);//数码管第三位
break;
}
}
你看一下按KEY1_D,KEY2_D的变化
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1732
金钱
1732
注册时间
2021-4-11
在线时间
320 小时
发表于 2023-4-13 09:29:40 | 显示全部楼层
帮顶                  
回复

使用道具 举报

15

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2021-9-8
在线时间
54 小时
发表于 2023-4-13 09:43:01 | 显示全部楼层
不知道你具体死在那里,但是如果你key是KEY4_D,那么在while(1)中应该是出不来吧
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-4-13 09:52:47 | 显示全部楼层
pyq1518186024 发表于 2023-4-13 09:43
不知道你具体死在那里,但是如果你key是KEY4_D,那么在while(1)中应该是出不来吧

不是啊哥,在第一个case KEY1_D那里,我按第一个按键一次,进入第一个参数然后,我用的死循环同台显示数码管。
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-4-13 09:58:47 | 显示全部楼层
pyq1518186024 发表于 2023-4-13 09:43
不知道你具体死在那里,但是如果你key是KEY4_D,那么在while(1)中应该是出不来吧

对啊,while死循环跳不出来,我去搜了一下跳出循环的方法,但是都不满足。
回复

使用道具 举报

21

主题

217

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2124
金钱
2124
注册时间
2017-12-11
在线时间
460 小时
发表于 2023-4-13 10:13:21 | 显示全部楼层
你这个就没有给跳出while1的条件啊
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-4-13 10:17:36 | 显示全部楼层
白纸扇001 发表于 2023-4-13 10:13
你这个就没有给跳出while1的条件啊

这个程序只有一个按键的键值在改变,我要定义一个其他的变量来控制这个循环吗?
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2023-4-13 11:33:00 | 显示全部楼层
你这个for(;;)不就是个死循环嘛,而且你一个按键检测里面搞这么多操作干嘛,得到键值以后在主循环做对应的操作
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-4-13 12:38:36 | 显示全部楼层
阿侑kevin 发表于 2023-4-13 11:33
你这个for(;;)不就是个死循环嘛,而且你一个按键检测里面搞这么多操作干嘛,得到键值以后在主循环做对应的 ...

这就是主循环里面,我想跳出这个for(;;);
回复

使用道具 举报

5

主题

305

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1690
金钱
1690
注册时间
2018-11-28
在线时间
214 小时
发表于 2023-4-13 12:53:00 | 显示全部楼层
程序改动后如下:
                               case KEY1_D:    //按键一按下
                                        canshu_flag1 = canshu_flag1 + 1;//数码管显示参数标志位
//                                        LED1 = !LED1;//翻转LED0电平
//                                  display_data(x = (x + 100),i);
                                        if(canshu_flag1 < 4)            //4个参数
                                        {
                                                switch(canshu_flag1)        
                                                {
                                                        case 1:                     //参数一
                                                                LED1 = !LED1;
                                                                        send_data(num[11],1);//数码管第一位
                                                                        delay_ms(1);
                                                                        send_data(num[1],2);//数码管第二位
                                                                        delay_ms(1);
                                                                        send_data(num[14],3);//数码管第三位
                                                                        delay_ms(1);
                                                                        if(canshu_flag1 == 2)break;
                                                        break;
                                                        case 2:                    //参数二
                                                                LED0 = !LED0;
                                                                        send_data(num[12],1);
                                                                        delay_ms(1);
                                                                        send_data(num[1],2);
                                                                        delay_ms(1);
                                                                        send_data(num[14],3);
                                                                        delay_ms(1);
                                                        break;
                                                        case 3:
                                                                        send_data(num[13],1);
                                                                        delay_ms(1);
                                                                        send_data(num[1],2);
                                                                        delay_ms(1);
                                                                        send_data(num[14],3);
                                                                        delay_ms(1);
                                                        break;
                                                }
                                        }
                                        else if(canshu_flag1 >= 4)
                                        {
                                                canshu_flag1 = 1;
                                        }
                                       
                                break;
回复

使用道具 举报

5

主题

305

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1690
金钱
1690
注册时间
2018-11-28
在线时间
214 小时
发表于 2023-4-13 12:56:57 | 显示全部楼层

                                case KEY4_D:
                                                if(a < 100)
                                                {
                                                        for(i = 1; i < 4;i ++)
                                                        {
                                                                display_data(x,i);
                                                                delay_ms(1);
                                                        }
                                                         a++;
                                                }
                                               
                                                if(a == 100)
                                                {
                                                        send_data(num[10],2);
                                //                  delay_ms(1);
                                                        for(i=1;i<3;i++)
                                                        {
                                                                display_data(x,i);           //所有位正常显示
                                                                delay_ms(1);
                                                        }
                                                        b++;
                                                        if(b == 100)
                                                        {
                                                                a = 0;
                                                                b = 0;
                                                        }
                                                }      
//                                LED0 = !LED0;//翻转LED1电平
//                                BEEP = !BEEP;//翻转蜂鸣器电平
                                break;

回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-4-13 13:06:35 | 显示全部楼层
hzhanhai 发表于 2023-4-13 12:53
程序改动后如下:
                               case KEY1_D:    //按键一按下
          ...

哥,for循环被删掉的话。数码管的动态显示就只能一闪而过了,每个参数的显示不加死循环的话可以实现切换参数(参数标志位为4就会空一个,为3的话参数一会全灭。)但是不能动态显示了。
回复

使用道具 举报

15

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2021-9-8
在线时间
54 小时
发表于 2023-4-13 14:54:27 | 显示全部楼层
本帖最后由 pyq1518186024 于 2023-4-13 16:46 编辑
openresistance 发表于 2023-4-13 13:06
哥,for循环被删掉的话。数码管的动态显示就只能一闪而过了,每个参数的显示不加死循环的话可以实现切换 ...

不太懂你要怎么显示

回复

使用道具 举报

15

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2021-9-8
在线时间
54 小时
发表于 2023-4-13 15:03:17 | 显示全部楼层
本帖最后由 pyq1518186024 于 2023-4-13 16:40 编辑
pyq1518186024 发表于 2023-4-13 14:54
不太懂你要怎么显示
但是这种应该可以
while(1)
呃呃呃,看下面我举的例子吧
回复

使用道具 举报

15

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2021-9-8
在线时间
54 小时
发表于 2023-4-13 15:16:34 | 显示全部楼层
openresistance 发表于 2023-4-13 13:06
哥,for循环被删掉的话。数码管的动态显示就只能一闪而过了,每个参数的显示不加死循环的话可以实现切换 ...

或者你加操作系统,在另外的任务中判断key是否改变,改变了就赋值给全局变量,你在实现了你闪烁的循环中通过这个变量来判断是否跳出,这个有点麻烦,你直接通过大循环来改吧
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-4-13 15:20:57 | 显示全部楼层
pyq1518186024 发表于 2023-4-13 14:54
不太懂你要怎么显示
但是这种应该可以
while(1)

谢谢大佬。
程序实现功能:四个按键(设置,加,移位,进入)
上电不显示,按设置键切换3个参数,按进入键进入对应数值且最后一位数码管闪烁,再按一次保存数值。
上面的程序就是主程序While(1)循环里面的。暂时的功能是设置键切换参数并且可以进入参数。但是因为我在按键一(设置键)就是第一个case里面的第一个参数里面用了for循环,按键值改变了,但是程序还在死循环里。
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-4-13 16:06:30 | 显示全部楼层
pyq1518186024 发表于 2023-4-13 15:03
不小心按到发送了,就是通过大循环来,比如第一个循环显示第一个数码管,第二个循环显示第2个,大循环很 ...

谢谢大佬,我回去试试。
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-4-13 16:51:02 | 显示全部楼层
pyq1518186024 发表于 2023-4-13 16:31
给你举个例子
while(1)
{

大佬,你给的程序是不是按下key1,数码管显示数值,再按key2,数码管的第三位改变。
回复

使用道具 举报

15

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2021-9-8
在线时间
54 小时
发表于 2023-4-13 16:53:55 | 显示全部楼层
openresistance 发表于 2023-4-13 16:51
大佬,你给的程序是不是按下key1,数码管显示数值,再按key2,数码管的第三位改变。

对的,你可以试试用这种方法
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-4-13 16:56:35 | 显示全部楼层
本帖最后由 openresistance 于 2023-4-13 22:21 编辑
pyq1518186024 发表于 2023-4-13 16:53
对的,你可以试试用这种方法
main.c(39):错误:#109:明显调用的括号前面的表达式必须具有(指针到-)函数类型大佬,出现了这样的错误,指向了key函数。
key函数是不是需要有返回值啊,没有返回值的话,led函数的canshu_flag1不会更新啊。
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-4-14 09:11:02 | 显示全部楼层
pyq1518186024 发表于 2023-4-13 16:53
对的,你可以试试用这种方法

大佬,我昨天试了一下。我把,led();key();放在key.c里面嘛,num0,num1,num2好像需要定义全局变量,如果,定义在key();里面,led():里面好想需要extern。最后还是有一个错误,错误指向的是key();函数,错误指出,key();函数需要具有指针类型。我看了一下他的警告,有关num[]的。我感觉这个key函数需要返回值,没有返回值的话,led函数里面的canshuflag1和num0,num1,num2确定不了啊。
回复

使用道具 举报

15

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2021-9-8
在线时间
54 小时
发表于 2023-4-14 09:34:08 | 显示全部楼层
openresistance 发表于 2023-4-14 09:11
大佬,我昨天试了一下。我把,led();key();放在key.c里面嘛,num0,num1,num2好像需要定义全局变量,如 ...

我只是提供一个思路,剩下的你可以按照自己的想法来,缺什么你就加什么,设全局变量就设全局变量,报错误就解决错误
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 12:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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