打破 while 循环并重新启动代码
Breaking a while loop and restarting code
我想知道是否可以在不使用 MCU 复位引脚上的外部复位按钮的情况下打破 while 循环并从特定位置重新启动代码。
下面是我想在 "if" 语句为真时中断的 while 循环,我正在使用 LCD 并且想 return 到我的代码中文本所在的特定部分显示(模仿主页)。
实际上,当 "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
{
;
}
}
}
这有点难以理解,因为您没有显示您想要的代码 "restart"。
也许您可以在您显示的循环周围使用另一个循环:
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();
继续执行。
我想知道是否可以在不使用 MCU 复位引脚上的外部复位按钮的情况下打破 while 循环并从特定位置重新启动代码。
下面是我想在 "if" 语句为真时中断的 while 循环,我正在使用 LCD 并且想 return 到我的代码中文本所在的特定部分显示(模仿主页)。
实际上,当 "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
{
;
}
}
}
这有点难以理解,因为您没有显示您想要的代码 "restart"。
也许您可以在您显示的循环周围使用另一个循环:
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();
继续执行。