This shows you the differences between two versions of the page.
| ru:examples:display:segment_display [2010/11/03 20:07] – создано eduardtlmk | ru:examples:display:segment_display [Unknown date] (current) – removed - external edit (Unknown date) 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== 7-сегментный цифровой индикатор ====== | ||
| - | // | ||
| - | |||
| - | ===== Теория ===== | ||
| - | |||
| - | 7-сегментный цифровой LED индикатор - это индикатор, | ||
| - | |||
| - | [{{ : | ||
| - | |||
| - | Электрически все аноды LED-ов соединены с общим выводом анода //ca//. LED-ы загораются при включении их катодов (//a, b, c...//) . Существуют так же и обратные соединения, | ||
| - | |||
| - | Цифровые LED индикаторы легко использовать, | ||
| - | |||
| - | ===== Практика ===== | ||
| - | |||
| - | На плате дигитального модуля есть один 7-сегментный цифровой LED индикатор. Он управляется через драйвер A6275 с последовательным интерфейсом. Последовательный интерфейс драйвера похож на SPI, где так же используется тактовый сигнал и сигнал данных. В отличие от SPI не используется выбор чипа (на английском языке // | ||
| - | |||
| - | [{{ : | ||
| - | |||
| - | * Сигнал блокировки | ||
| - | * Тактовый сигнал | ||
| - | * Сигнал данных | ||
| - | |||
| - | ~~CL~~ | ||
| - | |||
| - | Данные передаются через вывод данных по битам. . Каждый раз когда тактовый сигнал становится высоким, | ||
| - | |||
| - | Для отображения цифр на индикаторе Дигитального модуля Домашней Лаборатории в её библиотеке написана следующая функциональная возможность: | ||
| - | |||
| - | <code c> | ||
| - | // | ||
| - | // Наладка выводов | ||
| - | // | ||
| - | 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 | ||
| - | }; | ||
| - | |||
| - | // | ||
| - | // Запуск 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); | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | ~~PB~~ | ||
| - | |||
| - | <code c> | ||
| - | // | ||
| - | // Отображение цифр на 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, | ||
| - | |||
| - | // Тактовый сигнал на момент верхним | ||
| - | pin_set(segment_display_clock); | ||
| - | _delay_us(1); | ||
| - | |||
| - | // Тактовый сигнал нижним | ||
| - | pin_clear(segment_display_clock); | ||
| - | _delay_us(1); | ||
| - | } | ||
| - | |||
| - | // Сигнал блокировки включен | ||
| - | pin_set(segment_display_latch); | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Для отображения цифр и буквы " | ||
| - | |||
| - | ~~PB~~ | ||
| - | |||
| - | Далее приведен более конкретный пример программы использования цифрового индикатора. В программе используются заранее описанные в библиотеке функции. Программа считает цифры от нуля до девяти приблизительно с секундным интервалом. Подобный подсчет получен приобретением модуля из большего числа. | ||
| - | |||
| - | <code c> | ||
| - | // | ||
| - | // Пример программы 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); | ||
| - | } | ||
| - | } | ||
| - | </ | ||