将Arduino与MCP23S17 SPI I / O扩展器配合使用

时间:2016-08-16 23:33:31

标签: arduino

我正在尝试使用SPI IO Expander来读取一些BCD开关。我得到了一些非常......时髦和意想不到的结果。我正在将读数字打印到串行线路。我的问题是,数字0,1,2,3读得很好,但由于某种原因,4显示为3,然后5显示为4等等...最多9显示为8.这是我正在使用的代码:

int bDigit = 0;

  for (int i = 0; i < 4; i++) {
    Serial.print(mcp.digitalRead(bcd1[i]));

    if (!mcp.digitalRead(bcd1[i])) {
      bDigit = bDigit + (int)pow(2, i);
      delay(10);
    }
  }
  Serial.println("");
  Serial.print("Binary Digit is ");
  Serial.println(bDigit);
  delay(5000);    

因为我使用的是BCD开关的公共接地,并且我用10k电阻从外部拉出IO线,串行线返回以下内容:

当BCD处于位置3时,串行显示

  

0011   二进制数字是3

当BCD处于位置4时,串行显示

  

1101   二进制数字是3

位置3的bcd看起来很好,前2位接地,第2位高,所以for循环将增加1 + 2,但第二个例子! 1101将添加pow(2,2)= 4!那为什么输出3!?!?!

我在下面列出了所有代码:

    #include <SPI.h>              // We use this library, so it must be called here.
    #include <MCP23S17.h>         // Here is the new class to make using the MCP23S17 easy.
MCP mcp(0, 10);            // Instantiate an object called "mcp" on an MCP23S17 device at address 0
                           // and slave-select on Arduino pin 10 to avoid the speed penalty of digitalWrite
int fEdgeTrig;
int bcd1[] = {8, 10, 7, 9};

void setup() {
  mcp.begin();
  for (int j = 0; j < 4; j++) {
    mcp.pinMode(bcd1[j], INPUT);
  }
  mcp.pinMode(1, INPUT);
  fEdgeTrig = 0;
  Serial.begin(9600);
}

void loop() {
  int bDigit = 0;

  for (int i = 0; i < 4; i++) {
    Serial.print(mcp.digitalRead(bcd1[i]));

    if (!mcp.digitalRead(bcd1[i])) {
      bDigit = bDigit + (int)pow(2, i);
      delay(10);
    }
  }
  Serial.println("");
  Serial.print("Binary Digit is ");
  Serial.println(bDigit);
  delay(5000);
}

任何想法都会非常感激,我也是一个编程菜鸟,所以要温柔:)

0 个答案:

没有答案