OpenEdv-开源电子网

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

想实现一个类似设置模式的设计,求指点思路。

[复制链接]

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
发表于 2017-8-17 09:27:47 | 显示全部楼层 |阅读模式
5金钱
想实现一个设计模式,实现的功能就是 按set键进入设置模式,按上下键调节值的大小,再按set键完成参数设置,并进入下一个参数的设置。
我的思路是这样的:
主架构分为三部分:
1、管理函数:
     只调用switch(x)    x初始值为0
               case 0: 设置参数1的函数;break;
               case 1: 设置参数2的函数;break ;
               default: x=0 ;
2、设置参数1的函数:
     while(1)循环
          {
            显示要设置的数据;
            等待键值;
            判断键值进行操作;
                  上下键设置值的大小;
                  set键完成设置并调用 管理函数且x的值+1;
           }
2、设置参数2的函数:
     主体和设置参数1的函数一致,不做赘述;

以上是我写的代码的思路,但是发现无法实现,仅仅切换就有问题,具体现象是,切换到设置参数2后,按set键并没有回到设置函数1的函数,而是卡在这,但是x值已经变了,也调用了管理函数,为什么回不去呢?求指点,或者给指引一条其他的思路都可以。。拜托各位!!!已经多次修正测试好几天了,依旧无果。。想看代码的留言,怕大家看不下去,遂暂时不留代码。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2016-6-7
在线时间
27 小时
发表于 2017-8-17 09:30:56 | 显示全部楼层
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-17 09:39:05 | 显示全部楼层
回复

使用道具 举报

19

主题

126

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2016-8-12
在线时间
50 小时
发表于 2017-8-17 10:11:42 | 显示全部楼层
其实我也有写这种的想法,只是一直没做。我也不知道你的函数是什么,我就把我的思路说一下吧:
    你是用三个按键吧,我的想法是用四个。首先主函数里面死循环,先设一个变量i,用一个按键控制它的值为1或2,再用switch语句调用这两个函数,和你的一样,不过我感觉不用default。那么这样程序就会在主函数里面不停地检测i的值,从而达到每按一次按键,就切换一种功能的效果。接着说两个调用的子函数,你应该最少先设两个全局变量,用于两个子函数,然后每个函数里面再添加一个按键用于控制键的大小,这样再把设置的参数传回给主函数输出就OK了。
    我明白你是想利用设置参数的子函数里面加死循环,然后保持这样的状态,但是你不妨按我思路试一下,只不过我这种思路弊端就是如果要实现太多功能的话,就要用更多的按键,资源利用率太低。
    我仔细想了一下你的程序思路,我感觉你的程序问题如下:你的x初始值是0,那么马上就调用第一个函数,然后设置完成以后x为1,接着调用管理函数,立马进入第二个函数,再设置好参数以后,x值又变了,猜的没错应该是2,然后default,x变成0,然后函数就执行出去了,所以说在管理函数里面加一个死循环,把switch包含进去就可以了。如下
while(1)
{
.......
switch(x)    x初始值为0
               case 0: 设置参数1的函数;break;
               case 1: 设置参数2的函数;break ;
               default: x=0;
......
}
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-17 10:15:26 | 显示全部楼层
魑魅魍魉 发表于 2017-8-17 10:11
其实我也有写这种的想法,只是一直没做。我也不知道你的函数是什么,我就把我的思路说一下吧:
    你是用 ...

不瞒你啊,我之前也发现这个问题了,我也是和你用的一样的解决思路,就是让switch死循环。然后效果是一样的。
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-17 10:24:39 | 显示全部楼层
魑魅魍魉 发表于 2017-8-17 10:11
其实我也有写这种的想法,只是一直没做。我也不知道你的函数是什么,我就把我的思路说一下吧:
    你是用 ...

