Включите светодиод, когда оба sw1 и sw2 нажаты в TIVA

#c #arm

Вопрос:

Я пытаюсь включить красный светодиод, когда нажаты sw1 и sw2. Этот текущий код может включать синий светодиод с sw1 и зеленый с sw2 (TM4C123).

 #include lt;stdint.hgt; #include lt;stdbool.hgt; #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "inc/hw_gpio.h"  uint8_t sw1=2; uint8_t sw2=2;  int main(void) {  SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);   SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);   HWREG(GPIO_PORTF_BASE   GPIO_O_LOCK) = GPIO_LOCK_KEY;  HWREG(GPIO_PORTF_BASE   GPIO_O_CR) |= 0x01;  HWREG(GPIO_PORTF_BASE   GPIO_O_LOCK) = 0;   GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);   GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_4);  GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);    while(1)  {   sw1 = GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4);  sw2 = GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_0);  if (sw1 == 0b00010000 amp;amp; sw2 == 0b00000001)  {  GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0xFF);  }  else if (sw2 == 0b00000001)  {  GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0xFF);  }  else if (sw1 == 0b00010000)  {  GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0xFF);  }  else  {  GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x00);  }  GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x00);   } }   

С помощью этого кода TIVA включает красный светодиод и переключается на синий или зеленый при нажатии переключателей. Я думаю , что проблема в условии, которое я использовал в первом if , что я должен использовать, чтобы включить красный светодиод при нажатии sw1 и sw2?

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

1. Как насчет размещения GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3, 0x00); внутри первого условия, чтобы отключить нежелательные светодиоды, аналогично в других условиях, и удалить линию, которая окончательно отключает их все.

2. Вы не можете реализовать такое управление кнопками. Когда вы нажимаете кнопку, наступает фаза, в течение которой сигнал «скачет» между высоким и низким, поэтому ваши светодиоды неожиданно переключаются. Взгляните на «отмену фильтра» в Интернете.

3. @GuillaumePetitjean это правда, но это не должно мешать ученическому упражнению показывать светодиоды в состоянии мгновенной кнопки. В любом случае, это первый шаг перед реализацией отмены.

4. @WeatherVane достаточно справедливо. Еще один момент: я не понимаю последних GPIOPinWrite событий . индикатор 1 переключится.

5. @GuillaumePetitjean исходя из предположения, что 0x00 выключает выбранные выходы и 0xFF включает их, я предложил, чтобы при GPIO_PIN_1 включении вы выключали светодиоды GPIO_PIN_2 | GPIO_PIN_3 , которые не нужны. В коде выбранные светодиоды включаются ненадолго, и все три сразу же отключаются.