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

问题描述

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

以下是架构和代码的图像: 架构 C 代码

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

PORTC = 引脚;

标签: cproteusatmega32

解决方案


尽管这被标记为“已解决”,但我想指出这条线有问题:

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

实际上,它有两个问题:条件和运算符优先级

您似乎想要做的是检查某个位是否打开。代码实际上做了什么,是这样的:

  1. 在 PD0 中按数字移位 1
  2. 将结果与 1 进行比较。
    仅当 PD0 == 0 以使 1 不移位时,这部分才为真。
  3. 按位与 PIND 内容比较的结果
  4. 如果步骤 3 的结果不为 0,则进入该if块。

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

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

这使用了 C 将任何非零值评估为 true 的事实。

为了使代码更明确地说明意图,您可以这样编写:

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

并对事物的硬件方面进行评论:
查看您的图表(模式),您的按钮上似乎没有上拉或下拉电阻。

确保激活微控制器输入上的内置上拉电阻,或添加外部电阻。(在第一种情况下,您可能需要反转逻辑,以便您的按钮处于低电平有效状态)。

如果你不这样做,当按钮没有被按下时,输入将是“浮动的”,这意味着它们可能会随机给出“按下按钮”的信号。


推荐阅读