Кнопка MSP430FR6989 и светодиодный переключатель - PullRequest
0 голосов
/ 26 января 2019

Работаю над школьным проектом, и я застрял в своем последнем кусочке кода.Допустим, 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 Ответ

0 голосов
/ 24 февраля 2019

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

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

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

...