]> git.piffa.net Git - sketchbook_andrea/blobdiff - hardware/shift_register/shift_register_custom_pattern_4/shift_register_custom_pattern_4.ino
clean up
[sketchbook_andrea] / hardware / shift_register / shift_register_custom_pattern_4 / shift_register_custom_pattern_4.ino
diff --git a/hardware/shift_register/shift_register_custom_pattern_4/shift_register_custom_pattern_4.ino b/hardware/shift_register/shift_register_custom_pattern_4/shift_register_custom_pattern_4.ino
new file mode 100644 (file)
index 0000000..c5e1da7
--- /dev/null
@@ -0,0 +1,136 @@
+
+/*
+  Shift Register Example
+ Turning on the outputs of a 74HC595 using an array
+ Hardware:
+ * 74HC595 shift register
+ * LEDs attached to each of the outputs of the shift register
+ */
+//Pin connected to ST_CP of 74HC595
+int latchPin = 8;
+//Pin connected to SH_CP of 74HC595
+int clockPin = 12;
+////Pin connected to DS of 74HC595
+int dataPin = 11;
+
+//holders for infromation you're going to pass to shifting function
+byte data;
+byte dataArray[10];
+
+void setup() {
+  //set pins to output because they are addressed in the main loop
+  pinMode(latchPin, OUTPUT);
+  Serial.begin(9600);
+
+  //Arduino doesn't seem to have a way to write binary straight into the code
+  //so these values are in HEX.  Decimal would have been fine, too.
+  dataArray[0] = 0xFF; //11111111
+  dataArray[1] = 0xFE; //11111110
+  dataArray[2] = 0xFC; //11111100
+  dataArray[3] = 0xF8; //11111000
+  dataArray[4] = 0xF0; //11110000
+  dataArray[5] = 0xE0; //11100000
+  dataArray[6] = 0xC0; //11000000
+  dataArray[7] = 0x80; //10000000
+  dataArray[8] = 0x00; //00000000
+  dataArray[9] = 0x38; //11100000
+
+    //function that blinks all the LEDs
+  //gets passed the number of blinks and the pause time
+  blinkAll_2Bytes(2,500);
+}
+
+void loop() {
+
+  for (int j = 0; j < 10; j++) {
+    //load the light sequence you want from array
+    data = dataArray[j];
+    //ground latchPin and hold low for as long as you are transmitting
+    digitalWrite(latchPin, 0);
+    //move 'em out
+    shiftOut(dataPin, clockPin, data);
+    //return the latch pin high to signal chip that it
+    //no longer needs to listen for information
+    digitalWrite(latchPin, 1);
+    delay(300);
+  }
+}
+
+
+
+// the heart of the program
+void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
+  // This shifts 8 bits out MSB first,
+  //on the rising edge of the clock,
+  //clock idles low
+
+  //internal function setup
+  int i=0;
+  int pinState;
+  pinMode(myClockPin, OUTPUT);
+  pinMode(myDataPin, OUTPUT);
+
+  //clear everything out just in case to
+  //prepare shift register for bit shifting
+  digitalWrite(myDataPin, 0);
+  digitalWrite(myClockPin, 0);
+
+  //for each bit in the byte myDataOut�
+  //NOTICE THAT WE ARE COUNTING DOWN in our for loop
+  //This means that %00000001 or "1" will go through such
+  //that it will be pin Q0 that lights.
+  for (i=7; i>=0; i--)  {
+    digitalWrite(myClockPin, 0);
+
+    //if the value passed to myDataOut and a bitmask result
+    // true then... so if we are at i=6 and our value is
+    // %11010100 it would the code compares it to %01000000
+    // and proceeds to set pinState to 1.
+    if ( myDataOut & (1<<i) ) {
+      pinState= 1;
+    }
+    else { 
+      pinState= 0;
+    }
+
+    //Sets the pin to HIGH or LOW depending on pinState
+    digitalWrite(myDataPin, pinState);
+    //register shifts bits on upstroke of clock pin  
+    digitalWrite(myClockPin, 1);
+    //zero the data pin after shift to prevent bleed through
+    digitalWrite(myDataPin, 0);
+  }
+
+  //stop shifting
+  digitalWrite(myClockPin, 0);
+}
+
+
+//blinks the whole register based on the number of times you want to
+//blink "n" and the pause between them "d"
+//starts with a moment of darkness to make sure the first blink
+//has its full visual effect.
+void blinkAll_2Bytes(int n, int d) {
+  digitalWrite(latchPin, 0);
+  shiftOut(dataPin, clockPin, 0);
+  shiftOut(dataPin, clockPin, 0);
+  digitalWrite(latchPin, 1);
+  delay(200);
+  for (int x = 0; x < n; x++) {
+    digitalWrite(latchPin, 0);
+    shiftOut(dataPin, clockPin, 255);
+    shiftOut(dataPin, clockPin, 255);
+    digitalWrite(latchPin, 1);
+    delay(d);
+    digitalWrite(latchPin, 0);
+    shiftOut(dataPin, clockPin, 0);
+    shiftOut(dataPin, clockPin, 0);
+    digitalWrite(latchPin, 1);
+    delay(d);
+  }
+}
+
+
+