Some of you may recognize me from the thread about interfacing an HD44780 display and DS18S20 temperature sensors. It was a great learning experience! Thanks to everyone that helped me get it working
For my next project, Ive picked up some CC 7-seg displays and some 74HC595 shift registers. Id like to do the same thing (read the temperature) and display it to the 7-seg's (I started with the LCD because saying lcd.write(temp); was easier than learning how to shift data ;)).
Ive connected ST_CP to pin 8, SH_CP to pin 12, and DS to pin 11. I have Q0 connected to the 'a' segment (I dont know if I labelled properly, but I started with 'a' being the top segment, and 'b' being the top-right segment, and continuing on in a clockwise rotation) all the way up to 'g' connected to Q7.
Im using the following code from the shiftOut tutorial, modified a bit (explained later):
//**************************************************************//
// Name : shiftOutCode, Predefined Array Style //
// Author : Carlyn Maw, Tom Igoe //
// Date : 25 Oct, 2006 //
// Version : 1.0 //
// Notes : Code for using a 74HC595 Shift Register //
// : to count from 0 to 255 //
//****************************************************************
//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[8];
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] = 0x00; // off
dataArray[1] = 0x01; // a
dataArray[2] = 0x02; // b
dataArray[3] = 0x04; // c
dataArray[4] = 0x08; // d
dataArray[5] = 0x10; // e
dataArray[6] = 0x20; // f
dataArray[7] = 0x40; // g
//function that blinks all the LEDs
//gets passed the number of blinks and the pause time
blinkAll(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(1000);
}
}
// 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[ch65533]
//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(int n, int d) {
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, 0);
digitalWrite(latchPin, 1);
delay(200);
for (int x = 0; x < n; x++) {
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, 255);
digitalWrite(latchPin, 1);
delay(d);
digitalWrite(latchPin, 0);
shiftOut(dataPin, clockPin, 0);
digitalWrite(latchPin, 1);
delay(d);
}
}
Ive modified the array at the start to contain the different segments, and how I have them hooked up:
Qx - seg -- bin -- dec - hex
Q0 - a - 00000001 - 01 - 01
Q1 - b - 00000010 - 02 - 02
Q2 - c - 00000100 - 04 - 04
Q3 - d - 00001000 - 08 - 08
Q4 - e - 00010000 - 16 - 10
Q5 - f - 00100000 - 32 - 20
Q6 - g - 01000000 - 64 - 40
Q7 - open -----------------
And so far, its working great! However, I plan on having four 7-seg displays per sensor (one per number, and two more at the end hard-wired to "°C"). Does this mean I will need four shift registers per sensor? I picked up four just in case (and if I dont need them Im sure I will use them in the future). What is the best way for me to connect all four displays? Other than the chip count, shift registers seem like a good way as I only need three wires per group of display. Im not looking for blocks of code at this point (however, if you have any I would definately appreciate them!); Im looking for ideas and suggestions. Please keep in mind that I do have a small programming background, but Im more of a hardware guy (Im in Uni for Electrical Engineering Tech), so you will most likely need to be basic with me for a little longer when it comes to code, until I catch on Thanks!