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。
您似乎想做的是检查某个位是否打开。
代码的实际作用是:
- PD0中的数字移1
- 将结果与 1 进行比较。
这部分只有在 PD0 == 0 时才为真,这样 1 就不会移位。
- 按位和与PIND内容比较的结果
- 如果第3步的结果不为0,则进入
if
块
要实际检查某个位是否已设置,您需要这样的条件:
if (PIND & (1 << PD0)) { ... }
这利用了 C 将任何非零值计算为真这一事实。
为了让代码更明确地表达意图,你可以这样写:
if ((PIND & (1 << PD0)) > 0) { ... }
以及硬件方面的评论:
查看您的图表(架构),您的按钮上似乎没有上拉或下拉电阻。
确保在您的微控制器输入上 activate the built in pullups,或添加外部电阻器。
(在第一种情况下,您可能需要反转逻辑,以便您的按钮处于低电平状态)。
如果您不这样做,当按钮未被按下时,输入将是 "floating",这意味着它们可能会随机发出 "button pressed" 信号。
我有一个简单的硬件项目,任务很简单:我必须使用 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。
您似乎想做的是检查某个位是否打开。 代码的实际作用是:
- PD0中的数字移1
- 将结果与 1 进行比较。
这部分只有在 PD0 == 0 时才为真,这样 1 就不会移位。 - 按位和与PIND内容比较的结果
- 如果第3步的结果不为0,则进入
if
块
要实际检查某个位是否已设置,您需要这样的条件:
if (PIND & (1 << PD0)) { ... }
这利用了 C 将任何非零值计算为真这一事实。
为了让代码更明确地表达意图,你可以这样写:
if ((PIND & (1 << PD0)) > 0) { ... }
以及硬件方面的评论:
查看您的图表(架构),您的按钮上似乎没有上拉或下拉电阻。
确保在您的微控制器输入上 activate the built in pullups,或添加外部电阻器。 (在第一种情况下,您可能需要反转逻辑,以便您的按钮处于低电平状态)。
如果您不这样做,当按钮未被按下时,输入将是 "floating",这意味着它们可能会随机发出 "button pressed" 信号。