//define rows and columns: #define ROW1_ON PORTD |= B10000 #define ROW1_OFF PORTD &= ~B10000 #define ROW2_ON PORTD |= B100000 #define ROW2_OFF PORTD &= ~B100000 #define ROW3_ON PORTD |= B1000000 #define ROW3_OFF PORTD &= ~B1000000 #define ROW4_ON PORTD |= B10000000 #define ROW4_OFF PORTD &= ~B10000000 #define ROW5_ON PORTB |= B1 #define ROW5_OFF PORTB &= ~B1 #define ROW6_ON PORTB |= B100 #define ROW6_OFF PORTB &= ~B100 #define ROW7_ON PORTB |= B100000 #define ROW7_OFF PORTB &= ~B100000 #define ROW8_ON PORTB |= B1000000 #define ROW8_OFF PORTB &= ~B1000000 #define ROW9_ON PORTB |= B10000000 #define ROW9_OFF PORTB &= ~B10000000 #define COL1_ON PORTC &= ~B1 #define COL1_OFF PORTC |= B1 #define COL2_ON PORTC &= ~B10 #define COL2_OFF PORTC |= B10 #define COL3_ON PORTC &= ~B100 #define COL3_OFF PORTC |= B100 #define COL4_ON PORTC &= ~B1000 #define COL4_OFF PORTC |= B1000 #define COL5_ON PORTC &= ~B10000 #define COL5_OFF PORTC |= B10000 #define COL6_ON PORTC &= ~B100000 #define COL6_OFF PORTC |= B100000 #define COL7_ON PORTB &= ~B10000 #define COL7_OFF PORTB |= B10000 #define COL8_ON PORTD &= ~B100 #define COL8_OFF PORTD |= B100 #define COL9_ON PORTD &= ~B1000 #define COL9_OFF PORTD |= B1000 #define DELAY1 200 //this should be replaced by sleep mode int second = 0, minute = 0, hour = 0, day = 1, date = 1, month = 1, year = 2019; //set Your time. Support for buttons should be added byte b = 0, b1 = 0; //to properly display binary 9 (led matrix problem) static unsigned long last_tick = 0; void blink_row();//can delete this void calendar_display_sec_l(int);//displays low part of sec void calendar_display_sec_h(int);//displays decimal part of sec void calendar_display_minutes_l(int);//displays low part of minutes void calendar_display_minutes_h(int);//displays decimal part of minutes void calendar_display_hours_l(int);//displays low part of hours void calendar_display_hours_h(int);//displays decimal part of hours void calendar_display_day(int);//displays decimal part of hours void calendar_display_date(int);//displays decimal part of hours void calendar_display_month(int);//displays decimal part of hours void calendar_display_year(int);//displays decimal part of hours void all_rows_cols_off(void);//switch off all leds void setup() { DDRB = DDRB | B11111111;//PORT B Data Direction register (1->output) DDRC |= B111111;//PORT C Data Direction register (1->output) DDRD |= B11111100;//PORT D Data Direction register (1->output) PORTB &= ~B10;//enable power to LEDs. this could be PWM signal to dimmer LEDs PORTB |= B10000;//PORT B output register PORTC |= B1111111; PORTD |= B1100; //to blink all leds (checks if all leds light up) COL1_ON; blink_row(); COL1_OFF; COL2_ON; blink_row(); COL2_OFF; COL3_ON; blink_row(); COL3_OFF; COL4_ON; blink_row(); COL4_OFF; COL5_ON; blink_row(); COL5_OFF; COL6_ON; blink_row(); COL6_OFF; COL7_ON; blink_row(); COL7_OFF; COL8_ON; blink_row(); COL8_OFF; COL9_ON; blink_row(); COL9_OFF; } void loop() { if (millis() - last_tick >= 1000) {//checks time now and last tick. After 1000ms second = second + 1; last_tick = millis(); second++; } if (second >= 60) { minute++; second = 0; } if (minute >= 60) { hour++; minute = 0; } if (hour >= 24) { hour = 0; day++; date++; } if (day >= 7) { day = 1; } if (date >= 31) { date = 1; month++; } if (month >= 12) { month = 1; year++; } if (year >= 2019) { year = 2019; } calendar_display_sec_l(second);//displays low part of sec calendar_display_sec_h(second);//displays decimal part of sec calendar_display_minutes_l(minute);//displays low part of minutes delayMicroseconds(DELAY1);//this should be replaced by sleep mode calendar_display_minutes_h(minute);//displays decimal part of minutes delayMicroseconds(DELAY1);//this should be replaced by sleep mode calendar_display_hours_l(hour);//displays low part of hours delayMicroseconds(DELAY1);//this should be replaced by sleep mode calendar_display_hours_h(hour);//displays decimal part of hours delayMicroseconds(DELAY1);//this should be replaced by sleep mode calendar_display_day(day);//displays decimal part of hours delayMicroseconds(DELAY1);//this should be replaced by sleep mode calendar_display_date(date);//displays decimal part of hours delayMicroseconds(DELAY1);//this should be replaced by sleep mode calendar_display_month(month);//displays decimal part of hours delayMicroseconds(DELAY1);//this should be replaced by sleep mode calendar_display_year(year);//displays decimal part of hours delayMicroseconds(DELAY1);//this should be replaced by sleep mode } void blink_row()//function to switch on and off all rows { ROW1_ON; delay(25); ROW1_OFF; ROW2_ON; delay(25); ROW2_OFF; ROW3_ON; delay(25); ROW3_OFF; ROW4_ON; delay(25); ROW4_OFF; ROW5_ON; delay(25); ROW5_OFF; ROW6_ON; delay(25); ROW6_OFF; ROW7_ON; delay(25); ROW7_OFF; ROW8_ON; delay(25); ROW8_OFF; ROW9_ON; delay(25); ROW9_OFF; } void calendar_display_sec_l(int s) { all_rows_cols_off();//resets rows and cols s %= 10; if (s == 1) { COL8_ON; ROW5_ON; } else if (s == 2) { COL8_ON; ROW6_ON; } else if (s == 3) { COL8_ON; ROW5_ON; ROW6_ON; } else if (s == 4) { COL8_ON; ROW7_ON; } else if (s == 5) { COL8_ON; ROW5_ON; ROW7_ON; } else if (s == 6) { COL8_ON; ROW7_ON; ROW6_ON; } else if (s == 7) { COL8_ON; ROW5_ON; ROW6_ON; ROW7_ON; } else if (s == 8) { COL8_ON; ROW8_ON; } else if (s == 9) { COL8_ON; ROW8_ON; ROW5_ON; } } void calendar_display_sec_h(int s) { s /= 10; //gets decimal part all_rows_cols_off();//resets rows and cols if (s == 1) { COL8_ON; ROW2_ON; } else if (s == 2) { COL8_ON; ROW3_ON; } else if (s == 3) { COL8_ON; ROW2_ON; ROW3_ON; } else if (s == 4) { COL8_ON; ROW4_ON; } else if (s == 5) { COL8_ON; ROW2_ON; ROW4_ON; } } void calendar_display_minutes_l(int m) { all_rows_cols_off(); m %= 10; b ^= 1; //if minutes == 9 -> 8 + 1 if (m == 1) { COL7_ON; ROW7_ON; } else if (m == 2) { COL7_ON; ROW8_ON; } else if (m == 3) { COL7_ON; ROW7_ON; ROW8_ON; } else if (m == 4) { COL7_ON; ROW9_ON; } else if (m == 5) { COL7_ON; ROW7_ON; ROW9_ON; } else if (m == 6) { COL7_ON; ROW9_ON; ROW8_ON; } else if (m == 7) { COL7_ON; ROW7_ON; ROW8_ON; ROW9_ON; } else if (m == 8) { COL8_ON; ROW1_ON; } else if (m == 9 && b == 0) { COL8_ON; ROW1_ON; } else if (m == 9 && b == 1) { COL7_ON; ROW7_ON; } } void calendar_display_minutes_h(int m) { all_rows_cols_off(); m /= 10; if (m == 1) { COL7_ON; ROW4_ON; } else if (m == 2) { COL7_ON; ROW5_ON; } else if (m == 3) { COL7_ON; ROW4_ON; ROW5_ON; } else if (m == 4) { COL7_ON; ROW6_ON; } else if (m == 5) { COL7_ON; ROW4_ON; ROW6_ON; } } void calendar_display_hours_l(int h) { all_rows_cols_off(); h %= 10; b1 ^= 1; if (h == 1) { COL6_ON; ROW9_ON; } else if (h == 2) { COL7_ON; ROW1_ON; } else if (h == 3 && b1 == 0) { COL6_ON; ROW9_ON; // COL7_ON; // ROW1_ON } else if (h == 3 && b1 == 1) { //COL6_ON; //ROW9_ON; COL7_ON; ROW1_ON; } else if (h == 4) { COL7_ON; ROW2_ON; } else if (h == 5 && b1 == 0) { COL7_ON; ROW2_ON; //COL6_ON; //ROW9_ON; } else if (h == 5 && b1 == 1) { //COL7_ON; //ROW2_ON; COL6_ON; ROW9_ON; } else if (h == 6) { COL7_ON; ROW1_ON; ROW2_ON; } else if (h == 7 && b1 == 0) { COL7_ON; ROW1_ON; ROW2_ON; //COL6_ON; //ROW9_ON; } else if (h == 7 && b1 == 1) { //COL7_ON; //ROW1_ON; //ROW2_ON; COL6_ON; ROW9_ON; } else if (h == 8) { COL7_ON; ROW3_ON; } else if (h == 9 && b1 == 0) { COL7_ON; ROW3_ON; //COL6_ON; //ROW9_ON; } else if (h == 9 && b1 == 1 ) { //COL7_ON; //ROW3_ON; COL6_ON; ROW9_ON; } } void calendar_display_hours_h(int h) { all_rows_cols_off(); h /= 10; if (h == 1) { COL6_ON; ROW6_ON; } else if (h == 2) { COL6_ON; ROW7_ON; } } void calendar_display_day(int d) { all_rows_cols_off(); if (d == 1) { COL5_ON; ROW8_ON; } else if (d == 2) { COL5_ON; ROW9_ON; } else if (d == 3) { COL6_ON; ROW1_ON; } else if (d == 4) { COL6_ON; ROW2_ON; } else if (d == 5) { COL6_ON; ROW3_ON; } else if (d == 6) { COL6_ON; ROW4_ON; } else if (d == 7) { COL6_ON; ROW5_ON; } } void calendar_display_date(int d) { all_rows_cols_off(); if (d == 1) { COL2_ON; ROW4_ON; } else if (d == 2) { COL2_ON; ROW5_ON; } else if (d == 3) { COL2_ON; ROW6_ON; } else if (d == 4) { COL2_ON; ROW7_ON; } else if (d == 5) { COL2_ON; ROW8_ON; } else if (d == 6) { COL2_ON; ROW9_ON; } else if (d == 7) { COL3_ON; ROW1_ON; } else if (d == 8) { COL3_ON; ROW2_ON; } else if (d == 9) { COL3_ON; ROW3_ON; } else if (d == 10) { COL3_ON; ROW4_ON; } else if (d == 11) { COL3_ON; ROW5_ON; } else if (d == 12) { COL3_ON; ROW6_ON; } else if (d == 13) { COL3_ON; ROW7_ON; } else if (d == 14) { COL3_ON; ROW8_ON; } else if (d == 15) { COL3_ON; ROW9_ON; } else if (d == 16) { COL4_ON; ROW1_ON; } else if (d == 17) { COL4_ON; ROW2_ON; } else if (d == 18) { COL4_ON; ROW3_ON; } else if (d == 19) { COL4_ON; ROW4_ON; } else if (d == 20) { COL4_ON; ROW5_ON; } else if (d == 21) { COL4_ON; ROW6_ON; } else if (d == 22) { COL4_ON; ROW7_ON; } else if (d == 23) { COL4_ON; ROW8_ON; } else if (d == 24) { COL4_ON; ROW9_ON; } else if (d == 25) { COL5_ON; ROW1_ON; } else if (d == 26) { COL5_ON; ROW2_ON; } else if (d == 27) { COL5_ON; ROW3_ON; } else if (d == 28) { COL5_ON; ROW4_ON; } else if (d == 29) { COL5_ON; ROW5_ON; } else if (d == 30) { COL5_ON; ROW6_ON; } else if (d == 31) { COL5_ON; ROW7_ON; } } void calendar_display_month(int m) { all_rows_cols_off(); if (m == 1) { COL1_ON; ROW1_ON; } else if (m == 2) { COL1_ON; ROW2_ON; } else if (m == 3) { COL1_ON; ROW3_ON; } else if (m == 4) { COL1_ON; ROW4_ON; } else if (m == 5) { COL1_ON; ROW5_ON; } else if (m == 6) { COL1_ON; ROW6_ON; } else if (m == 7) { COL1_ON; ROW7_ON; } else if (m == 8) { COL1_ON; ROW8_ON; } else if (m == 9) { COL1_ON; ROW9_ON; } else if (m == 10) { COL2_ON; ROW1_ON; } else if (m == 11) { COL2_ON; ROW2_ON; } else if (m == 12) { COL2_ON; ROW3_ON; } } void calendar_display_year(int y) { all_rows_cols_off(); if (y == 2019) { COL8_ON; ROW9_ON; } else if (y == 2020) { COL9_ON; ROW1_ON; } else if (y == 2021) { COL9_ON; ROW2_ON; } else if (y == 2022) { COL9_ON; ROW3_ON; } else if (y == 2023) { COL9_ON; ROW4_ON; } } void all_rows_cols_off(void) { PORTB |= B10000; PORTB &= ~B11100101; PORTC |= B1111111; PORTD |= B1100; PORTD &= ~B11110000; }