为什么开关不按编程工作?

时间:2017-06-06 12:00:03

标签: c embedded

当我执行此代码时,默认情况下LED指示灯亮,而按下开关时它只应为ON。当我按下开关时,它会关闭。任何人都可以解释一下,我的代码出错了。

#include <lpc17xx.h>

#define SwitchPinNumber 11
#define LedPinNumber 6

void main()
{
    uint32_t switchStatus;

    SystemInit();

    LPC_PINCON->PINSEL4 = 0x000000; // Configure the Pins for GPIO;

    /* Configure the LED pin as output and SwitchPin as input */
    LPC_GPIO2->FIODIR = ((1 << LedPinNumber) | (0 << SwitchPinNumber));

    while (1)
    {
        /* Turn On all the leds and wait for one second */
        switchStatus = (LPC_GPIO2->FIOPIN >> SwitchPinNumber) & 0x01; // Read switch status
        if (switchStatus == 1)
        {
            LPC_GPIO2->FIOPIN = (1 << LedPinNumber);
        }
        else
        {
            LPC_GPIO2->FIOPIN = (0 << LedPinNumber);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

如果这实际上是一个机械开关,那么你必须始终:

  • 在某处取消信号,通常在代码中完成,但也可以使用外部RC滤波器完成。
  • 使用外部或内部的拉电阻确保信号被拉至无效状态。从问题中不清楚是否需要此信号为高电平有效或低电平有效。

这些是可以用硬件或软件解决的非常基本的东西。您的问题没有显示上述任何一项的痕迹,因此您的程序不太可能按预期工作。

答案 1 :(得分:0)

看起来您的代码正在运行,但逻辑是颠倒的。这可能是因为:

  1. 您正在读取的开关将输入信号向下拉,而不是向上拉。这意味着当按下开关时,逻辑为0,而不是您期望的1。或
  2. 通过将微控制器引脚驱动为低电平而不是按预期的高电平来指示LED通电。
  3. 理想情况下,您已经查看了所控制电路的原理图,这样您就可以在编写代码之前解决逻辑状态的影响。

    我希望您只需将行if (switchStatus == 1)更改为if (switchStatus == 0)即可获得所需的结果,但您还应该对您的电路进行一些调查,以确定我建议的原因是否导致意外的结果,避免将来重复这个错误。