G 端口 Atmega 128 Avr 组件
Port G Atmega 128 Avr Assembly
我正在尝试使用 portG 创建一个简单的功能。
如果PG0中的开关闭合,PG1中的LED应该点亮。否则,LED 应该熄灭。但是,我不知道如何使用一位作为输出而另一位作为输入。
像这样的 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 之类的任意数字,但您可能可以弄清楚这些数字指的是什么寄存器,并将这些数字替换为寄存器名称。您还需要重命名标签。)
我正在尝试使用 portG 创建一个简单的功能。
如果PG0中的开关闭合,PG1中的LED应该点亮。否则,LED 应该熄灭。但是,我不知道如何使用一位作为输出而另一位作为输入。
像这样的 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 之类的任意数字,但您可能可以弄清楚这些数字指的是什么寄存器,并将这些数字替换为寄存器名称。您还需要重命名标签。)