我正在尝试使用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);
}
任何想法都会非常感激,我也是一个编程菜鸟,所以要温柔:)