论坛风格切换切换到宽版
  • 4253阅读
  • 4回复

请教有关Keil C51编译器的问题 [复制链接]

上一主题 下一主题
离线miman
 
发帖
78
只看楼主 倒序阅读 0楼 发表于: 2003-05-21
用keil c51的c语言写的一个单片机程序,仿真器调试通过,但是编译后写入单片机运行不正常,哪位知道是什么原因呀?

keil是7。01版的
离线BD7CE
发帖
1289
只看该作者 1楼 发表于: 2003-05-21
你至少得说说错误现象、程序功能等东西,大家才好判断并回答吧? :d
离线miman
发帖
78
只看该作者 2楼 发表于: 2003-05-21
运行时跳转
是一个带lcd的键盘程序,用的键盘处理芯片是8279,程序在仿真器上调试通过,但是写入单片机运行时,从一个键的处理程序完成后又转到了另一个键的处理上。
相关程序如下:

void keyprocess()
{
     uchar i=0;
     bit bcheckedin=0;
     //char chval[20];
     char chpass[pass_max_len];
     char chlcdcmd=0;
     feeding_dog;
     g_fkeyflag=0;
     g_uikeyval=0;
     while(1)                   //键盘处理
     {
           if(g_fkeyflag&&(g_uikeyval!=0)&&g_ftimeflag)
           {
                 g_uctimecount=0;
                 g_ftimeflag=0;
                 tr0=0;
                 tr0=1;
                 //g_fkeyflag=0;
                 switch(g_ucsetuplevel)//if(g_ucsetuplevel==0)
                 {
                       case 0:
                       {
                             switch(g_uikeyval)//if(g_uikeyval==key_setup)
                             {
                                   case key_setup:
                                   {
                                         i=0;
                                         inputpass();
                                         g_uccurmenu=1;
                                         g_ucsubmenulevel=0;
                                         break;
                                   }
                                   case key_enter://else if(g_uikeyval==key_enter)
                                   {      
                                         if(g_uccurmenu==1)
                                         {      if(checkpass(chpass,i))   //从此处检测密码通后,继续运行啊啊啊啊啊啊啊啊啊处程序
                                               {
                                                     memset(chpass,0,pass_max_len);
                                                     g_ucsetuplevel=10;
                                                     codecsetupsel();
                                                     g_uccurmenu=0;
                                               }
                                               else
                                               {
                                                     i=0;
                                                     inputpass();
                                                     g_uccurmenu=1;
                                                     g_ucsubmenulevel=0;      
                                               }
                                         }
                                         break;
                                   }
                                   //case
                                   case key_esc:   //跳转到此处运行 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
                                   {
                                         if((g_uccurmenu==1)&&(g_ucsubmenulevel==0))
                                         {
                                               initlcd();
                                               g_ucsetuplevel=0;
                                               g_uccurmenu=0;
                                               g_ucsubmenulevel=0;      
                                         }
                                         break;
                                   }
                             }
                             if((g_uccurmenu==1)&&(g_ucsubmenulevel==0)&&(g_uikeyval>0x48)&&(g_uikeyval<0x53))   //input is pass
                             {
                                   if(i<pass_max_len)
                                   {
                                         chpass=(char)g_uikeyval;
                                         chlcdcmd=0x90+i;
                                         lcddata("*",chlcdcmd);
                                         i++;
                                   }
                             }
                             break;
                       }
                       case 10:           //list main menu
                       {
                             mainmenuprocess();
                             break;
                       }
                       case 1:         //cedec setup menu
                       {
                             codecmenuprocess();
                             break;
                       }
                       case 2://decode setup menu
                       {
                             decodemenuprocess();
                             break;
                       }
                       case 3:         //keyboard setup menu
                       {
                             keymenuprocess();
                             break;
                       }
                       case 4:           //change passwd setup menu
                       {
                             chgpassprocess();
                             break;
                       }
                       case 5:       //quit?
                       {
                             //initlcd();
                             //g_ucsetuplevel=0;
                             //g_uccurmenu=0;
                             //g_ucsubmenulevel=0;      
                             break;
                       }
                 }
                       //sprintf(chval,"键值为%d",g_uikeyval);
                 //openlcd();
                 //lcddata(chval,0x80);
                 //memset(chval,0,20);
                 //sprintf(chval,"%d",g_uikeyval);
                 //sendtoserial(chval,2);
                 //lcddata(chval,0x90);
                 //ex0=1;
                 //tr0=1;
           }
           g_fkeyflag=0;
           g_uikeyval=0;
           feeding_dog;
     }
}
离线BD7CE
发帖
1289
只看该作者 3楼 发表于: 2003-05-23
跳转太多,看得我一头雾水。。。慢慢看一看。

这种需要处理多个按键的系统,我认为应该改成中断方式比较合适。
离线miman
发帖
78
只看该作者 4楼 发表于: 2003-05-23
是中断方式
犯了一个低级错误,在lcd显示完成后的延时里没有喂狗。

问题已解决,谢谢站长的热心