Добрый день. Попросили на заказ сделать часы с календарем. Использовал часы реального времени, два сдвиговых регистра и два семисигментных индикатора по три цифры. И вроде бы все получаеться , только смущает код в моменте заливки битов в регистры. Всю голову сломал но не могу придумать как код в этом моменте сделать меньше. Будут ли каие ни будь предложения или оставить как есть? Код (Text): long p = 0; long i = 15000; long k = 3000; #include <Time.h> #include <Wire.h> #include <DS1307RTC.h> int y = 0; int t = 0; int r = 0; int e = 0; int w = 0; int q = 0; int z = 0; int c = 2; #define latch_Pin 9 #define CLOCK_PIN 13 #define data_Pin 11 byte segments[11] = { 0b01111110, 0b00110000, 0b01101101, 0b01111001, 0b00110011, 0b01011011, 0b01011111, 0b01110000, 0b01111111, 0b01111011, 0b00000000 }; byte segment[7] = { 0b11111111, 0b10111111, 0b11011111, 0b11101111, 0b11110111, 0b11111011, 0b11111101 }; void setup() { pinMode(latch_Pin, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(data_Pin, OUTPUT); setSyncProvider(RTC.get); } void loop() { unsigned long r = millis(); if(r - p > k){ z = 0; if(r - p > i){ p = r; z = 1; }} if(z == 1){ y = (year()-2000); if(y > 9) y = (year()-2000)%10; t = (year()-2000)/10; r = month(); if(r > 9) r = month()%10; e = month()/10; w = day(); if(w > 9) w = day()%10; q = day()/10; } if(z == 0){ y = second(); if(y > 9) y = second()%10; t = second()/10; r = minute(); if(r > 9) r = minute()%10; e = minute()/10; w = hour(); if(w > 9) w = hour()%10; q = hour()/10; } digitalWrite(latch_Pin, LOW); shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segment[1]); shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[q]); digitalWrite(latch_Pin, HIGH); delay(c); digitalWrite(latch_Pin, LOW); shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segment[2]); shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[w]); digitalWrite(latch_Pin, HIGH); delay(c); digitalWrite(latch_Pin, LOW); shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segment[3]); shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[e]); digitalWrite(latch_Pin, HIGH); delay(c); digitalWrite(latch_Pin, LOW); shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segment[4]); shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[r]); digitalWrite(latch_Pin, HIGH); delay(c); digitalWrite(latch_Pin, LOW); shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segment[5]); shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[t]); digitalWrite(latch_Pin, HIGH); delay(c); digitalWrite(latch_Pin, LOW); shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segment[6]); shiftOut(data_Pin, CLOCK_PIN, LSBFIRST, segments[y]); digitalWrite(latch_Pin, HIGH); delay(c); } Вот фотка кому интересно:
запихнуть повторяющийся код в функцию: Код (Text): #include <Time.h> #include <Wire.h> #include <DS1307RTC.h> #define LATCH_PIN 9 #define CLOCK_PIN 13 #define DATA_PIN 11 long p = 0; long i = 15000; long k = 3000; byte y = 0; byte t = 0; byte r = 0; byte e = 0; byte w = 0; byte q = 0; byte z = 0; byte c = 2; byte segments[11] = { 0b01111110, 0b00110000, 0b01101101, 0b01111001, 0b00110011, 0b01011011, 0b01011111, 0b01110000, 0b01111111, 0b01111011, 0b00000000 }; byte segment[7] = { 0b11111111, 0b10111111, 0b11011111, 0b11101111, 0b11110111, 0b11111011, 0b11111101 }; void setup() { pinMode(LATCH_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(DATA_PIN, OUTPUT); setSyncProvider(RTC.get); } void loop() { unsigned long r = millis(); if(r - p > k){ z = 0; if(r - p > i){ p = r; z = 1; } } if(z == 1){ y = (year()-2000); if(y > 9) y = (year()-2000)%10; t = (year()-2000)/10; r = month(); if(r > 9) r = month()%10; e = month()/10; w = day(); if(w > 9) w = day()%10; q = day()/10; } if(z == 0){ y = second(); if(y > 9) y = second()%10; t = second()/10; r = minute(); if(r > 9) r = minute()%10; e = minute()/10; w = hour(); if(w > 9) w = hour()%10; q = hour()/10; } displayData(1, q); delay(c); displayData(2, w); delay(c); displayData(3, e); delay(c); displayData(4, r); delay(c); displayData(5, t); delay(c); } void displayData(byte poz, byte num){ digitalWrite(LATCH_PIN, LOW); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, segment[poz]); shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, segments[num]); digitalWrite(LATCH_PIN, HIGH); }