Go Down

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

josh97531

Feb 07, 2012, 07:28 pm Last 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 matrix
int 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 matrix
int rows[8] = {pins[9], pins[14], pins[8], pins[12], pins[1], pins[7], pins[2], pins[5]};

#define DELAY 0
#define SIZE 8
extern 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 routine
void 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)
}

CrossRoads

Follow its datasheet:

http://www.ti.com/lit/ds/symlink/sn74hc164.pdf

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.

josh97531


Follow its datasheet:

http://www.ti.com/lit/ds/symlink/sn74hc164.pdf

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.

ok what chip should i use and how can i change the code for that

Techone

Well... use a 74HC595. It got a latch, a clock, enable, reset and it got 9 output. The code is : shiftOut(). Look it up.

Go Up