c - MSP430FR6989 按钮和 LED 切换

标签 c embedded msp430

正在做一个学校项目,我陷入了最后一段代码。假设 S1 被按下并且红色 LED 亮起。如果同时按下 S2,绿色 LED 保持熄灭,红色 LED 继续亮起。该状态一直持续到 S1 被释放为止。现在,S2 有机会打开绿色 LED。同样,如果在绿色 LED 亮起时按住 S2,则按下 S1 时将被忽略,直到释放 S2。

我目前陷入了无限循环。我无法让我的代码按照上一段所述进行操作。一旦 BUT1 和 BUT2 都被按下,绿色和红色 LED 灯就会关闭。

#include <msp430fr6989.h>
#define redLED BIT0 // Red LED at P1.0
#define greenLED BIT7 // Green LED at P9.7
#define BUT1 BIT1 // Button S1 at P1.1
#define BUT2 BIT2 // Button S2 at P1.2

void main(void) {

    WDTCTL = WDTPW | WDTHOLD; // Stop the Watchdog timer
    PM5CTL0 &= ~LOCKLPM5; // Enable the GPIO pins


    // Configure and initialize LEDs
    P1DIR |= redLED; // Direct pin as output
    P9DIR |= greenLED; // Direct pin as output
    P1OUT &= ~redLED; // Turn LED Off
    P9OUT &= ~greenLED; // Turn LED Off



    // Configure buttons1
    P1DIR &= ~(BUT1 | BUT2); // Direct pin as input
    P1REN |=  (BUT1 | BUT2); // Enable built-in resistor
    P1OUT |=  (BUT1 | BUT2); // Set resistor as pull-up






    // Polling the button in an infinite loop
    for(;;) {

        if((P1IN & (BUT1|BUT2))==BUT2){
                 P1OUT |= redLED;   // Turn red LED on
        }

        if((P1IN & (BUT1|BUT2))==BUT1){
                 P9OUT |= greenLED;     // Turn green LED on
        }
       if (P1IN & (BUT1 | BUT2) == (BUT1|BUT2))
                   P1OUT &= ~redLED;
                   P9OUT &= ~greenLED;

    }
}

最佳答案

你的方括号和大括号有点不一致。在最后一部分尝试这个:

if ((P1IN & (BUT1 | BUT2)) == (BUT1|BUT2)) {
    P1OUT &= ~redLED;
    P9OUT &= ~greenLED;
}

请注意 P1IN & (BUT1 | BUT2) 周围的括号,以便首先对其求值。两条线周围的大括号也没有,因此它们都取决于条件,而不仅仅是第一行。本质上它现在与您的前两个匹配。

关于c - MSP430FR6989 按钮和 LED 切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54372866/

相关文章:

c - 是否可以让 bash 检测 C 中的编译错误?

embedded - 尝试调试STM32F205ZG时出现"Could not stop Cortex-M device"错误

crc - 使用内置函数计算 msp430f5438a 的 crc 的方法

c - GCC |警告 : implicit declaration of function '_stricmp' [-Wimplicit-function-declaration]|

c - 在 XCode 4.5.2 中的 C 项目上使用静态库

c - 程序出了什么问题?

javascript - 使用压缩的 JavaScript 文件(不是运行时压缩)

c - 两个CPU之间棘手的队列使用

assembly - CMP 和进位标志

interrupt-handling - __even_in_range(UCA0IV,0x08) 是什么意思