Доброго времени суток уважаемые форумчане, если кто в сила проявить каплю терпения и подсказать буду очень признателен. Пытаюсь постичь - непостижимое) Если вопрос не в эту ветку прошу сильно не пинать. Урок номер 13. Эксперимент 13. Секундомер. #define FIRST_SEGMENT_PIN 2 #define SEGMENT_COUNT 7 byte numberSegments[10] = { 0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010, 0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110, }; void setup() { for (int i = 0; i < SEGMENT_COUNT; ++i) pinMode(i + FIRST_SEGMENT_PIN, OUTPUT); } void loop() { int number = (millis() / 1000) % 10; int mask = numberSegments[number]; for (int i = 0; i < SEGMENT_COUNT; ++i) { boolean enableSegment = bitRead(mask, i); digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment); } } Вопрос № 1: как семисегментник понимает и отображает цифры т.е цифр "1" состоит из 2 секций и что бы их зажечь необходимо подать на эти пины "HIGH". digitalWrite(4, HIGH); digitalWrite(5, HIGH); Или например "2" там нужно зажечь уже 5 секций, но ничего подобного в коде нет. Я написал прогу по своему, но она выглядит очень громоздко, я прописываю зажигание каждой цифры в сегментах , это получается страшно и километрово. Вопрос №2: 0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010, 0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110, <----- с какого потолка взяты эти цифры, зачем они нужны и почему нельзя обойтись обычными цифрам в массиве. Заранее спасибо!
Ответ на вопрос 2 - автоматический ответ на вопрос 1. 0b00111111 = 0x3f - код нуля, 6 сегментов горят 0b00001010= 0x06 - код единицы, 2 сегмента горят 0b01011101 = 0x5b - код двойки, 5 сегментов горят 0b01011110 = 0x4f - код тройки, 5 сегментов горят Для наглядности: первая цифра HEX-представления - номер строки, вторая - номер столбца. С нуля, естественно. https://ru.wikipedia.org/wiki/Семисегментный_индикатор По проге. Номер элемента массива с данном случае и есть число для вывода на индикатор.
void loop() { int number = (millis() / 1000) % 10; digitalWrite(numberSegments[number], HIGH); } millis() выдает в цикле от 0 - 9 убрал For Упростил до нельзя ... но не работает хотя причин не вижу ( через примерно две секунды начинает статично гореть латинская "L". думаю дело упирается в bitRead, но каким боком....
Вы, похоже, вообще не понимаете как код работает. for отвечает не за перебор выводимых цифр от 0 - 9, а за обновление выходов МК. За текущее выводимое число отвечает конструкция (millis() / 1000) % 10; Именно она считает от 0 до 9 каждую секунду. Изначальный вариант из описания эксперимента работает? Если нет - проверяйте схему. Прога рабочая.