Всем привет. Сделал часы, сделал вывод на 7 сегментный индикатор (не использую сдвиговый регистр), но код получился большим и корявым, в плане того, что и кнопки не добавить и ооочень длинный код.Хочу все переписать. Сейчас сделал все в "тупую", что даже не добавить отдельно мигающие точки, не добавить кнопки, т.к. используется delay. Ниже часть кода: Код (Text): ....... clearLEDs(); pickDigit(0); //включаем первую цифру pickNumber((n/1000)); //значение тысячи delay(del); //пауза 5мс clearLEDs(); pickDigit(1); //включаем вторую цифру pickNumber((n%1000)/100); //значение сотни delay(del); //пауза 5мс ........ // вывод 0 void zero() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); //HEX 1 } // вывод 1 void one() { digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, LOW); // HEX 4F digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); } Может есть литература, в которой рассказано, что для динамической индикации надо 20 мс на отображение, т.к. 5 мс используется на отображение одного сегмента, плюс надо добавить задержку для кнопки, вот этот код можно переписать так и все в таком духе. В интернете нашел статьи, но все читается не так либо коды на ассемблере или C.
обычно сдвиговый регистр подключается через SPI. А начинать надо с книжки по цифровым устройствам. Например, Пухальского. Как только будет понятно, как работает сдвиговый регистр, можно учиться пробовать заполнять его регистры данными. А статьи в интернете пишут неучи для неучей.
Для того что бы была нормальная индикация, дисплей нужно обновлять не ниже определённой частоты, как у вас на VGA мониторе. Для одного знака период должен быть не выше 12мс / кол-во разрядов индикатора. Каждый период, выключаете общие индикатора, берёте отображаемую цифру, преобразуете в код 7-ми сегментного индикатора и выставляете сегменты, включив требуемый общий. В следующий период - аналогично со следующим разрядом. Та ВЫ сами должны были себе это представлять.
Я правил код с динамической индикацией тут Там есть функция Dysplay_Refresh(void) вызывается из loop() которая отвечает за вывод буфера на экран в динамическом режиме. Там ввод идет через сдвиговый регистр, но сделайте массив из номеров пинов сегментов, и выводите в цикле сдвигая фонт. Получится что то типа этого: Код (C++): uint8_t pin_segments[7] = {a,b,c,d,e,f,g}; void Dysplay_Refresh(void) { static uint32_t old_millis = 0; static uint8_t pos = 2; uint8_t i,j; if ( cur_millis - old_millis >= 7 ) // обновляем разряд раз в 7мс ( 7*3=21мс ) { old_millis = cur_millis; digitalWrite(digit_pin[pos], DIGIT_OFF); if (pos == 2) pos = 0; else pos++; for(i=0,j=0x40; i<7; j=j>>1,i++) { if (disp_buff[pos] & j) digitalWrite(pin_segments[i], HIGH); else digitalWrite(pin_segments[i], LOW); } digitalWrite(digit_pin[pos], DIGIT_ON); } } Тут буфер дисплея на 3 цифры, добавьте еще одну - будет 4.
Можно по всякому. Тут уж как кому нравится. Даже delay(12); display(); в лупе. Вот только 21 мс многовато будет! Что ж тут не понять!