//**************************************************************//
|
|
// Name : shiftIn Example 1.1 //
|
|
// Author : Carlyn Maw //
|
|
// Date : 25 Jan, 2007 //
|
|
// Version : 1.0 //
|
|
// Notes : Code for using a CD4021B Shift Register //
|
|
// : //
|
|
//****************************************************************
|
|
|
|
|
|
//This tut from arduino
|
|
// doesn't work.
|
|
|
|
/* IO Definitions ProCAT Flash*/
|
|
|
|
//#define DATA_IN 4
|
|
//#define CLK 5
|
|
//#define LATCH_EN 6
|
|
|
|
//define where your pins are
|
|
int dataPin = 4;
|
|
int clockPin = 5;
|
|
int latchPin = 6;
|
|
|
|
//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;
|
|
double 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;
|
|
}
|