打印

望高手指教

[复制链接]
1257|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ngyg12|  楼主 | 2010-5-25 09:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在一个子函数中调用另一个子函数,大概是这样的:
    if( Men_num == 1)//第一个菜单被选中
           Menu_Second_Display( 1, Men1);

    这样出现了一个令我费解的问题:  Menu_Second_Display( 1, Men1) ,在这个子函数返回时,
   我的Men_num 的值被改变了,不再是 1 了,而且是随机变的,Men_num 是局部变量,被调子函数void Menu_Second_Display( unsigned char num , unsigned char *Menu ),也是无返回 类型的,所以我想请大家指点一下小弟,这个是怎么回事啊,以前都没遇到过! 我用的是 IAR软件,  MSP430F149 单片机!

相关帖子

沙发
ayb_ice| | 2010-5-25 10:30 | 只看该作者
不行就改

使用特权

评论回复
板凳
原野之狼| | 2010-5-25 11:14 | 只看该作者
有非法的内存访问吧

使用特权

评论回复
地板
doomhaha| | 2010-5-25 11:30 | 只看该作者
函数中调完Menu_Second_Display( 1, Men1)后还用到Men_num了吗?

使用特权

评论回复
5
ngyg12|  楼主 | 2010-5-26 10:29 | 只看该作者
谢谢大家的帮助哈,呵呵,我觉得这个是神奇的事件,因为昨天下午停电,晚上又有课,所以没有摆弄,今天早上来看的时候,居然正常了! 我没有做任何的改动! 神奇.....

使用特权

评论回复
6
原野之狼| | 2010-5-26 13:15 | 只看该作者
神奇是因为未知
建议还是把问题搞明白

使用特权

