// Visual Micro is in vMicro>General>Tutorial Mode
// 
/*
    Name:       Chapter 9.1.ino
    Created:	30/04/2020 13:15:59
    Author:     JAOWENS-E6540\msn
*/


// HC595 ---->  Arduino
//  RCLK ---->  10
// SRCLK ---->   8
//   SER ---->   9
//   |OA ---->  11


// Defined pins
#define LATCH    6
#define DATA     7
#define CLOCK   8
#define ENABLE  9


void setup()
{
    pinMode(LATCH, OUTPUT);
    pinMode(DATA, OUTPUT);
    pinMode(CLOCK, OUTPUT);
    pinMode(ENABLE, OUTPUT);
    turnOff();
    delay(1000);
    turnOn();
    animate(5);
    blinkDot(5);
    delay(500);
}

void loop()
{
    for (int i = 0; i < 10; i++)
    {
        setDigit(i);
        delay(1000);
    }
    delay(100);
    flash(2);
    delay(500);
    animate(2);
    turnOff();
    delay(500);
    turnOn();
    
}

void flash(int count)
{
    for (int i = 0; i < count; i++)
    {
        sendData(B00000000);
        delay(50);
        sendData(B11111111);
        delay(50);
    }
}

void blinkDot(int count)
{
    for (int i = 0; i < 5; i++)
    {
        setDot(true);
        delay(50);
        setDot(false);
        delay(50);
    }
}

void animate(int count)
{
    for (int i = 0; i < count; i++)
    {
        sendData(B10000000);
        delay(10);
        sendData(B01000000);
        delay(10);
        sendData(B00100000);
        delay(10);
        sendData(B00010000);
        delay(10);
        sendData(B00001000);
        delay(10);
        sendData(B00000100);
        delay(10);
    }
}

void setDigit(unsigned int digit)
{
    unsigned int data = 0;
    if (digit >= 0 && digit <= 9)
    {
        switch (digit)
        {
        case 0:
            data = B11111100;
            break;
        case 1:
            data = B01100000;
            break;
        case 2:
            data = B11011010;
            break;
        case 3:
            data = B11110010;
            break;
        case 4:
            data = B01100110;
            break;
        case 5:
            data = B10110110;
            break;
        case 6:
            data = B10111110;
            break;
        case 7:
            data = B11100000;
            break;
        case 8:
            data = B11111110;
            break;
        case 9:
            data = B11110110;
            break;
        default:
            data = B00000000;
        }
    }
    sendData(data);
}

void setDot(boolean status)
{
    if (status == true) sendData(B00000001);
    else sendData(B00000000);
}

void turnOn(void)
{
    digitalWrite(ENABLE, LOW);
}

void turnOff(void)
{
    //sendData(B00000000);
    digitalWrite(ENABLE, HIGH);
}
// Send 8 bit sequence to shift register
void sendData(unsigned int data)
{
  data = ~data;
    boolean bit = false;

    for (int i = 0; i < 8; i++)
    {
        bit = data & B00000001;
        digitalWrite(DATA, bit);
        delay(1);
        digitalWrite(CLOCK, HIGH);
        delay(1);
        digitalWrite(CLOCK, LOW);
        delay(1);
        data = data >> 1;
        __asm("nop");
    }
    digitalWrite(LATCH, HIGH);
    delay(1);
    digitalWrite(LATCH, LOW);
}
74HC595