【问题标题】:Port G Atmega 128 Avr AssemblyPort G Atmega 128 Avr 组件
【发布时间】:2021-04-08 10:51:57
【问题描述】:

我正在尝试使用 portG 创建一个简单的功能。

如果 PG0 中的开关闭合,则 PG1 中的 LED 应打开。否则,LED 应该关闭。但是,我不知道如何将一位用作输出而另一位用作输入。

【问题讨论】:

  • 有一个端口配置寄存器。一旦您配置了哪些引脚是输入和哪些是输出,您可以写入端口,输出引脚将响应您写入的值。

标签: assembly avr atmega


【解决方案1】:

这样的 C 程序应该可以工作:

#include <avr/io.h>

void main() {
  DDRG |= (1 << 1);
  while (true) {
    if (PING & (1 << 0)) {
      // Button is pressed so drive PG1 high.
      PORTG |= (1 << 1);
    }
    else {
      PORTG &= ~(1 << 1);
    }
  }
}

我们可以使用Godbolt.org 将该程序转换为程序集:

main:
        lds r24,100
        ori r24,lo8(2)
        sts 100,r24
.L2:
        lds r24,99
        sbrs r24,0
        rjmp .L3
        lds r24,101
        ori r24,lo8(2)
        rjmp .L5
.L3:
        lds r24,101
        andi r24,lo8(-3)
.L5:
        sts 101,r24
        rjmp .L2

(由于 99 和 101 之类的任意数字,这不是一个很好看的汇编程序,但您可能可以找出这些数字所指的寄存器并将这些数字替换为寄存器名称。您还想重命名标签。)

【讨论】:

  • 非常感谢!特别是,C++ 转换器对我来说就像是一种复兴 :)
  • 提示:您也可以在命令行上运行avr-gccavr-g++ 将C/C++ 转换为汇编。这是那些编译器做的主要事情! Godbolt.org 只是为此提供了一个很好的界面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多