我会说“是”,这是可能的,但可能不是你想要的方式(或者我只是不知道该怎么做^^)
首先,PORTS
是来自 Atmel 的宏。您的 Arduino-Uno 基于 AtMega328p,因此使用 AVR-Toolchain 和所有这些PORTS
在引擎盖下。如果您要在没有 arduino-bootloader 和所有花哨的 arduino-library-stuff 的情况下对您的微控制器进行编程,那么您可以这样处理所有 GPIO。
如果您查看 Atmel-AVR 工具链的代码(arduino 位于其顶部),您会看到,它们是在微控制器PORTS
中定义的iom328p.h
并且只是内部 IO 寄存器的地址。
所以,仅仅声明一个虚拟端口并不是那么容易(也许有一种类似的内存映射,std::mmap()
但我从未尝试过这个)。
无论如何,您是一名程序员,因此几乎所有事情都有解决方案;)我个人建议创建自己的Port
-Class:
- 此类包含您作为成员所需
Pins
的成员,并且您有一个设置器,它根据您传递给它的数字覆盖您的成员引脚
- (此代码并不意味着是“完美”的解决方案,只是一个快速提示方向)
对于这种方法,我建议您使用 arduino-library。如果你用 plain 来做PORTS
,你可能会在某个地方搞砸一些东西。因此,例如,如果您初始化 SerialPort 然后执行类似的操作PORTD |= (1<<PD0)
,您将无法接收任何数据并且不知道为什么。
class MyPort
{
private:
uint8_t m_pin[8];
public:
MyPort(uint8_t pins[8])
{
for(int i=0; i<8; ++i)
{
m_pin[i] = pins[i]; //copy from constructor-argument into member-variable
pinMode(pins[i], OUTPUT); //setting pin as OUTPUT
}
}
void operator =(uint8_t val)
{
for(int i=0; i<8; ++i)
{
digitalWrite(m_pin[i], (val >> i)&1);
}
}
};
// B0,B1,D2,D3,D4,D5,D6,D7
// v v v v v v v v
uint8_t pins[]{8, 9, 2, 3, 4, 5, 6, 7};
MyPort PORTX(pins);
void setup()
{
PORTX = 0b11001100;
}
void loop()
{
// put your main code here, to run repeatedly:
}
请注意,如果您也想在自己的端口上进行按位寻址,您还必须覆盖其他运算符