打印

C51的多级菜单嵌套的一个问题 很诡异

[复制链接]
1431|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
天凡云赐|  楼主 | 2015-7-3 17:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
按键和主函数程序如下:


主函数:



void main()
{

          key1=0;
          key2=0;
          flay=0;

   init_DS1302();         //初始化1302
   init_12864();         //初始化液晶
   init_DS();                 //初始化DS18B20

        while(1)
        {
           key_jianzhi();
           key_kongzhi();
          

           if(flay==0)
          {                                                        //正常显示
         dislay_xianshi();
                }
                                                                                          //思路 每进一层 清除KEY1 KEY3 KEy4  KEY2作为保留返回

           if(flay==1)
           {                                                //设置界面一          闹钟+时间选择
            dislay_shezhi_jiemian();
                  }


           if(flay==2)                        //设置界面二          时间设置
           {
              dislay_shezhi_shijian();
                  }



                if(flay==3)                        //设置界面二          闹钟
           {
              dislay_shezhi_naozhong_di();
                  }


                }
   }



按键函数如下:



#include"keyboard.h"
#include"dislay.h"
#include"12864.h"

char key1;      //由K1和K2控制   K1++  K2--
char key2;           //由K3和K4控制          K3++  K4--


uchar xz_1;               // 第一界面的选择指向变量 用来控制》符号的上下选择
uchar xz_2;                                  // 第二界面 时间的选择变量
uchar xz_3;               // 第二界面 闹钟的选择变量



char  flay;        //时间设置选项

//  bit flay_nz;

bit nz_off;

bit zisuo=0;


void key_jianzhi()                     //传递按键键值
{
         

         if(k1==0)                          //按键一
         {
           delay1(5);
           if(k1==0)
            {
                  shuapin();
                  while(!k1);

                  key1++;

                  }
                 }


           if(k2==0)                  //按键二
           {
                 delay1(5);
                 if(k2==0)
                 {
                        shuapin();
                         while(!k2 );

                    flay--;   //控制层数返回

                   if(flay<0)
                   {
                         flay=0;                                         //自锁清零
                          zisuo=0;
                          key1=0;
                          }
                   }
                  }


           if(k3==0)                        //按键3
           {
             delay1(5);
                 if(k3==0)
                 {       
                   shuapin();

                 while(!k3 );

                    key2++;
                        }
                 }


                if(k4==0)                    //按键4
                {
                  delay1(5);
                  if(k4==0)
                  {
                          shuapin();

                  while(!k4 );


                    key2--;

                        if(key2<0)                                                                  
                         key2=0;

                        }
                   }
           }




void key_kongzhi()
{

  /////////////////////////////第一层控制

        if(zisuo==0)                                                                             
        {
            if(key1==1)
          {

           flay=1;

           zisuo=1;

           key1=0;
           }
         }

//////////////////////////////第二层 选择

          if(flay==1)
          {


        if( key2==0)
             {
              xz_1=0;

                    if( key1 > 5 );                                //这里有问题 按一次 flay直接到>5了 不可能啊
                    {
                      key1=0;
                          flay=2;
                          }
              }

         
            if(key2==1)
            {
              xz_1=2;

             }


                 }



目前遇到的问题主要在:


        if(zisuo==0)                                                                             
        {
            if(key1==1)
          {

           flay=1;

           zisuo=1;

           key1=0;
           }
         }

//////////////////////////////第二层 选择

          if(flay==1)
          {


        if( key2==0)
             {
              xz_1=0;

                    if( key1 > 5 );                                //这里有问题 按一次 flay直接到>5了 不可能啊
                    {
                      key1=0;
                          flay=2;
                          }
              }


我的愿意是 按2次K1 flay=2 但是现在按下K1  flay 直接=2了 完全没有道理啊~ key1>5是用来测试的~

相关帖子

沙发
ayb_ice| | 2015-7-3 17:21 | 只看该作者
多半是程序问题,中间还等待按键释放,按住不放不就死机了

使用特权

评论回复
板凳
mintspring| | 2015-7-3 17:25 | 只看该作者
多级菜单最好用switch,偶尔用个GOTO也不过分。

使用特权

评论回复
地板
天凡云赐|  楼主 | 2015-7-3 18:18 | 只看该作者
mintspring 发表于 2015-7-3 17:25
多级菜单最好用switch,偶尔用个GOTO也不过分。

嗯 但是大哥 那个怎么解释啊~ key1直接》5了   flay=2 这个~~

使用特权

评论回复
5
天凡云赐|  楼主 | 2015-7-3 20:50 | 只看该作者
ayb_ice 发表于 2015-7-3 17:21
多半是程序问题,中间还等待按键释放,按住不放不就死机了

是的大哥 那个按键扫描我最开始是加了定时器检测的 不过后来发现有问题 换成按住不放就一直while循环来查问题了  我就是想不明白那里为什么会这样

使用特权

评论回复
6
ayb_ice| | 2015-7-4 11:16 | 只看该作者
天凡云赐 发表于 2015-7-3 20:50
是的大哥 那个按键扫描我最开始是加了定时器检测的 不过后来发现有问题 换成按住不放就一直while循环来查 ...

没时间仔细看,程序逻辑估计混乱了

使用特权

评论回复
7
lgq1542380129| | 2015-7-4 14:37 | 只看该作者
建议楼主采用函数指针数组(二维),将函数封装到这个数组里,用一个结构体,去找菜单,执行相应的函数。

使用特权

评论回复
8
天凡云赐|  楼主 | 2015-7-6 19:06 | 只看该作者
lgq1542380129 发表于 2015-7-4 14:37
建议楼主采用函数指针数组(二维),将函数封装到这个数组里,用一个结构体,去找菜单,执行相应的函数。 ...

好的 谢谢大哥 我修改试试

使用特权

评论回复
9
ff8zgs| | 2015-7-11 17:36 | 只看该作者
lgq1542380129 发表于 2015-7-4 14:37
建议楼主采用函数指针数组(二维),将函数封装到这个数组里,用一个结构体,去找菜单,执行相应的函数。 ...

这才是一个靠谱的方法,而且最好采用状态机,逻辑一下就清晰了

使用特权

评论回复
10
mintspring| | 2015-7-11 21:27 | 只看该作者
什么K1,那个什么啊,楼主问我的什么,没看懂锕

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

60

帖子

1

粉丝