/*
Arduino code for Individual control over each pin
Support for 40+ 74HC595 8 bit shift registers
http://bildr.org/2011/02/74hc595/
*/
#define DATA_PIN 8 // Pin connected to DS of 74HC595
#define LATCH_PIN 9 // Pin connected to STCP of 74HC595
#define CLOCK_PIN 10 // Pin connected to SHCP of 74HC595
// How many of the shift registers
#define NUM_SHIFT_REGS 2
const uint8_t numOfRegisterPins = NUM_SHIFT_REGS * 8;
bool registers[numOfRegisterPins];
bool pin_seg[8];
void clearRegisters();
void writeRegisters();
void send_Num(int digit);
void seg_pattern(unsigned int digit);
void setup() {
pinMode(DATA_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
clearRegisters();
writeRegisters();
}
bool toggle = false;
void loop()
{
send_Num(0);
writeRegisters();
// toggle = !toggle;
delay(1000);
}
void clearRegisters() {
// Reset all register pins
for (int i = numOfRegisterPins - 1; i >= 0; i--) {
registers[i] = LOW;
}
}
void setRegisterPin(int index, int value) {
// Set an individual pin HIGH or LOW
registers[index] = value;
}
void writeRegisters() {
// Set and display registers
digitalWrite(LATCH_PIN, LOW);
for (int i = numOfRegisterPins - 1; i >= 0; i--) {
digitalWrite(CLOCK_PIN, LOW);
digitalWrite(DATA_PIN, registers[i]);
digitalWrite(CLOCK_PIN, HIGH);
}
digitalWrite(LATCH_PIN, HIGH);
}
void seg_pattern(unsigned int digit)
{
switch(digit)
{
case 0 : pin_seg[0] = 1;pin_seg[1] = 1;pin_seg[2] = 1;pin_seg[3] = 1;pin_seg[4] = 1;pin_seg[5] = 1;pin_seg[6] = 0;pin_seg[7] = 0; break;
case 1 : pin_seg[0] = 0;pin_seg[1] = 1;pin_seg[2] = 1;pin_seg[3] = 0;pin_seg[4] = 0;pin_seg[5] = 0;pin_seg[6] = 0;pin_seg[7] = 0; break;
case 2 : pin_seg[0] = 1;pin_seg[1] = 1;pin_seg[2] = 0;pin_seg[3] = 1;pin_seg[4] = 1;pin_seg[5] = 0;pin_seg[6] = 1;pin_seg[7] = 0; break;
case 3 : pin_seg[0] = 1;pin_seg[1] = 1;pin_seg[2] = 1;pin_seg[3] = 1;pin_seg[4] = 0;pin_seg[5] = 0;pin_seg[6] = 1;pin_seg[7] = 0; break;
case 4 : pin_seg[0] = 0;pin_seg[1] = 1;pin_seg[2] = 1;pin_seg[3] = 0;pin_seg[4] = 0;pin_seg[5] = 1;pin_seg[6] = 1;pin_seg[7] = 0; break;
case 5 : pin_seg[0] = 1;pin_seg[1] = 0;pin_seg[2] = 1;pin_seg[3] = 1;pin_seg[4] = 0;pin_seg[5] = 1;pin_seg[6] = 1;pin_seg[7] = 0; break;
case 6 : pin_seg[0] = 1;pin_seg[1] = 0;pin_seg[2] = 1;pin_seg[3] = 1;pin_seg[4] = 1;pin_seg[5] = 1;pin_seg[6] = 1;pin_seg[7] = 0; break;
case 7 : pin_seg[0] = 1;pin_seg[1] = 1;pin_seg[2] = 1;pin_seg[3] = 0;pin_seg[4] = 0;pin_seg[5] = 0;pin_seg[6] = 0;pin_seg[7] = 0; break;
case 8 : pin_seg[0] = 1;pin_seg[1] = 1;pin_seg[2] = 1;pin_seg[3] = 1;pin_seg[4] = 1;pin_seg[5] = 1;pin_seg[6] = 1;pin_seg[7] = 0; break;
case 9 : pin_seg[0] = 1;pin_seg[1] = 1;pin_seg[2] = 1;pin_seg[3] = 0;pin_seg[4] = 0;pin_seg[5] = 1;pin_seg[6] = 1;pin_seg[7] = 0; break;
}
}
void send_Num(int digit)
{
int ones_digit, tens_digit, count;
do {
digit /= 10;
++count;
} while (digit != 0);
if(digit==1)
{
ones_digit = digit%10 ;
tens_digit = digit%100 ;
for(int i = 0; i<8; i++)
{
registers[i] = 0;
}
seg_pattern(ones_digit);
for(int i = 8; i<16; i++)
{
registers[i] = pin_seg[i-8];
}
}
else if (digit = 2)
{
seg_pattern(ones_digit);
for(int i = 0; i<8; i++)
{
registers[i] = pin_seg[i];
}
seg_pattern(tens_digit);
for(int i = 8; i<16; i++)
{
registers[i] = pin_seg[i-8];
}
}
}