Go Down

### Topic: shift registers (Read 958 times)previous topic - next topic

#### josh97531

##### Feb 07, 2012, 07:28 pmLast Edit: Feb 07, 2012, 08:16 pm by josh97531 Reason: 1
how would I wire up this circuit with a shift register preferably the 74HC164 and how would i change the code for it
http://arduino.cc/playground/Main/DirectDriveLEDMatrix
Code: [Select]
`/* * Conway's "Life" * * Adapted from the Life example * on the Processing.org site * * Needs FrequencyTimer2 library */#include <FrequencyTimer2.h>byte col = 0;byte leds[8][8];// pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1)int pins[17]= {-1, 5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};// col[xx] of leds = pin yy on led matrixint cols[8] = {pins[13], pins[3], pins[4], pins[10], pins[06], pins[11], pins[15], pins[16]};// row[xx] of leds = pin yy on led matrixint rows[8] = {pins[9], pins[14], pins[8], pins[12], pins[1], pins[7], pins[2], pins[5]};#define DELAY 0#define SIZE 8extern byte leds[SIZE][SIZE];byte world[SIZE][SIZE][2];long density = 50;void setup() {  setupLeds();  randomSeed(analogRead(5));  for (int i = 0; i < SIZE; i++) {    for (int j = 0; j < SIZE; j++) {      if (random(100) < density) {        world[i][j][0] = 1;      }      else {        world[i][j][0] = 0;      }      world[i][j][1] = 0;    }  }}void loop() {  // Display current generation  for (int i = 0; i < SIZE; i++) {    for (int j = 0; j < SIZE; j++) {      leds[i][j] = world[i][j][0];    }  }  delay(DELAY);  // Birth and death cycle  for (int x = 0; x < SIZE; x++) {    for (int y = 0; y < SIZE; y++) {      // Default is for cell to stay the same      world[x][y][1] = world[x][y][0];      int count = neighbours(x, y);      if (count == 3 && world[x][y][0] == 0) {        // A new cell is born        world[x][y][1] = 1;      }      if ((count < 2 || count > 3) && world[x][y][0] == 1) {        // Cell dies        world[x][y][1] = 0;      }    }  }  // Copy next generation into place  for (int x = 0; x < SIZE; x++) {    for (int y = 0; y < SIZE; y++) {      world[x][y][0] = world[x][y][1];    }  }}int neighbours(int x, int y) { return world[(x + 1) % SIZE][y][0] +         world[x][(y + 1) % SIZE][0] +         world[(x + SIZE - 1) % SIZE][y][0] +         world[x][(y + SIZE - 1) % SIZE][0] +         world[(x + 1) % SIZE][(y + 1) % SIZE][0] +         world[(x + SIZE - 1) % SIZE][(y + 1) % SIZE][0] +         world[(x + SIZE - 1) % SIZE][(y + SIZE - 1) % SIZE][0] +         world[(x + 1) % SIZE][(y + SIZE - 1) % SIZE][0]; }void setupLeds() {  // sets the pins as output  for (int i = 1; i <= 16; i++) {    pinMode(pins[i], OUTPUT);  }  // set up cols and rows  for (int i = 1; i <= 8; i++) {    digitalWrite(cols[i - 1], LOW);  }  for (int i = 1; i <= 8; i++) {    digitalWrite(rows[i - 1], LOW);  }  clearLeds();  // Turn off toggling of pin 11 and 3  FrequencyTimer2::disable();  // Set refresh rate (interrupt timeout period)  FrequencyTimer2::setPeriod(2000);  // Set interrupt routine to be called  FrequencyTimer2::setOnOverflow(display);}void clearLeds() {  // Clear display array  for (int i = 0; i < 8; i++) {    for (int j = 0; j < 8; j++) {      leds[i][j] = 0;    }  }}// Interrupt routinevoid display() {  digitalWrite(cols[col], LOW);  // Turn whole previous column off  col++;  if (col == 8) {    col = 0;  }  for (int row = 0; row < 8; row++) {    if (leds[col][7 - row] == 1) {      digitalWrite(rows[row], LOW);  // Turn on this led    }    else {      digitalWrite(rows[row], HIGH); // Turn off this led    }  }  digitalWrite(cols[col], HIGH); // Turn whole column on at once (for equal lighting times)}`

#1
##### Feb 07, 2012, 10:16 pm

With 4 mA output drive it won't be very bright. And without the output stage latches or an output enable pin all the outputs will appear to flicker as you load in data.
Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

#2