Excellent, thank you so much! That works perfectly. I think I understand how the mux shield works a bit better now, too.
I have another question though:
I will eventually have 16 inputs (and outputs). Would I be able to store the buttonState values in an array, and then iterate through the array and call the digitalReadMUX function on each value? Something like this:
[s]#define CONTROL0 5
#define CONTROL1 4
#define CONTROL2 3
#define CONTROL3 2
int buttonPin1 = 0;
int buttonPin2 = 1;
int buttonPin3 = 2;
int buttonState[3];
void setup()
{
for(int i=0; i<3; i++){
buttonState[i] = 0;
}
pinMode(CONTROL0, OUTPUT);
pinMode(CONTROL1, OUTPUT);
pinMode(CONTROL2, OUTPUT);
pinMode(CONTROL3, OUTPUT);
Serial.begin(9600);
pinMode(14, INPUT);
pinMode(15, OUTPUT);
pinMode(16, INPUT);
digitalWrite(14, HIGH);
digitalWrite(15, HIGH);
digitalWrite(16, HIGH);
}
void loop()
{
for (int i=0; i < buttonState.length; i++)
{
buttonState[i] = digitalReadMUX(i);
}
digitalWrite(15, LOW);
}
int digitalReadMUX(int pin)
{
digitalWrite(CONTROL0, pin & 8 );
digitalWrite(CONTROL1, pin & 4 );
digitalWrite(CONTROL2, pin & 2 );
digitalWrite(CONTROL3, pin & 1 );
return (!digitalRead(14)); // pin 14 is the arduino pin multiplexed // expression might need a !
}
int digitalWriteMUX (int pin){
digitalWrite(CONTROL0, pin & 8);
digitalWrite(CONTROL1, pin & 4);
digitalWrite(CONTROL2, pin & 2);
digitalWrite(CONTROL3, pin & 1);
digitalWrite(15, HIGH);
Serial.println("LED on");
}[/s]
The above code doesn't work. The working code below might help to illustrate what I mean:
[s]#define CONTROL0 5
#define CONTROL1 4
#define CONTROL2 3
#define CONTROL3 2
int buttonPin1 = 0;
int buttonPin2 = 1;
int buttonPin3 = 2;
int ledPin1 = 0;
int ledPin2 = 1;
int ledPin3 = 2;
int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
void setup()
{
pinMode(CONTROL0, OUTPUT);
pinMode(CONTROL1, OUTPUT);
pinMode(CONTROL2, OUTPUT);
pinMode(CONTROL3, OUTPUT);
Serial.begin(9600);
pinMode(14, INPUT);
pinMode(15, OUTPUT);
pinMode(16, INPUT);
digitalWrite(14, HIGH);
digitalWrite(15, HIGH);
digitalWrite(16, HIGH);
}
void loop()
{
buttonState1 = digitalReadMUX(buttonPin1);
buttonState2 = digitalReadMUX(buttonPin2);
buttonState3 = digitalReadMUX(buttonPin3);
if (buttonState1) digitalWriteMUX(0);
if (buttonState2) digitalWriteMUX(1);
if (buttonState3) digitalWriteMUX(2);
digitalWrite(15, LOW);
}
int digitalReadMUX(int pin)
{
digitalWrite(CONTROL0, pin & 8 );
digitalWrite(CONTROL1, pin & 4 );
digitalWrite(CONTROL2, pin & 2 );
digitalWrite(CONTROL3, pin & 1 );
return (!digitalRead(14)); // pin 14 is the arduino pin multiplexed // expression might need a !
}
int digitalWriteMUX (int pin){
digitalWrite(CONTROL0, pin & 8);
digitalWrite(CONTROL1, pin & 4);
digitalWrite(CONTROL2, pin & 2);
digitalWrite(CONTROL3, pin & 1);
digitalWrite(15, HIGH);
}[/s]
I actually got it working just a few moments after I posted that. Here's the working code for anyone who's interested:
#define CONTROL0 5
#define CONTROL1 4
#define CONTROL2 3
#define CONTROL3 2
int buttonState[16];
void setup()
{
for(int i=0; i<3; i++){
buttonState[i] = 0;
}
pinMode(CONTROL0, OUTPUT);
pinMode(CONTROL1, OUTPUT);
pinMode(CONTROL2, OUTPUT);
pinMode(CONTROL3, OUTPUT);
Serial.begin(9600);
pinMode(14, INPUT);
pinMode(15, OUTPUT);
pinMode(16, INPUT);
digitalWrite(14, HIGH);
digitalWrite(15, HIGH);
digitalWrite(16, HIGH);
}
void loop()
{
for (int i=0; i < sizeof(buttonState); i++)
{
buttonState[i] = digitalReadMUX(i);
}
for (int i=0; i < sizeof(buttonState); i++)
{
if (buttonState[i]) digitalWriteMUX(i);
}
digitalWrite(15, LOW);
}
int digitalReadMUX(int pin)
{
digitalWrite(CONTROL0, pin & 8 );
digitalWrite(CONTROL1, pin & 4 );
digitalWrite(CONTROL2, pin & 2 );
digitalWrite(CONTROL3, pin & 1 );
return (!digitalRead(14)); // pin 14 is the arduino pin multiplexed // expression might need a !
}
int digitalWriteMUX (int pin){
digitalWrite(CONTROL0, pin & 8);
digitalWrite(CONTROL1, pin & 4);
digitalWrite(CONTROL2, pin & 2);
digitalWrite(CONTROL3, pin & 1);
digitalWrite(15, HIGH);
}
In summary: the above code reads the inputs of M0 and turns on a corresponding LED from M1.