What you need:
1 - Breadboard
1 - Power Source - 7805 or some other 5v source
1 - ATtiny13 and a way to program it ( I'm using the AVRISP mkII with AVRStudio 4.17 w/ WinAVR)
1 - 74HC595 Shift Register
1 - 100uF cap
1 - 0.1uF cap
1 - 10K resistor
8 - LEDs
8 - 470ohm resistors
~15 - hookup wires
What is a Shift Register?
Serial to Parallel Shift Registers are ICs that allow "serial" data to be clocked in on 1 pin and stack up in a register which is output on 8 parallel pins (in the case of a 8-bit shift register). As data is clocked in, it shifts all the other bits over one position with the end one falling off. Common shift registers are 74HC164 and 74HC595.
There's a couple of good online tutorials about these with animations.
www.eelab.usyd.edu.au/digital_tutorial/part2/register01.html
The 595 has another feature which is cool. It's called a latch. It allows the outputs to show the current bits which have been latched in the Latch Register while new data is shifted into the Shift Register. Then toggle the latch pin and the new data is copied into the Latch Register.
Here's a link to the 74HC595 Datasheet:
www.onsemi.com/pub_link/Collateral/MC74HC595A-D.PDF
Check Out a Youtube Video of the Circuit in Action
Remove these ads by
Signing UpStep 1: Get Familiar with the 595
The pin out goes like this:
Pin 1 - Output B - source for LED (+)
Pin 2 - Output C - source for LED (+)
Pin 3 - Output D - source for LED (+)
Pin 4 - Output E - source for LED (+)
Pin 5 - Output F - source for LED (+)
Pin 6 - Output G - source for LED (+)
Pin 7 - Output H - source for LED (+)
Pin 8 - GND
Pin 9 - Serial Output - Carries Value from Output H to Data Pin (pin 14) of another 74HC595 to create a chain of SR's.
Pin 10 - Shift Register RESET - Active LOW clears data in Shift Register, Latch Register is no affected.
Pin 11 - Shift Clock - LOW to HI transition shifts in data (0 or 1) from the Data Pin (pin 14). This can be toggled very fast in applications where you want a fast refresh rate like displays. I think you can toggle it on the order of 1000Hz +
Pin 12 - Latch Clock - LOW to HI transition latches the SR data to the outputs - The latch in our case will be triggered after every 8th bit is shifted in.
Pin 13 - Output Enable - Active LOW - Allows data in the Latch Register to show on the display. Typically this will be kept low, so you could just hard-wire it, but I have the AVR setup to control it.
Pin 14 - Serial Data In (Data Pin) - Don't be scared by the word "serial". It just means digital 1 or 0 on a single pin. This is where the AVR will feed in the bits
Pin 15 - Output A - source for LED (+) - It's a weird spot for it but it works
Pin 16 - VCC 2.0-7.0 VDC






































Visit Our Store »
Go Pro Today »




Just a bad pin.
When running
I put a delay in the loop of option 1 and only see the leds 1 to 7 blink but not led 8.
Can't figure out what I'm doing wrong.
but my compiler is Basic may be you can tech-me how i can write program
by basic
thanks
There's a good discussion about this at this link:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1248563533
I hope this helps. Thanks
Thanks!
I understand what you are getting at with the application for a dot matrix. You want to individually clock in the bits of an 8 bit byte. This could be in bin or hex, it makes no difference.
I have done this before for using a 595 to drive a 4 digit multiplexed 7 segment display. Here's the excerpt of code I used to take the byte (in hex in my case) associated with the digit I wanted to display and get it clocked into the 595 without using an array.
It uses whats called a bitmask. I describe it in the comments of the code below. I tried to be very thorough because I know how hard it is looking at someone elses code and trying to figure out what's going on. Hopefully this is helpful for you. Thanks for the feedback - roznerd
------------------------------------------------------------------------------------------------
for (k=0; k<8; k++)
// you have to loop 8 times to clock in all 8 bits in the byte to display, makes sense.
{
//Your byte will replace the "digit" byte. if the 7th bit of the byte "digit" is 1 then set Data pin high for 595 and toggle clock to shift it in. If the 7th bit of the byte "digit" is not 1 (i.e. 0) then set Data pin low and toggle the 595 clock pin.
if (digit & 0x80)
// this is the bit mask, by AND-ing the 8-bit byte you want to display with a "mask" that overlays all bits except the 7th bit (0x80 = 10000000) you get to differentiate whether the 7th bit is a 1 or 0 by the outcome of the AND. IF 1 & 1 = 1 (data pin high) ELSE 0 & 1 = 0 (data pin low).
Then you shift the bits in your byte to the left << 1 position and compare again.
{
Data_H; // defined in header to set data pin high
Shift_Clk_H; // defined in header to set shift pin high
Shift_Clk_L; // defined in header to set shift pin low
}
else
{
Data_L; // defined in header to set data pin low
Shift_Clk_H;
Shift_Clk_L;
}
digit = digit << 1; // shift the bits in your byte to the left 1 position
} // end for
// after all 8 bits in the byte "digit" are clocked in, toggle the latch to show on the display
Latch_Clk_H;
Latch_Clk_L;
Out of curiosity, why ground Pin 9 (serial data out / QH')? If the output is of QH is high (and by extension Pin 9), you're shorting a high output to ground.
Another version of the datasheet (for HC595, not HC595A, http://focus.ti.com/lit/ds/symlink/sn74hc595.pdf) lists a clamping current of +/- 20 mA max which I suspect is saving the chip from blowing. It would be safer to either leave this output floating in this application or put a resistor to ground.