Tutorial.ShftIn14 History

Hide minor edits - Show changes to markup

February 06, 2007, at 11:43 PM by Carlyn Maw -
Added line 94:
February 06, 2007, at 10:27 PM by Carlyn Maw -
Changed line 4 from:

// Date : 25 Oct, 2006 //

to:

// Date : 25 Jan, 2007 //

February 06, 2007, at 10:26 PM by Carlyn Maw -
Changed line 1 from:

//**************************************************************//

to:

[@//**************************************************************//

Added line 164:

@]

February 06, 2007, at 10:25 PM by Carlyn Maw -
Added lines 1-163:

//**************************************************************// // Name : shiftIn Example 1.4 // // Author : Carlyn Maw // // Date : 25 Oct, 2006 // // 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

byte lowcBitNum = 7; byte dBitNum = 6; byte eBitNum = 5; byte fBitNum = 4; byte gBitNum = 3; byte aBitNum = 2; byte bBitNum = 1; byte highcNum = 0;

boolean dBit;

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);

//You can get a bit state through the subfunction //written below by either...

//setting a boolean variable dBit = getBit(switchVar1, dBitNum);

  if (dBit) {
    Serial.println("D");
  }

//just validating a function (no new variable required)

 if (getBit(switchVar1, aBitNum)) {
    Serial.println("A");
  }

//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) {

//internal function setup

  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;

}

////// ----------------------------------------getBit boolean getBit(byte myVarIn, byte whatBit) {

  boolean bitState;
  bitState = myVarIn & (1 << whatBit);
  return bitState;

}

////// A little extra function... ////// ----------------------------------------setBit byte setBit(byte myVarIn, byte whatBit, boolean s) {

  boolean bitState;
  if (s) {
    myVarIn = myVarIn | (1 << whatBit);
  } else {
    myVarIn = myVarIn & ~(1 << whatBit);
  }
  return myVarIn;

}

Share