#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif
//create custom characters
uint8_t topBlock[8]  = {0x0E,0x0E,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
uint8_t middleBlock[8] = {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
uint8_t blankBlock[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uint8_t colon[8] = {0x00,0x00,0x0E,0x0E,0x1F,0x1F,0x00,0x00};
uint8_t eightTop[8]={0x00,0x00,0x00,0x00,0x0E,0x0E,0x1F,0x1F};
uint8_t eightBot[8]={0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00};


//create the layout of each digit (4x4 of custom characters)
uint8_t num0[16] = {2,2,2,2,
                    1,0,0,1,
                    1,0,0,1,
                    1,1,1,1};
uint8_t num1[16] ={0,0,0,2,
                   0,0,2,1,
                   0,0,0,1,
                   0,0,0,1};
uint8_t num2[16] ={2,2,2,2,
                   0,0,4,1,
                   2,1,5,0,
                   1,1,1,1};                  
uint8_t num3[16] ={2,2,2,2,
                   0,4,4,1,
                   0,5,5,1,
                   2,1,1,1};
uint8_t num4[16] ={2,0,0,2,
                   1,0,0,1,
                   1,2,2,1,
                   0,0,0,1};
uint8_t num5[16] ={2,2,2,2,
                   1,4,4,0,
                   0,5,5,2,
                   2,1,1,1};
uint8_t num6[16] ={2,0,0,0,
                   1,2,2,2,
                   1,0,0,1,
                   1,2,2,1};
uint8_t num7[16] ={2,2,2,2,
                   0,0,4,1,
                   0,2,5,0,
                   0,1,0,0};  
uint8_t num8[16] ={2,2,2,2,
                   1,4,4,1,
                   1,5,5,1,
                   1,2,2,1};
uint8_t num9[16] ={2,2,2,2,
                   1,0,0,1,
                   1,2,2,1,
                   0,0,0,1};                                           
                    
  
LiquidCrystal_I2C lcd(0x27,20,4); 

void setup()
{
  lcd.init();                      // initialize the lcd 
  lcd.backlight();
  
  lcd.createChar(2, topBlock);
  lcd.createChar(1, middleBlock);
  lcd.createChar(0, blankBlock);
  lcd.createChar(3, colon);
  lcd.createChar(4, eightTop);
  lcd.createChar(5, eightBot);

  lcd.home();
  
  
}

void loop()
{
  printNumber(0,1);
  delay(2000);
  printNumber(1,1);
  delay(2000);
}

void printNumber(uint8_t num, uint8_t posn) {
 //allow the digit to be placed in the three positions across the screen, the first spot is a skinny version of number 1
 uint8_t digitOffset = 0;
  if (posn == 1) digitOffset = 4;
  else if (posn == 2) digitOffset = 11;
  else if (posn == 3) digitOffset = 16;
  
  if (num == 0) {
    lcd.setCursor(digitOffset,0);
    for (uint8_t i = 0; i < 4; i++) {
      lcd.printByte(num0[i]);
    }
    lcd.setCursor(digitOffset,1);
    for (uint8_t i = 4; i < 8; i++) {
      lcd.printByte(num0[i]);
    }
    lcd.setCursor(digitOffset,2);
    for (uint8_t i = 8; i < 12; i++) {
      lcd.printByte(num0[i]);
    }
    lcd.setCursor(digitOffset,3);
    for (uint8_t i = 12; i < 16; i++) {
      lcd.printByte(num0[i]);
    }
  }
  else if (num == 1) {
    lcd.setCursor(digitOffset,0);
    for (uint8_t i = 0; i < 4; i++) {
      lcd.printByte(num1[i]);
    }
    lcd.setCursor(digitOffset,1);
    for (uint8_t i = 4; i < 8; i++) {
      lcd.printByte(num1[i]);
    }
    lcd.setCursor(digitOffset,2);
    for (uint8_t i = 8; i < 12; i++) {
      lcd.printByte(num1[i]);
    }
    lcd.setCursor(digitOffset,3);
    for (uint8_t i = 12; i < 16; i++) {
      lcd.printByte(num1[i]);
    }
  }
}