Необходимые знания: [HW] Kasutajaliidese moodul, [LIB] Viide,
[LIB] 7-segmendiline LED indikaator, [PRT] Valgusdiood
7-сегментный цифровой LED индикатор - это индикатор, состоящий из семи светодиодов, установленных в форме цифры 8. Зажигая или выключая соответствующие LED-ы (сегменты) можно отображать цифры от нуля до девяти, а так же некоторые буквы.
Электрически все аноды LED-ов соединены с общим выводом анода ca. LED-ы загораются при включении их катодов (a, b, c…) . Существуют так же и обратные соединения, где у индикаторов есть общий катод cc. Обычно используется несколько цифровых индикаторов, чтобы создать многозначные цифры – для этого индикаторы снабжены сегментом в виде запятой (точки) - dp. В итоге, у одного индикатора 8 сегментов, хотя называют их по числу цифровых сегментов 7-сегментным.
Цифровые LED индикаторы легко использовать, потому что управлять ими можно напрямую от выводов микроконтроллера, но также имеются специальные драйвера, которые позволяют управлять цифровым индикатором с меньшим количеством выводов микроконтроллера. Цифровые индикаторы LED бывают различных цветов, они могут быть очень яркими и большими. Для отображения всего латинского алфавита существуют индикаторы с добавочными сегментами.
На плате дигитального модуля есть один 7-сегментный цифровой LED индикатор. Он управляется через драйвер A6275 с последовательным интерфейсом. Последовательный интерфейс драйвера похож на SPI, где так же используется тактовый сигнал и сигнал данных. В отличие от SPI не используется выбор чипа (на английском языке chip-select), но вместо этого существует сигнал блокировки данных (на английском языке latch). Три названных линии объединены микроконтроллером ATmega128 следующим образом:
Данные передаются через вывод данных по битам. . Каждый раз когда тактовый сигнал становится высоким, смещается содержание регистров сдвига вправо и в самое левое гнездо считывается бит, приходящий из вывода данных. Таким образом в регистр сдвига загружается 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 <homelab/module/segment_display.h> #include <homelab/delay.h> // // Основная программа // int main(void) { int counter = 0; // Настройка 7-сегментного индикатора segment_display_init(); // Бесконечный цикл while (true) { // Показ единичного значения счетчика segment_display_write(counter % 10); // Счет очень долго counter++; // Пауза 1 секунда sw_delay_ms(1000); } }