====== 7-сегментный цифровой индикатор ====== //Необходимые знания: [HW] [[et:hardware:homelab:digi]], [LIB] [[et:software:homelab:library:delay]], \\ [LIB] [[et:software:homelab:library:module:segment_display]], [PRT] [[et:examples:digi:led]]// ===== Теория ===== 7-сегментный цифровой LED индикатор - это индикатор, состоящий из семи светодиодов, установленных в форме цифры 8. Зажигая или выключая соответствующие LED-ы (сегменты) можно отображать цифры от нуля до девяти, а так же некоторые буквы. [{{ :examples:display:segment_display:segment_display_leds.png?300|Расположение и электросхема сегментов LED индикатора}}] Электрически все аноды LED-ов соединены с общим выводом анода //ca//. LED-ы загораются при включении их катодов (//a, b, c...//) . Существуют так же и обратные соединения, где у индикаторов есть общий катод //cc//. Обычно используется несколько цифровых индикаторов, чтобы создать многозначные цифры – для этого индикаторы снабжены сегментом в виде запятой (точки) - //dp//. В итоге, у одного индикатора 8 сегментов, хотя называют их по числу цифровых сегментов 7-сегментным. Цифровые LED индикаторы легко использовать, потому что управлять ими можно напрямую от выводов микроконтроллера, но также имеются специальные драйвера, которые позволяют управлять цифровым индикатором с меньшим количеством выводов микроконтроллера. Цифровые индикаторы LED бывают различных цветов, они могут быть очень яркими и большими. Для отображения всего латинского алфавита существуют индикаторы с добавочными сегментами. ===== Практика ===== На плате дигитального модуля есть один 7-сегментный цифровой LED индикатор. Он управляется через драйвер A6275 с последовательным интерфейсом. Последовательный интерфейс драйвера похож на SPI, где так же используется тактовый сигнал и сигнал данных. В отличие от SPI не используется выбор чипа (на английском языке //chip-select//), но вместо этого существует сигнал блокировки данных (на английском языке //latch//). Три названных линии объединены микроконтроллером ATmega128 следующим образом: [{{ :examples:display:segment_display:segment_display_driver_logic.png?300|Структура регистра сдвига LED драйвера вместе с соответствующими сегментами индикатора}}] * Сигнал блокировки (//latch//) - PG2 * Тактовый сигнал (//clock//) - PC7 * Сигнал данных (//data//) - PC6 ~~CL~~ Данные передаются через вывод данных по битам. . Каждый раз когда тактовый сигнал становится высоким, смещается содержание регистров сдвига вправо и в самое левое гнездо считывается бит, приходящий из вывода данных. Таким образом в регистр сдвига загружается 8 бит. Если настроить сигнал блокировки верхним, то значение регистра сдвига загружается в регистр блокировки, где оно и остается до следующей загрузки. Каждое гнездо (бит) регистра блокировки связано с одним сегментом цифрового индикатора через токовый ключ (коммутатор тока). Сегмент горит в случае верхнего значения бита. Для отображения цифр на индикаторе Дигитального модуля Домашней Лаборатории в её библиотеке написана следующая функциональная возможность: // // Наладка выводов // static pin segment_display_latch = PIN(G, 2); static pin segment_display_data_out = PIN(C, 6); static pin segment_display_clock = PIN(C, 7); // // Таблица символов // Биты указывают сегменты. Нижний разряд А, верхний DP. // static const unsigned char segment_char_map[11] = { 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111100, 0b00000111, 0b01111111, 0b01100111, 0b01111001 // E like Error }; // // Запуск 7-сегментного индикатора // void segment_display_init(void) { // Set latch, data out and clock pins as output pin_setup_output(segment_display_latch); pin_setup_output(segment_display_data_out); pin_setup_output(segment_display_clock); } // // Отображение цифр на 7-сегментном индикаторе // void segment_display_write(unsigned char digit) { unsigned char map; signed char i; // Контроль цифр if (digit > 9) { digit = 10; } // Цифру картой сегментов map = segment_char_map[digit]; // Удаление сигнала блокировки pin_clear(segment_display_latch); // Отправка битов. Верхний разряд первым. for (i = 7; i >= 0; i--) { // Настройка выводов в соответствии с картой таблицы битов pin_set_to(segment_display_data_out, bit_is_set(map, i)); // Тактовый сигнал на момент верхним pin_set(segment_display_clock); _delay_us(1); // Тактовый сигнал нижним pin_clear(segment_display_clock); _delay_us(1); } // Сигнал блокировки включен pin_set(segment_display_latch); } Для отображения цифр и буквы "E" сегментами, создан постоянный массив //segment_char_map//, где зажигание каждого сегмента обозначено битом 1, а потухание битом 0. Биты из нижнего в верхний (в бинарной форме слева направо) обозначают сегменты A, B, C, D, E, F, G и DP. Управляющий интерфейс драйвера выполняется программным SPI или с использованием программного управления передачи данных выводов в программе. Функцией //segment_display_init// все три вывода настраиваются выходами. Для отображения (дисплея) сигнала используется функция //segment_display_write// которая находит в массиве карту сегментов сигнала и передает все значения сегментов драйверу по битам. Частотой тактового сигнала при помощи программных пауз получено приблизительно 500 kHz. Далее приведен более конкретный пример программы использования цифрового индикатора. В программе используются заранее описанные в библиотеке функции. Программа считает цифры от нуля до девяти приблизительно с секундным интервалом. Подобный подсчет получен приобретением модуля из большего числа. // // Пример программы 7-сегментного LED индикатора модуля // Входы-выходы Домашней Лаборатории // #include #include // // Основная программа // int main(void) { int counter = 0; // Настройка 7-сегментного индикатора segment_display_init(); // Бесконечный цикл while (true) { // Показ единичного значения счетчика segment_display_write(counter % 10); // Счет очень долго counter++; // Пауза 1 секунда sw_delay_ms(1000); } }