大家好。 我 不熟悉 MSP430和微控制器。 现在、我正在尝试编写一个程序、通过每次按下 P1.1按钮来改变 LED 的状态(关闭-闪烁-闪烁)。 我使用了"switch-case"语句来实现此目的并控制 switch 语句的变量、我使用了端口中断。 对于闪烁操作、我使用了计时器中断。 一切都正常工作。 但闪烁情况存在问题。
程序从 LED 关闭开始。 然后我按下按钮、LED 亮起。 再次按下按钮、LED 开始闪烁。 在闪烁情况之后、当再次按下按钮时、程序必须返回到初始状态、从而关闭 LED。 再按一次可打开 LED、再按一次可开始闪烁、依此类推。
但是、当 LED 开始闪烁时、程序停留在无限循环点、计时器参与切换 LED 状态、按下按钮无效、LED 继续闪烁。
在没有中断的情况下(通过 usigning Polling 等)、我的代码能够完美地工作。 因此、为了避免在这里过度拥挤、我不会 完全发布我的代码。
volatile unsigned int mode;
#pragma vector = timer_vector_here
__interrupt void someNameHere (void) {
P1OUT ^= BIT0;
TA0CTL &= ~TAIFG;
}
#pragma vector = port_vector_here
__interrupt void anotherNameHere (void) {
mode++;
P1IFG &= ~BIT1;
}
int main(void) {
/* Port settings, P1.0 to output, P1.1 to input etc.
* Port Interrupt settings, IES, IRQ etc.
* Timer settings, TA0CTL, SMCLK clock etc.*/
__enable_interrupt();
mode = 0;
while (1) {
if (mode > 2) {
mode = 0;
}
switch (mode) {
case 0: P1OUT &= ~BIT0;
break;
case 1: P1OUT |= BIT0;
break;
case 2: TA0CTL = TASSEL_2 + MC_1 + TACLR + TAIE;
TA0CCR0 = 50000;
TA0CTL &= ~TAIFG;
for(;;);
break;
}
}
}
我在其他器件上写的内容并不重要。 重要的是、在案例2和计时器 ISR 中写入的内容。 总之、我的问题是、当我按下按钮关闭 LED 并继续编程时、如何退出计时器中断?
P.S. 我没有使用、也不想使用 LPM 或其他东西。 因此、请不要提供包含 LPM 的示例。 非常感谢您的参与