#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
, которые не нужны. В коде выбранные светодиоды включаются ненадолго, и все три сразу же отключаются.