找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1543|回复: 1
收起左侧

有关单片机C语言程序跳到未执行的子函数的有关问题

[复制链接]
ID:497242 发表于 2019-4-29 23:31 | 显示全部楼层 |阅读模式
这两天在自己调程序,发现程序不按照预期的去执行,在判断后会跳到未执行的子函数中,不明白是什么情况。
贴出有关的代码:
  1. void main()
  2. {

  3.         lcd_init();
  4.         Uart_Init();
  5.         Key_Init();
  6.         clear_();
  7.         delay(100);
  8.         while(1)
  9.         {
  10.         cod_ = key_scan();//判断以及编码               
  11.         num_ = encode(cod_);//解码程序。得出数字
  12.         if(num_!=16)
  13.         {
  14.                 if(num_==3)
  15.                         {
  16.                         key();
  17.                         }
  18.                 if(num_==7)
  19.                         {
  20.                          iccade();
  21.                         }
  22.                 if(num_==11)
  23.                         {
  24.                         AS_608();
  25.                         }                  
  26.         }
  27.         }
  28.         
  29. }


  30. 这是主函数。num==3,正常跳到指定函数,num==7会跳到非指定函数,按照正常来说会进入iccade()函数,但是会进到FPM10A_Add_Fingerprint()函数中。
  31. void iccade()
  32. {   
  33.      unsigned  char status,i,j=0;
  34.          unsigned  char m=0,a,b,c;

  35.      InitializeSystem( ); //中断初始化
  36.          lcd_init();//lcd初始化
  37.      PcdReset();//寻卡
  38.      PcdAntennaOff();//关天线
  39.      PcdAntennaOn();//开天线
  40.          display();//显示初始化         
  41.     while ( 1 )
  42.      {   
  43.          status = PcdRequest(0x52, g_ucTempbuf);//寻卡
  44.          if (status != MI_OK)
  45.          {   
  46.               InitializeSystem( );
  47.                        PcdReset();
  48.                        PcdAntennaOff();
  49.                       PcdAntennaOn();
  50.                           continue;
  51.          }
  52.         status = PcdAnticoll(g_ucTempbuf);//防冲撞
  53.          if (status != MI_OK)
  54.          {    continue;    }
  55.                  lcd_wcmd(0x01);
  56.                  delay(10);
  57.                  lcd_pos(0,0);
  58.                  for(i=0;i<4;i++)
  59.                  {
  60.                         a=g_ucTempbuf[i];
  61.                         b=a/16;
  62.                         c=a%16;                        
  63.                         data6[i*2]=table[b];
  64.                         delay(10);                                                                                       
  65.                         data6[i*2+1]=table[c];
  66.                    }
  67.                  for(i=0;i<8;i++)
  68.                  {
  69.                          if(ICpw[i]==data6[i])
  70.                         {
  71.                                 if(i==7)
  72.                                 {
  73.                                  same();
  74.                                  delay(1000);
  75.                                  lcd_wcmd(0x01);
  76.                                  display();
  77.                                  break;
  78.                                  }
  79.                                          continue;
  80.                         }
  81.                          else
  82.                          diff_();
  83.                          delay(500);
  84.                          lcd_wcmd(0x01);
  85.                          display();
  86.                          break;
  87.                  }           
  88. }
  89. }


  90. void FPM10A_Add_Fingerprint()
  91. {
  92.         unsigned char id_show[]={0,0,0};
  93.         lcd_wcmd(0x01); //清屏
  94.         finger_id=0;  
  95.         while(1)
  96.         {
  97.         LCD1602_Display(0x80,"   Add  finger  ",0,16);
  98.         LCD1602_Display(0xc0,"    ID is       ",0,16);
  99.         //按返回键直接回到主菜单
  100.         if(KEY_CANCEL == 0)
  101.         {
  102.                  while(KEY_CANCEL==0);
  103.                  break;
  104.         }



  105. 当num==11时,执行woshou()函数时,显示完"Loading"后又会跳到FPM10A_Add_Fingerprint()函数,按下返回键才会回到woshou()函数继续执行。
  106. void AS_608()
  107. {
  108.         lcd_wcmd(0x01);
  109.         LCD1602_Display(0x80,"Fingerprint Test",0,16);
  110.         delay(500);
  111.         WoShou();
  112.         delay(1000);
  113.         while(1)
  114.         {




  115. void WoShou()//握手指令
  116. {
  117.         char i;
  118.         LCD1602_Display(0xc0,"Loading",0,7);                   //设备加载中界面                                                           

  119.         for(i=0;i<8;i++)                                                           //进度条式更新,看起来美观
  120.         {
  121.                 lcd_wdat(42);                               //42对应ASIC码的 *
  122.                 delay(200);                                                           //控制进度条速度
  123.         }               
  124.         
  125.         FPM10A_Cmd_Check();
  126.         FPM10A_Receive_Data(12);
  127.         if(FPM10A_RECEICE_BUFFER[9]==0);        
  128.         LCD1602_Display(0xc0,"Docking  success",0,16);
  129.         delay(100);
  130.          
  131.         
  132. }
复制代码




贴出有关函数的代码 ,求各位大佬告知是什么情况。

回复

使用道具 举报

ID:123289 发表于 2019-4-30 16:17 | 显示全部楼层
没有看你的程序,只看了题目!
估计程序中含有中断,中断发生时会打断你的正常流程,跳到服务程序中去,不过会回来的,但中断服务执行时间过长,就难说了。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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