我分两部分回答你吧;
1、就是你提供的思路,我如果没理解错的话,你的意思就是每一个按键控制一个参数的设置,按1进入参数1的设置,按2进入参数2的设置,对吧?我相信这样是没问题的,但是我觉得按键太多了,不太符合我目前想做的这么个小玩意的思路,我只是想就好像小时候的那个电子表一样,set键设置时间,set键设置日期,set键回归原位。这是我的目标;
2、你提供的思路我也有想到过,但是现象是可以进入死循环,却回不了界面1,两个界面的话问题还不是很大,但是一旦超过两个,假设我有4个界面,就只能在2-4界面来回切换,所以我找不到我哪的逻辑有问题。我之前用c语言编辑模拟了一下也是相同的结果。而且这么写的方式及其不稳定,用c模拟的时候次数达到足够多的数量程序就崩溃了,所以我感觉在stm32上应该也有一样的隐患。所以我才选择看看能不能找一个其他的思路。
回复

使用道具 举报

19

主题

126

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2016-8-12
在线时间
50 小时
发表于 2017-8-17 10:30:57 | 显示全部楼层
q247341184 发表于 2017-8-17 10:24
我分两部分回答你吧;
1、就是你提供的思路,我如果没理解错的话,你的意思就是每一个按键控制一个参数 ...

要不试试中断?
回复

使用道具 举报

1

主题

