【问题标题】:Why is switch not working as programmed?为什么开关没有按程序工作?
【发布时间】:2017-06-06 12:00:02
【问题描述】:

当我执行此代码时,LED 默认为开启状态,而只有在按下开关时才应开启。当我按下开关时,它会关闭。谁能解释一下,我的代码做错了什么。

#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);
        }
    }
}

【问题讨论】:

  • 简单地反转位和值和逻辑?所以0变成11变成0?这么简单的东西?
  • 你应该做一些调试。
  • 有些芯片有反向逻辑。 1 关闭,0 开启。
  • 1 是熄灭还是点亮 LED 完全取决于它的电子连接方式。简单地颠倒状态。这不是编程问题,而是电子问题。
  • 极不可能这是一个芯片错误,在连接 LED 时很常见,因此您必须将其短路才能打开它,从历史上看,MCU 下沉的次数比它的来源多。从历史上看,如果一个零件不能驱动一个高高和一个低低并且需要反向逻辑,它就不会进入市场。这既是一个 EE stackexchange 问题,又是无数个问题。此外,OP 应该提前进行一些测试,例如在一个测试中点亮 LED,在另一个测试中点亮 LED,而无需涉及开关(看看我们在说什么)。同样,开关可以连接到上拉或下拉。

标签: c embedded


【解决方案1】:

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

  • 在某处消除信号抖动,通常在代码中完成,但也可以使用外部 RC 滤波器完成。
  • 确保使用外部或内部拉电阻将信号拉至非活动状态。从问题中不清楚您需要此信号是高电平有效还是低电平有效。

这些都是可以通过硬件或软件解决的非常基本的问题。您的问题没有显示执行上述任何操作的痕迹,因此您的程序不太可能按预期工作。

【讨论】:

  • 顺便说一句,您只需从调试器查看内存映射中的 IO 寄存器即可轻松检查硬件。调试器通常允许您直接写入此类寄存器,这也可用于检查 LED 是否工作。
【解决方案2】:

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

  1. 您正在读取的开关将输入信号拉低,而不是拉高。这意味着当按下开关时,逻辑为 0,而不是您期望的 1。或者
  2. 通过将微控制器引脚驱动为低电平而不是您预期的高电平来激活 LED 指示灯。

理想情况下,您应该已经查看了您正在控制的电路的原理图,这样您就可以在编写代码对其进行操作之前计算出逻辑状态的影响。

我希望您可以简单地将行 if (switchStatus == 1) 更改为 if (switchStatus == 0) 以获得您想要的结果,但您还应该对您的电路进行一些调查以确定我建议的任何原因是否导致意外结果并避免以后再犯这个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 2021-01-03
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多