评论回复
7
ngyg12|  楼主 | 2010-5-26 21:12 | 只看该作者
呵呵,谢谢提醒,可是我也不知道 我把这两个字函数贴出来吧!呵呵,结构不怎么好,见笑了
/*-------------------------------------------------------------------
**名称:void Menu_First_Display(unsigned char Black_line,unsigned char line)
**功能:在LCD12864上分四行显示菜单
**备注:  Menu_num == 1          Menu_num == 2               Menu_num == 3
   
      -------1--------        -------2--------             -------3--------  
      -------2--------        -------3--------             -------4--------  
      -------3--------        -------4--------             -------5--------  
      -------4--------        -------5--------             -------6--------  
       菜单序号(第一页)        菜单序号(第二页)             菜单序号(第三页)
**修改:
**日期:
----------------------------------------------------------------------*/
void Menu_First_Display(unsigned char Black_line,unsigned char line)
{   
     unsigned char  Men1[] = {"时间设置"};
     unsigned char  Men2[] = {"日期设置"};
     unsigned char  Men3[] = {"波形选择"};
     unsigned char  Men4[] = {"幅度调整"};  
     unsigned char  Men5[] = {"AD绘图 "};
     unsigned char  Men6[] = {"画图功能"};
     unsigned char  *Men[] = {Men1,Men2,Men3,Men4,Men5,Men6};//存菜单的数组地址
     unsigned char  Men_num = 1 , Max , Txt_line ,num;
     
     Keyvaul = 0 ;          // 清除Keyvaul 的值,以便储存菜单中的按键值   
while(1)                  //反复读取菜单中的操作键盘值,并做相应的处理
  {
     switch( line )
          {/*
               case 1:Txt_Display(1,2,8,Men1);break; //在第一行显示第一个菜单
               case 2:Txt_Display(1,2,8,Men2);break; //在第一行显示第二个菜单
               case 3:Txt_Display(1,2,8,Men3);break;
               case 4:Txt_Display(1,2,8,Men4);break;
               case 5:Txt_Display(1,2,8,Men5);break;
               case 6:Txt_Display(1,2,8,Men6);break;//在第一行显示最后一个菜单
            */
               case 7:                                
                   {
                     Write_LCD_Com( 0x01 ); //字符清屏
                     Clear_Display();      // 绘图清屏
                     Max = Men_num + 4 ;   // 一个屏幕最多显示 4 行
                  for(num = Men_num,Txt_line = 1;num < Max ,Txt_line < 5;num ++,Txt_line ++) //显示从x_line 开始的后四行菜单
                     {
                      Txt_Display(Txt_line,2,8,Men[ num - 1 ]); //在第 Txt_line行,显示第num 个菜单            
                     }
                   }break;
             }         
        DrawnBlack_128x16( Black_line , 0xff ); //画出菜单中的黑色背景
         
        while(! Keyvaul);      // 等待键盘的操作
        switch( Keyvaul )
          {
           case 1: {   //下翻式显示菜单
                      Keyvaul = 0 ;//键值清零
                      Black_line ++ ;   // 按下一个键值后, 黑色背景下移一行                  
                      if(Black_line > 4 )
                      {  
                        Black_line = 4;
                        Men_num ++ ; //菜单页数调整
                        if(Men_num == 4)  // 最大值为菜单的个数减去3
                        {
                           Black_line = 1;//回到第一行
                           Men_num = 1 ;   // 回到第一页
                        }
                      }                  
                    } break;
           case 2: {
                      // 上翻式显示菜单
                     Keyvaul = 0 ;//键值清零
                     Black_line --;   // 按下一个键值后, 黑色背景上移一行                  
                      if(Black_line < 1 ) //菜单到了最顶端,且有显示上一行的要求
                      {
                        Black_line = 1;
                        Men_num -- ;    //页数调整到上一页   
                        if(Men_num == 0) //第一页上翻到最后一页
                        {
                           Black_line = 4; // 把黑色背景移到最后一行显示
                           Men_num = 3 ;   //  页数调整到最后一页
                        }
                      }      
                   } break;
           case 3: { // 确认选择键,进入下一级菜单
                     Keyvaul = 0;//键值清零
                     switch( Black_line )
                       {
                         case 1:{ //黑色背景在第1行
                                  if( Men_num == 1)//第一个菜单被选中
                                     Menu_Second_Display( 1, Men1);
                                  if( Men_num == 2)//第二个
                                     Menu_Second_Display( 2, Men2);
                                  if( Men_num == 3)//第三个
                                     Menu_Second_Display( 3, Men3);
                                 
                                }break;
                         case 2:{ // 黑色背景在第2行
                                  if( Men_num == 1)//第二个菜单被选中
                                     Menu_Second_Display( 2, Men2);
                                  if( Men_num == 2)//第三个
                                     Menu_Second_Display( 3, Men3);
                                  if( Men_num == 3)//第四个
                                     Menu_Second_Display( 4, Men4);
                                 }break;
                         case 3:{//黑色背景在第3行
                                  if( Men_num == 1)//第三个菜单被选中
                                     Menu_Second_Display( 3, Men2);
                                  if( Men_num == 2)//第四个
                                     Menu_Second_Display( 4, Men4);
                                  if( Men_num == 3)//第五个
                                     Menu_Second_Display( 5, Men5);
                                }break;
                         case 4:{ //黑色背景在第4行
                                  if( Men_num == 1)//第四个菜单被选中
                                     Menu_Second_Display( 4, Men4);
                                  if( Men_num == 2)//第五个
                                     Menu_Second_Display( 5, Men5);
                                  if( Men_num == 3)//第六个
                                     Menu_Second_Display( 6, Men6);
                                }break;
                       }
                   }  break;
           case 5:{  // 菜单返回键
                     Keyvaul = 0;  //键值清零
                     Write_LCD_Com( 0x01 ); //字符清屏
                     Clear_Display();      // 绘图清屏
                     return; //返回
                   }
           default : Keyvaul = 0;break;
         }
   }
}
/*-------------------------------------------------------------------
**名称:void Menu_Second_Display( unsigned char num , unsigned char *Menu )
**功能:第二级显示菜单
**备注:函数的参数 num 表示在第一级菜单中被选中菜单的编号,Menu 则是被选中菜单的名字
**修改:
**日期:2010-05-26
----------------------------------------------------------------------*/
void Menu_Second_Display( unsigned char num , unsigned char *Menu )
{
  
  unsigned char Menu_ADSetY[] = {"Y 轴刻度值设置"};
  unsigned char Menu_Unit[]   = {"mV"} ;             //单位
  unsigned char Menu_DrawnSetX[] = {"X 轴所在行设置"};//画图设置菜单
  unsigned char Menu_DrawnSetY[] = {"Y 轴所在列设置"};//画图设置菜单
  unsigned char Menu_TimerSet[] = {"00: 00: 00"};//时间设置菜单
  
  unsigned char StartLine_X ,StartLine_Y ,Black_line = 1;
while(1)
{
while(!Keyvaul);  //等待按键
   
switch( Keyvaul )
  {
  case 1:{
         Black_line ++ ; //黑色背景下移
         if( Black_line == 5)Black_line = 1;
         } break;
         
  case 2:{
          Black_line -- ; //黑色背景上移
          if( Black_line == 0)Black_line = 4;
          }break;
   case 5: {
            Keyvaul = 0;
            return ;//返回键
            } break;     
default : Keyvaul = 0; break ;  
   }
       switch( num )
        {
        case 1:{
                //第一个菜单
                Write_LCD_Com( 0x01 ); //字符清屏
                Clear_Display();  
                DrawnBlack_128x16( 1 ,0xff ); // 在第一行显示黑色背景
                Txt_Display(1,2,8,Menu); //显示菜单功能说明,比如说时间设置功能,则在这里显示:时间设置
                SetData(3,3,3); // 数据设置
               
                }break;  
        case 2:{
                //第二个菜单
                }break;
        case 3:{  //波形选择功能
                   Keyvaul = 0 ;
                  RetChoose_Wave = Choose_Wave(); // 调用波形选择函数                  
                }break;
        case 4:{//幅度设置菜单
                Write_LCD_Com( 0x01 ); //字符清屏
                Clear_Display();  
                DrawnBlack_128x16( 1 ,0xff ); // 在第一行显示黑色背景
                Txt_Display(1,2,8,Menu);
                Txt_Display(3,5,2,Menu_Unit); //显示 "mV"
                RetWave_vaul = SetData(3,3,3); // 数据设置  (第三行第三单元,三位数据)                           
               }break;      
        case 5:{ //AD绘图功能
         
               // 设置 X 轴所在行
                Keyvaul = 0 ;
                Write_LCD_Com( 0x01 ); //字符清屏
                Clear_Display();  
                DrawnBlack_128x16( 1 , 0xff  ); // 在第一行显示黑色背景
                Txt_Display(1,2,8,Menu);
               
                Txt_Display(2,0,14,Menu_DrawnSetX);
                StartLine_X = SetData(3,3,3); // X数据设置
                 if(Keyvaul == 5)
                   {
                     Keyvaul = 0;
                     return ;//返回键
                   }                                   
               
               //设置 Y 轴所在列
                Txt_Display(2,0,14,Menu_DrawnSetY);
                StartLine_Y = SetData(3,3,3); // X数据设置
                  if(Keyvaul == 5)
                   {
                     Keyvaul = 0;
                     return ;//返回键
                   }                 
              
                  //开始画线            
                Write_LCD_Com( 0x01 ); //字符清屏
                Clear_Display();
                // 画 X 轴
                Drawn_Line (0,127,StartLine_X,StartLine_X);
                // 画 Y 轴
                Drawn_Line (StartLine_Y,StartLine_Y,0,63);
               }break;
        case 6:{      
               
               }break;
       default : break;
      }  
}
}

使用特权

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

本版积分规则

5

主题

553

帖子

5

粉丝