TIVA TM4C123 同时按下sw1和sw2点亮红色LED代码问题咨询
TIVA TM4C123 GPIO双按键点亮红色LED修复方案
核心问题定位
你的代码存在两处错误:
- 按键电平判断逻辑反转:SW1(PF4)、SW2(PF0)配置为上拉输入,未按下时引脚为高电平,按下时为低电平,原代码的判断条件是检测按键未按下的状态,和需求完全相反。
- while循环末尾冗余代码:原代码在所有逻辑判断结束后,额外加了一行全LED关闭的代码,导致前面分支点亮的LED仅能维持几纳秒,人眼无法识别点亮效果。
修复后的完整代码
#include <stdint.h> #include <stdbool.h> #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 == 0 && sw2 == 0) { // 双按键同时按下点亮红色LED(PF1) GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_1); } else if (sw2 == 0) { // SW2单独按下点亮蓝色LED(PF2) GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_2); } else if (sw1 == 0) { // SW1单独按下点亮绿色LED(PF3) GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_3); } else { // 无按键按下关闭所有LED GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x00); } } }
内容的提问来源于stack exchange,提问作者Porton_
相关产品推荐
相关产品推荐

