gpt4 book ai didi

c - 用 C 编写 AVR

转载 作者:太空宇宙 更新时间:2023-11-04 00:28:46 25 4
gpt4 key购买 nike

我使用的是 Atmega328。我有沿引出线“随机”分布的输出引脚,即它们不属于相同的端口。例如,我的输出引脚可能是 PB0、PB4、PC1、PC3 和 PD1。

我一直使用 Assembly 对微 Controller 进行编程,所以这是我第一次使用 C。我想知道的是,是否有一种方法可以避免对每个引脚使用 DDRx 和 Px 来设置或清除它们。

例如,我想用这样的东西来设置端口 B 的第一位:

#define NAME_1 DDRB,0

sbi NAME_1;

这可能吗?

编辑:

可能是我没表达清楚。我想要的是能够使用一些有意义的名称来引用某些 I/O 端口引脚。例如,将PD3命名为“blue_LED”,这样代码的可读性更强,如果以后改变蓝色LED的位置,也可以方便地修改代码。换句话说,我希望能够打开和关闭某些名称未被硬编码的引脚。有办法吗?

最佳答案

sbi instruction 的特殊之处在于它直接操作 AVR 平台上 I/O Port 中的位。 I/O 端口的正常过程是您必须使用其他指令(如 out )在 I/O 端口和寄存器之间复制整个字。

就是说,没有 sbi在 C. C 中只是不知道某个特定平台的这些特殊功能。对于您举的程序集,您可以用 C 语言编写:

DDRB |= 1<<0;

我个人认为这看起来很简洁,但是你当然可以定义一个宏

#define sbi(x,b) (x) |= 1<<(b)

sbi(DDRB, 0);

(其中 b 是“位数”),也许反过来

#define cbi(x,b) (x) &= ~(1<<(b))

cbi(DDRB, 0)

这会起作用,但我建议不要使用它。而第一个符号 DDRB |= 1<<0;对任何 C 程序员来说都是显而易见的,但使用这样的宏可能不是。

最后一点,如果您担心性能:我还没有验证这一点,但我很确定 avr-gcc足够聪明,可以发出 sbicbi当 I/O 端口上的位掩码操作实际上只改变一个位时的指令。 编辑:请参阅 JLH 的回答以获得 gcc-avr 的实验结果确实 足够聪明,可以发出这些 sbi/cbi说明。

关于c - 用 C 编写 AVR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44469290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com