Панель запуска MSP432 не распознает, когда нажата только одна кнопка

#c #embedded #code-composer #launchpad #msp432

Вопрос:

Я пытаюсь создать программу на панели запуска MSP432, которая будет включать зеленый светодиод, когда ни одна из двух встроенных кнопок (P1.4 и P1.1) не нажата, и включать красный светодиод, если нажата только кнопка P1.4. С помощью приведенного ниже кода панель запуска правильно включает зеленый светодиод, когда кнопки не нажимаются, но не включает красный светодиод, когда я нажимаю только кнопку P1.4. Есть ли какие-либо проблемы с моим кодом или конфигурацией контактов?

 #include "msp.h"
#include "clock.h"
#include "TExaS.h"
void main()
{
    Clock_Init48MHz();

     /* Configuration of MSP42 */
     P2->SEL0 amp;= ~0x03;             // configure P2.0 and 2.1 as GPIO
     P2->SEL1 amp;= ~0x03;             // configure P2.0 and 2.1 as GPIO
     P2->DIR  |= 0x03;              // configure P2.0 and P2.1 as output


     //configure buttons on P1.1 and P1.4 as GPIO pull up inputs
      P1->SEL0 amp;= ~0x12;
      P1->SEL1 amp;= ~0x12;
      P1->DIR amp;= ~0x12;
      P1->REN |= 0x12;
      P1->OUT |= 0x12;


     //Application
     while(1){

         Clock_Delay1ms(100);

         //if P1.4 and P1.1 are both not being pressed
         if(P1->IN amp; 0x12){
             P2->OUT |= 0x02;  //turn on green light
             P2->OUT amp;= ~0x01; //turn off red light
         }

         //if only P1.4 is pressed
         else if(P1->IN amp; 0x10){
             P2->OUT |= 0x01;  //turn on red light
             P2->OUT amp;= ~0x02; //turn off green light
         }

     }

}
 

Ответ №1:

Ваши утверждения if не согласуются с комментариями над ними.

Если ваши переключатели активны на низком уровне (что подразумевает включение подтягиваний), то первые операторы if проверяют, не нажата ли какая-либо кнопка, а не обе, а ваш else-if проверяет, не нажата ли P1.4 независимо от P1.1 (что никогда не может быть так, потому что это уже соответствовало бы if — то есть, если значение не меняется между считываниями).

Я думаю, вам, возможно, потребуется рассмотреть разницу между if ((x amp; m) == m) и if (x amp; m) .

Комментарии:

1. @RafaelE24, если этот ответ решит вашу проблему, не могли бы вы, пожалуйста, отметить его слева?