G 端口 Atmega 128 Avr 组件

问题描述 投票:0回答:2

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

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

assembly avr atmega
2个回答
2
投票

像这样的 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 这样的任意数字,但是您可能可以找出这些数字引用的寄存器,并将这些数字替换为寄存器名称。您还想重命名标签.)


0
投票

如果端口 F 和端口 G 作为 I/O 工作时遇到问题,请尝试修复这两个保险丝位。enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.