2016-04-22 84 views
3

我想知道是否有可能在不使用MCU复位引脚上的外部复位按钮的情况下中断一个while循环并从特定位置重新启动代码。打破一个while循环并重新启动代码

下面是while循环,当“if”语句为true时,我想要中断while循环,我使用LCD并想返回到代码中显示文本的特定部分(模仿主页)。

事实上,当“if”语句为真时,while循环被破坏且代码结束。

int main(void) 
{ 
    /***************************************** BUTTON CONFIGURATION ********************************/ 

    DDRA &= ~((1<<PINA0) | (1<<PINA1) | (1<<PINA2) | (1<<PINA3)); // Config pins as inputs (ADC3 - Matching with ADMUX assignment below in ADC configuration) 

    DDRC = 0xFF;  // Output pins for LEDs 

    PORTA |= (1<< PINA0) | (1<<PINA1) | (1<<PINA2); // Three pins for three push buttons 

    /****************************************** ADC CONFIGURATION **********************************/ 

    ADMUX |= (1<<MUX0) | (1<<MUX1) | (1<<REFS0);  // ADC3 and Internal voltage as reference voltage 

    MCUCR &= ~((1<<ADTS2) | (1<<ADTS1) | (1<<ADTS0)); // Free running mode 

    ADCSRA |= (1<<ADEN) | (1<<ADATE) | (1<<ADIE); // ADC, Auto trigger source enable and start conversion 

    sei(); // Enable global interrupts 

    /***************************************** LCD CONFIGURATION ***********************************/ 

    LCD_Data_DDRB |= (1<<LCD_D7) | (1<<LCD_D6) | (1<<LCD_D5) | (1<<LCD_D4);  // Set output lines for lower 4 bits 

    LCD_Data_DDRD |= (1<<LCD_B3) | (1<<LCD_B2) | (1<<LCD_B1) | (1<<LCD_B0);  // Set output lines for upper 4 bits 

    LCD_Control_DDRB |= (1<<RS) | (1<<RW) | (1<<EN);    // Set RS, RW & EN output lines 

    /******************************************** START CODE **************************************/ 

    LCD_Initialise(); // Run function to initialize the LCD 

    LCD_startup();  // Run function which displays default start up text 

    ADCSRA |= (1<<ADSC); // Start conversion 

    LCD_Send_Command(DISP_CL); 

    while(1) 
    { 

     if(Default > Final) 
     { 
     LCD_Send_Command(DISP_CL); 
     LCD_Send_Command(DISP_CS | LINE_1); 
     LCD_Send_String(" text would go here"); 
     break; 
     } 

     else 
     { 
      ; 
     } 

    } 

}

+1

@unwind可以安全地解决您的问题。我并不熟悉Atmel控制器的具体情况,但我认为退出主要功能将导致重新进入主要功能。这是我用微芯片控制器看到的。其实你可以很容易地尝试自己。在特定位置切换一些引脚,然后用示波器观察它们。 – jwsc

+0

谢谢你的评论我会研究这个,并试试看! – LoneCoder

回答

5

这是轻微很难理解,因为你不告诉你要“重启”的代码。

也许你可以使用你周围显示一个另一个循环:

while(1) 
{ 
    code_that_is_restarted(); 
    while(1) 
    { 
    if(Default > Final) /* Very bad variable names */ 
    { 
     break; /* Exits the inner loop only. */ 
    } 
    } 
} 

break;将退出只有最里面的循环,所以将继续执行在code_that_is_restarted();

+0

感谢您的快速回复,我会试一试。我还添加了我的代码的简化版本,以显示打破后我要重新输入的位置。 – LoneCoder