使用二进制值寻址多个引脚Arduino / MCP23017

时间:2018-08-06 13:40:57

标签: python arduino led

两个问题:

  1. 是否可以使用digitalWrite函数使用二进制值来寻址多个引脚?该文档似乎表明每个digitalWrite只能使用1个引脚。

  2. 我正在遍历该数组int array4[] = {14, 10, 4, -1};,并且我不想打开由array4 [3]表示的LED,因为某些原因-1实际上正在激活一个引脚。在这方面我可以使用“空”值吗?

我正在移植一些Python代码以在Arduino上运行,并且在使用多个MCP23017芯片打开/关闭LED灯时遇到了一个问题。通过使用python中的二进制值数组,我能够打开LED的组合。

使用Python程序,我可以通过使用二进制字符串(如0b10011011)来解决给定MCP芯片上引脚的任何组合。例如,假设这点亮了LED 2、4和6。那么,在Arduino上,相同的二进制值仅点亮了一个LED。

我知道我可以激活多个引脚,例如:

int array1[] = {11, 6, 5, 0};
int array2[] = {12, 8, 2, 7};
int array3[] = {13, 9, 3, 1};
int array4[] = {14, 10, 4, -1};

mcp5.digitalWrite(array1[i],1);
mcp5.digitalWrite(array2[i],1);
mcp5.digitalWrite(array3[i],1);
mcp5.digitalWrite(array4[i],1);

但是我想将现有代码用于二进制序列,而不是重写所有内容。谢谢!

1 个答案:

答案 0 :(得分:0)

以下假设您正在使用Adafruit MCP23017库

您只能一次用digitalWrite写一个引脚。来源:

void Adafruit_MCP23017::digitalWrite(uint8_t pin, uint8_t d) {
    uint8_t gpio;
    uint8_t bit=bitForPin(pin);


    // read the current GPIO output latches
    uint8_t regAddr=regForPin(pin,MCP23017_OLATA,MCP23017_OLATB);
    gpio = readRegister(regAddr);

    // set the pin and direction
    bitWrite(gpio,bit,d);

    // write the new GPIO
    regAddr=regForPin(pin,MCP23017_GPIOA,MCP23017_GPIOB);
    writeRegister(regAddr,gpio);
}

您可以看到没有错误或边界检查。

您可以以此函数为基础编写自己的digitalWriteMany函数(或其他合适的名称)。此函数还可以检查数组中的NULL值。