c++ - 将端口作为变量传递 - AVR

标签 c++ io avr

是否可以将 AVR 端口用作可以传递的变量?

例如

LED myLed(PORTA,7);   //myLED hooked to PORTA, Pin 7

我想让 LED 能够接受任何端口/引脚组合,所以我不想硬编码。

请注意,端口定义为:

#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 构造器的输出? 这将涉及查找给定端口# 的相关 DDR# 寄存器。 我可以假设 &DDR# 永远是 &PORT#-1 吗?

最佳答案

寄存器宏基本上是指向内存位置的指针,适当的寄存器所在的位置,所以是的,您可以使用 uint8_t volatile *。但是,编译器不会以这种方式生成最高效的代码——它将使用间接寻址而不是直接写入。

这就是我所做的,使用 avrlib .

#include <avrlib/porta.hpp>
#include <avrlib/pin.hpp>
using namespace avrlib;

typedef pin<porta, 4> led_pin;

然后你可以使用led_pin typedef,例如

led_pin::set();

关于c++ - 将端口作为变量传递 - AVR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13704076/

相关文章:

c++ - 创建库

c - 为什么使用2个指针指向atmega微 Controller 中的寄存器地址?

C++ 宏 - for 循环中的错误

c++ - 带有 OpenGl 的 Centos 7 上的 Qt 无法正常工作

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

被调用对象不是使用三元的函数或函数指针

perl - 如何检测套接字连接何时丢失?

c++ - 尝试通过 Eclipse-AVR 使用 Arduino 的 HardwareSerial

c++ - 在Qt C++中的void插槽中使用return时的C2120

c++ - 访问 SSE 寄存器变量