【发布时间】:2012-12-04 13:30:01
【问题描述】:
是否可以将 AVR 端口用作可以传递的变量?
例如
LED myLed(PORTA,7); //myLED hooked to PORTA, Pin 7
我想让 LED 能够采用任何 PORT / Pin 组合,所以我宁愿不对其进行硬编码。
请注意,端口定义为:
#define PINA _SFR_IO8(0x00)
#define DDRA _SFR_IO8(0x01)
#define PORTA _SFR_IO8(0x02)
PORTA 符号解析为 (*(volatile uint8_t *)((0x02) + 0x20))
我相信这将允许我执行以下操作,但我不确定是否需要 volatile 关键字,也不确定它是否会按预期工作
class LED{
public:
LED(volatile uint8_t* port, uint8_t pin);
{
Port=port;
Pin=pin;
}
void write(bool val)
{
if(val) (*Port) |= 1 << Pin;
else (*Port) &= ~(1 << Pin);
}
private:
uint8_t Pin
volatile uint8_t* Port;
}
最后,有没有办法将端口/引脚设置为 LED 构造器的输出? 这将涉及为 Given PORT# 找到相关的 DDR# 寄存器。 我可以假设 &DDR# 永远是 &PORT#-1 吗?
【问题讨论】:
-
你也可以使用位结构...
-
您介意对此进行扩展吗?我不确定你所说的位结构是什么意思
-
struct port{ UINT8 _port_1_0:1; UINT8 _port_1_2:1; ... };- 这在 C 中更好/更好。但如果你有 C++ 和模板,avakar 示例会更好。