Кнопка MSP430FR6989 и светодиодный переключатель

Работаю над школьным проектом, и я застрял в своем последнем кусочке кода. Допустим, S1 удерживается, а красный светодиод горит. Если при этом нажать S2, зеленый светодиод остается выключенным, а красный светодиод продолжает гореть. Это состояние сохраняется, пока S1 не выпущен. Теперь у S2 есть возможность включить зеленый светодиод. И, аналогично, если S2 удерживается при включенном зеленом светодиоде, S1 игнорируется при нажатии до тех пор, пока S2 не будет отпущен.

Я в настоящее время застрял в вечной петле. Я не могу заставить свой код делать то, что описано в предыдущем абзаце. Как только кнопки BUT1 и BUT2 удерживаются в нажатом состоянии, зеленый и красный светодиодные индикаторы выключаются.

#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;

    }
}

1 ответ

Вы немного не согласны с вашими скобками и скобками. Попробуйте это для последнего раздела:

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

Обратите внимание на круглые скобки P1IN & (BUT1 | BUT2) так что он оценивается первым. Не также скобки вокруг двух строк, поэтому они оба зависят от условия, а не только от первой строки. По сути это теперь соответствует первым двум.

Другие вопросы по тегам