2016-02-25 56 views
1

我有一个函数,我想继续运行,直到按下一个按钮(sw2_trig和sw3_trig),这使得它进入一个模式主循环。问题是我尝试了一个while循环和一个while循环来实现这个功能,但它不工作,它所做的只是循环功能,即使按下sw2或sw3,我也无法进入模式1或2。这是我的代码。如何让一个函数保持在主循环外循环,直到按下一个按钮

/********************************************************************* 
Intereupt Handlers 
********************************************************************/ 

void sw2_interrupt (void) //adapted from driving_test_2 
{ 
    sw2_trig = 1; 
} 


void sw3_interrupt (void) //adapted from driving_test_2 
{ 
    sw3_trig = 1; 
} 

/******************************************************************************* 
Functions 
*******************************************************************************/ 
//I want to keep this function running until sw2_trig or sw3_trig is pressed inside the main loop. 

void furElise() { 
    float notes[] = { e, d, e, d, e, b, D, c, _, a, _, c, e, a, b, _, e, g, b, c, _, e, d, e, d, a, e, a, _, e, e, g, a, e, a}; 

    for (int i = 0; i < sizeof(notes)/sizeof(float); i++) { 
     if (notes[i] == _) { 
      spkr = 0.0f; 
     } 
     else { 
      spkr = 0.5f; 
      spkr.period(1/notes[i]); 
     } 
     wait(0.25f);  
    } 

    spkr = 0.0f; 
} 

***************************************************************************************** 
Begin Program 
****************************************************************************************/ 

int main() 
{ 

sw2_trig = 0; 
sw3_trig = 0; 

sw2_int.mode (PullUp); 
sw2_int.fall (&sw2_interrupt); 

sw3_int.mode (PullUp); 
sw3_int.fall (&sw3_interrupt); 

int mode = 0; //Don't show anything 

furElise(); // want to keep this running if sw2 or sw3 aren't pressed. 



    while (1) { 

     spkr = 0.0; 
     wait(0.2f); //wait a little 


     switch (mode) { 

      case 1: 
lm_temp.read(); 

break(); 

case 2: 

yellowPurple(); 

break; 

    if(sw2_trig) { 
     mode = 1; 
     sw2_trig = 0; 
     shld_lcd.cls(); 
     } 

    if(sw3_trig) { 
     mode = 2; 
     sw3_trig = 0; 
     shld_lcd.cls(); 
     }   
    } 
} 
+2

看看(多)线程。 – Jarod42

+0

不清楚:你想'furElise'运行,直到按下一个按钮,然后进入主循环,或者你希望它与主循环同时运行,并停止按下按钮? – user4581301

+0

@ user4581301我希望它运行,直到按下按钮,然后在主循环中输入 – user5647516

回答

5

你可以保持PollingfurElise()功能,直到sw2_trigsw3_trig触发不等于1,一旦它等于1,则可以打破循环。

无效代码

if(sw2_trig == 1 || sw3_trig == 1) 
{ 
    return; 
} 

所以,当中断到来,这些值在中断处理程序变为1。

轮询不是最好的技术,但这是解决问题的一种方法。

希望这会有所帮助。

+0

我收到一个错误消息,说只能在switch语句中使用break语句 – user5647516

+0

“break”的意图是在这里退出在“函数”中,可以使用“返回”语句。 –

+0

@SudiptaKumarSahoo工作非常感谢你! – user5647516