Proteus 8.6 + C 编程语言 - 通过常规按钮显示 LED 按钮 [已解决]

Proteus 8.6 + C programming language - Display LED Buttons By Regular Buttons [SOLVED]

我有一个简单的硬件项目,任务很简单:我必须使用 ATMega32 微控制器打开具有响应式常规按钮的 LED 按钮。作为 IDE,我们使用 Proteus 8.6 和 C 作为编程语言。我可以实现转动 on/off 第一个按钮,但问题是类似的方法不适用于其他按钮(您可以在第一张图片上看到它 - 按下前两个按钮,但只有第一个 LED 亮起)。我不知道问题出在模式还是代码中。如果您知道如何在没有 8 "if" 块的情况下实现它甚至简化位逻辑,我将非常感激!

这里是架构和代码的图像: Schema C Code

已解决(使用一行代码,PORTC - LED 按钮的输出,PIND - 输入按钮的值):

PORTC = PIND;

尽管这被标记为 'solved' 我想指出这一行有问题:

if (PIND & 1 << PD0 == 1)

事实上,它有两个问题:条件和operator precedence

您似乎想做的是检查某个位是否打开。 代码的实际作用是:

  1. PD0中的数字移1
  2. 将结果与 1 进行比较。
    这部分只有在 PD0 == 0 时才为真,这样 1 就不会移位。
  3. 按位与PIND内容比较的结果
  4. 如果第3步的结果不为0,则进入if

要实际检查某个位是否已设置,您需要这样的条件:

if (PIND & (1 << PD0)) { ... }

这利用了 C 将任何非零值计算为真这一事实。

为了让代码更明确地表达意图,你可以这样写:

if ((PIND & (1 << PD0)) > 0) { ... }

以及硬件方面的评论:
查看您的图表(架构),您的按钮上似乎没有上拉或下拉电阻。

确保在您的微控制器输入上 activate the built in pullups,或添加外部电阻器。 (在第一种情况下,您可能需要反转逻辑,以便您的按钮处于低电平状态)。

如果您不这样做,当按钮未被按下时,输入将是 "floating",这意味着它们可能会随机发出 "button pressed" 信号。