/* How to control a KEM-18011-BSR-2L common anode LED digit Mark R. Strijbos 2016/05/29 Hardware: * UNL2803 8 channel Darlington driver * 74HC595 shift register * large LED digit */ #define SEGMENT_A 1 #define SEGMENT_B 2 #define SEGMENT_C 4 #define SEGMENT_D 8 #define SEGMENT_E 16 #define SEGMENT_F 32 #define SEGMENT_G 64 // using a pre-defined lookup table saves time and memory! const byte digits_lot[] = { SEGMENT_A | SEGMENT_B | SEGMENT_C | SEGMENT_D | SEGMENT_E | SEGMENT_F, SEGMENT_B | SEGMENT_C, SEGMENT_A | SEGMENT_B | SEGMENT_D | SEGMENT_E | SEGMENT_G, SEGMENT_A | SEGMENT_B | SEGMENT_C | SEGMENT_D | SEGMENT_G, SEGMENT_B | SEGMENT_C | SEGMENT_F | SEGMENT_G, SEGMENT_A | SEGMENT_C | SEGMENT_D | SEGMENT_F | SEGMENT_G, SEGMENT_A | SEGMENT_C | SEGMENT_D | SEGMENT_E | SEGMENT_F | SEGMENT_G, SEGMENT_A | SEGMENT_B | SEGMENT_C, SEGMENT_A | SEGMENT_B | SEGMENT_C | SEGMENT_D | SEGMENT_E | SEGMENT_F | SEGMENT_G, SEGMENT_A | SEGMENT_B | SEGMENT_C | SEGMENT_F | SEGMENT_G, }; // NOTE: you can change these digital pin numbers to your preference //Pin connected to ST_CP of 74HC595 const int latchPin = 10; // Pin connected to SH_CP of 74HC595 const int clockPin = 12; ////Pin connected to DS of 74HC595 const int dataPin = 11; void setup() { // set digital pins to output pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); blinkAll( 3, 50 ); } void loop() { short j; shiftOut( 0 ); // clears the digit for( j = 0; j < 10; j++ ) { print_digit( j ); delay(500); } delay(500); for( j = 9; j >= 0; j-- ) { print_digit( j ); delay(100); } } void print_digit( byte digit ) { shiftOut( digits_lot[ digit ] ); } // the heart of the program void shiftOut(byte dataOut) { // 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; digitalWrite(latchPin, 0); //clear everything out just in case to digitalWrite(dataPin, 0); digitalWrite(clockPin, 0); //for each bit in the byte dataOut� //NOTICE THAT WE ARE COUNTING DOWN in our for loop //This means that %00000001 or "1" will go through such //that pin Q0 will be high and SEGMENT_A lights up. for (i=7; i>=0; i--) { digitalWrite(clockPin, 0); //if the value passed to dataOut 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 ( dataOut & (1<