Hello,
I'm building a 5 button controller for a larger project, and I've encountered a bit of a snafu using the tutorial on using shift registers located at https://www.arduino.cc/en/Tutorial/ShftIn11. To the best of my observation it basically cuts off any commands given after the final command of "return myDataIn;"
I've set the circuit up exactly as described in the upper portion of https://www.arduino.cc/en/Tutorial/ShiftIn, using all 8 buttons and the correct resistors, in addition to trying it with only the 5 I need and the rest just pulled down without a button. I have also attempted to comment that line out, which throws an error, and to put that entire section of code in it's very own braces, which also creates an error. In addition I tried removing everything from the declared main loop down, which seemed to allow it to still function somewhat, but it produced random results
I understand that the return function can be used to go back to the beginning early, and I think that's what's happening here. I understand that I can overcome this issue by simply placing this bit of code at the very end of the larger project, but the why is bothering me. Why write a program to read buttons the build it so that you can do nothing with those buttons afterward? Also is there a way to contain this return so I don't have to move this to the end of my program.
I'm including a slight modification of the tutorial code which will display the problem on the serial monitor. Look for the last line that says this line does not work.
//**************************************************************//
// Name : shiftIn Example 1.1 //
// Author : Carlyn Maw //
// Date : 25 Jan, 2007 //
// Version : 1.0 //
// Notes : Code for using a CD4021B Shift Register //
// : //
//****************************************************************
//define where your pins are
int latchPin = 8;
int dataPin = 9;
int clockPin = 7;
//Define variables to hold the data
//for shift register.
//starting with a non-zero numbers can help
//troubleshoot
byte switchVar1 = 72; //01001000
void setup() {
//start serial
Serial.begin(9600);
//define pin modes
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, INPUT);
}
void loop() {
//Pulse the latch pin:
//set it to 1 to collect parallel data
digitalWrite(latchPin,1);
//set it to 1 to collect parallel data, wait
delayMicroseconds(20);
//set it to 0 to transmit data serially
digitalWrite(latchPin,0);
//while the shift register is in serial mode
//collect each shift register into a byte
//the register attached to the chip comes in first
switchVar1 = shiftIn(dataPin, clockPin);
//Print out the results.
//leading 0's at the top of the byte
//(7, 6, 5, etc) will be dropped before
//the first pin that has a high input
//reading
Serial.println(switchVar1, BIN);
//white space
Serial.println("-------------------");
//delay so all these print satements can keep up.
delay(500);
}
//------------------------------------------------end main loop
////// ----------------------------------------shiftIn function
///// just needs the location of the data pin and the clock pin
///// it returns a byte with each bit in the byte corresponding
///// to a pin on the shift register. leftBit 7 = Pin 7 / Bit 0= Pin 0
byte shiftIn(int myDataPin, int myClockPin) {
int i;
int temp = 0;
int pinState;
byte myDataIn = 0;
pinMode(myClockPin, OUTPUT);
pinMode(myDataPin, INPUT);
//we will be holding the clock pin high 8 times (0,..,7) at the
//end of each time through the for loop
//at the begining of each loop when we set the clock low, it will
//be doing the necessary low to high drop to cause the shift
//register's DataPin to change state based on the value
//of the next bit in its serial information flow.
//The register transmits the information about the pins from pin 7 to pin 0
//so that is why our function counts down
for (i=7; i>=0; i--)
{
digitalWrite(myClockPin, 0);
delayMicroseconds(0.2);
temp = digitalRead(myDataPin);
if (temp) {
pinState = 1;
//set the bit to 0 no matter what
myDataIn = myDataIn | (1 << i);
}
else {
//turn it off -- only necessary for debuging
//print statement since myDataIn starts as 0
pinState = 0;
}
//Debuging print statements
//Serial.print(pinState);
//Serial.print(" ");
//Serial.println (dataIn, BIN);
digitalWrite(myClockPin, 1);
}
//debuging print statements whitespace
//Serial.println();
//Serial.println(myDataIn, BIN);
return myDataIn;
Serial.println ("this line does not work");
}