Помогите начинающему !!!

Тема в разделе "Флудилка", создана пользователем ___ToX___, 24 мар 2015.

  1. ___ToX___

    ___ToX___ Нуб

    Доброго времени суток уважаемые форумчане, если кто в сила проявить каплю терпения и подсказать буду очень признателен. Пытаюсь постичь - непостижимое)
    Если вопрос не в эту ветку прошу сильно не пинать.
    Урок номер 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. X-Dron

    X-Dron Гик

    Ответ на вопрос 2 - автоматический ответ на вопрос 1.
    0b00111111 = 0x3f - код нуля, 6 сегментов горят
    0b00001010= 0x06 - код единицы, 2 сегмента горят
    0b01011101 = 0x5b - код двойки, 5 сегментов горят
    0b01011110 = 0x4f - код тройки, 5 сегментов горят
    Для наглядности: первая цифра HEX-представления - номер строки, вторая - номер столбца. С нуля, естественно.
    [​IMG]
    https://ru.wikipedia.org/wiki/Семисегментный_индикатор

    По проге. Номер элемента массива с данном случае и есть число для вывода на индикатор.
     
    Последнее редактирование: 24 мар 2015
    Tomasina нравится это.
  3. ___ToX___

    ___ToX___ Нуб

    Спасибо, как мне самому в голову Вика не пришла, а тебе +100 к карме)
     
  4. ___ToX___

    ___ToX___ Нуб

    void loop()
    {
    int number = (millis() / 1000) % 10;
    digitalWrite(numberSegments[number], HIGH);
    }
    millis() выдает в цикле от 0 - 9
    убрал For
    Упростил до нельзя ... но не работает хотя причин не вижу (
    через примерно две секунды начинает статично гореть латинская "L".
    думаю дело упирается в bitRead, но каким боком....
     
  5. X-Dron

    X-Dron Гик

    Вы, похоже, вообще не понимаете как код работает.
    for отвечает не за перебор выводимых цифр от 0 - 9, а за обновление выходов МК.
    За текущее выводимое число отвечает конструкция (millis() / 1000) % 10; Именно она считает от 0 до 9 каждую секунду.
    Изначальный вариант из описания эксперимента работает?
    Если нет - проверяйте схему. Прога рабочая.
     
  6. ___ToX___

    ___ToX___ Нуб

    Спасибо буду разбираться