40

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3545
金钱
3545
注册时间
2017-5-23
在线时间
257 小时
发表于 2017-8-17 10:32:59 | 显示全部楼层
void Keys(void)                        //按键
{
        uchar temp;
        temp=KEY_Scan(0);
        switch(YeMian)
        {
                case 0:                                        //主页面
                        if(temp==3)
                        {
                                num_10=num_1;
                                YeMian++;
                        }
                        break;
                case 1:                                        //页面 1  
                        if(temp==3)
                        {
                                if(num_10!=num_1) Num_Change();
                                num_20=num_2;
                                YeMian++;       
                        }
                        else if(temp==2) num_10--;
                        else if(temp==1) num_10++;
                        break;
                case 2:                                        //页面 2
                        if(temp==3)
                        {
                                if(num_20!=num_2) Num_Change();
                                num_30=num_3;
                                YeMian++;       
                        }
                        else if(temp==2) num_20--;
                        else if(temp==1) num_20++;
                        break;
                case 3:                                        //页面 3
                        if(temp==3)
                        {
                                if(num_30!=num_3) Num_Change();
                                num_40=num_4;
                                YeMian++;       
                        }
                        else if(temp==2) num_30--;
                        else if(temp==1) num_30++;
                        break;
                case 4:                                        //页面 4  
                        if(temp==3)
                        {
                                if(num_40!=num_4) Num_Change();
                                num_50=num_5;
                                YeMian++;       
                        }
                        else if(temp==2) num_40--;
                        else if(temp==1) num_40++;
                        break;
                case 5:                                        //页面 5
                        if(temp==3)
                        {
                                if(num_50!=num_5) Num_Change();
                                YeMian=0;       
                        }
                        else if(temp==2&&num_50>2) num_50--;
                        else if(temp==1&&num_50<20) num_50++;
                        break;
                default : YeMian=0;        break;        //返回主页面
        }
}
以上是已经测试过的程序:
每个页面都有各自的显示内容和数据。
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-17 10:33:16 | 显示全部楼层
我是新学stm32的,对中断这块理解不太够,原子哥有一部分中断相关的教程,但是我看不太懂。有没有稍微具体点的思路?
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-17 10:45:31 | 显示全部楼层
bayga456 发表于 2017-8-17 10:32
void Keys(void)                        //按键
{
        uchar temp;

我仔细看了一下,你的思路我可不可以理解为页面其实一直在循环,但是靠按键值来判定是否输入?
回复

使用道具 举报

1

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2011-12-1
在线时间
110 小时
发表于 2017-8-17 11:21:59 | 显示全部楼层
1、你直接在set按键里面增加一个标志设置参数的变量,每按一次加1,同时保存上一次的值。2、再上键与下键里面分别判断set中的标志变量来改变你需要设置
        switch(key_value)
       {
               case set: flag++;if(flag==x)flag=0;break;
               case up:
                   switch(flag)
                   {
                   case 0: break;
                   case 1: break;
                    ..........
                   }
               break ;
               case down:
                  switch(flag)
                   {
                   case 0: break;
                   case 1: break;
                    ..........
                   }
               break ;
               default: x=0 ;
       }
3、把你的获取按键的函数与这个一起放在大循环就可以了!
专业从事软硬件设计,毕业设计,C51/AVR/MSP430/STM32等单片机软硬件制作与定制。有需求的可以联系我。QQ:3436737049淘宝店铺:龙隽电子科技
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-17 11:24:53 | 显示全部楼层
xlong_06 发表于 2017-8-17 11:21
1、你直接在set按键里面增加一个标志设置参数的变量,每按一次加1,同时保存上一次的值。2、再上键与下键里 ...

好我试着顺着你的思路写一下试试看。
回复

使用道具 举报

1

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2011-12-1
在线时间
110 小时
发表于 2017-8-17 11:28:06 | 显示全部楼层
q247341184 发表于 2017-8-17 11:24
好我试着顺着你的思路写一下试试看。

那个flag==x这个x是你有多少个界面切换,后面那个default: x=0 ;我是照你的程序修改,不记得改了,这个没用
专业从事软硬件设计,毕业设计,C51/AVR/MSP430/STM32等单片机软硬件制作与定制。有需求的可以联系我。QQ:3436737049淘宝店铺:龙隽电子科技
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-17 12:14:05 | 显示全部楼层
xlong_06 发表于 2017-8-17 11:28
那个flag==x这个x是你有多少个界面切换,后面那个default: x=0 ;我是照你的程序修改,不记得改了,这个没 ...

嗯嗯、我还看得懂。。嘿嘿嘿
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-17 13:41:48 | 显示全部楼层
bayga456 发表于 2017-8-17 10:32
void Keys(void)                        //按键
{
        uchar temp;

代码我已经测试,还是有点小问题,不过非常感谢你提供的思路
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-17 13:42:23 | 显示全部楼层
xlong_06 发表于 2017-8-17 11:21
1、你直接在set按键里面增加一个标志设置参数的变量,每按一次加1,同时保存上一次的值。2、再上键与下键里 ...

代码目前测试没有问题,希望在我下一步的时候依旧不会有问题;
回复

使用道具 举报

1

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2011-12-1
在线时间
110 小时
发表于 2017-8-17 13:46:17 | 显示全部楼层
q247341184 发表于 2017-8-17 13:42
代码目前测试没有问题,希望在我下一步的时候依旧不会有问题;

为什么会有问题的呢,不会有问题的呢!
专业从事软硬件设计,毕业设计,C51/AVR/MSP430/STM32等单片机软硬件制作与定制。有需求的可以联系我。QQ:3436737049淘宝店铺:龙隽电子科技
回复

使用道具 举报

1

主题

40

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3545
金钱
3545
注册时间
2017-5-23
在线时间
257 小时
发表于 2017-8-17 22:48:52 | 显示全部楼层
q247341184 发表于 2017-8-17 10:45
我仔细看了一下,你的思路我可不可以理解为页面其实一直在循环,但是靠按键值来判定是否输入?

就三个按键,一个是页面更改和数据有修改就保存,另两个一个加一个减。
按键函数里返回四个值,没有按键按下返回0。
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-18 08:32:01 | 显示全部楼层
bayga456 发表于 2017-8-17 22:48
就三个按键,一个是页面更改和数据有修改就保存,另两个一个加一个减。
按键函数里返回四个值,没有按键 ...

问题已经解决,非常感谢。
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3565
金钱
3565
注册时间
2016-1-8
在线时间
543 小时
发表于 2017-8-18 18:17:08 | 显示全部楼层
用时间片轮转
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 01:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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