c - Proteus 8.6 + C 编程语言 - 通过常规按钮显示 LED 按钮 [已解决]
问题描述
我有一个简单的硬件项目,任务很简单:我必须使用 ATMega32 微控制器打开带有响应常规按钮的 LED 按钮。作为 IDE,我们使用 Proteus 8.6 和 C 作为编程语言。我可以实现打开/关闭第一个按钮,但问题是类似方法不适用于其他按钮(您可以在第一张图像上看到它 - 前两个按钮被按下,但只有第一个 LED 亮起)。我不知道问题出在模式还是代码中。如果您知道如何在没有 8 个“if”块的情况下实现它甚至简化位逻辑,我将非常感激!
已解决(使用一行代码,PORTC - LED 按钮的输出,PIND - 输入按钮的值):
PORTC = 引脚;
解决方案
尽管这被标记为“已解决”,但我想指出这条线有问题:
if (PIND & 1 << PD0 == 1)
实际上,它有两个问题:条件和运算符优先级。
您似乎想要做的是检查某个位是否打开。代码实际上做了什么,是这样的:
- 在 PD0 中按数字移位 1
- 将结果与 1 进行比较。
仅当 PD0 == 0 以使 1 不移位时,这部分才为真。 - 按位和与 PIND 内容比较的结果
- 如果步骤 3 的结果不为 0,则进入该
if
块。
要实际检查是否设置了某个位,您需要这样的条件:
if (PIND & (1 << PD0)) { ... }
这使用了 C 将任何非零值评估为 true 的事实。
为了使代码更明确地说明意图,您可以这样编写:
if ((PIND & (1 << PD0)) > 0) { ... }
并对事物的硬件方面进行评论:
查看您的图表(模式),您的按钮上似乎没有上拉或下拉电阻。
确保激活微控制器输入上的内置上拉电阻,或添加外部电阻。(在第一种情况下,您可能需要反转逻辑,以便您的按钮处于低电平有效状态)。
如果你不这样做,当按钮没有被按下时,输入将是“浮动的”,这意味着它们可能会随机给出“按下按钮”的信号。
推荐阅读
- intellij-idea - 无法启动场景构建器
- javascript - 创建日期数组
- c# - C#、Json反序列化:避免空字符串数组元素
- functional-programming - 带有子列表的方案/球拍插入无处不在的功能
- c++ - 如何避免多态性?
- c# - 使用 msbuild 命令行转换 web.config
- javascript - 尝试在 Mongoose 预保存挂钩中测试休息调用时出错
- angular - 将输入集中在自定义 Angular MatFormFieldControl 中
- javascript - 为什么 -3 >> 1 等于 -2?
- r - 基于特定模式对 R 中的字符向量进行子集化