Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ru:examples:display:segment_display [2010/11/03 20:07] – создано eduardtlmkru:examples:display:segment_display [Unknown date] (current) – removed - external edit (Unknown date) 127.0.0.1
Line 1: Line 1:
-====== 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 бит. Если настроить сигнал блокировки верхним, то значение регистра сдвига загружается в регистр блокировки, где оно и остается до следующей загрузки. Каждое гнездо (бит) регистра блокировки связано с одним сегментом цифрового индикатора через токовый ключ (коммутатор тока). Сегмент горит в случае верхнего значения бита. 
- 
-Для отображения цифр на индикаторе Дигитального модуля Домашней Лаборатории в её библиотеке написана следующая функциональная возможность: 
- 
-<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   // 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); 
-} 
-</code> 
- 
-~~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, 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); 
-} 
-</code> 
- 
-Для отображения цифр и буквы "E" сегментами, создан постоянный массив //segment_char_map//, где зажигание каждого сегмента обозначено битом 1, а потухание битом 0. Биты из нижнего в верхний (в бинарной форме слева направо) обозначают сегменты A, B, C, D, E, F, G и DP. Управляющий интерфейс драйвера выполняется программным SPI или с использованием программного управления передачи данных выводов в программе. Функцией //segment_display_init// все три вывода настраиваются выходами. Для отображения (дисплея) сигнала используется функция //segment_display_write// которая находит в массиве карту сегментов сигнала и передает все значения сегментов драйверу по битам. Частотой тактового сигнала при помощи программных пауз получено приблизительно 500 kHz. 
- 
-~~PB~~ 
- 
-Далее приведен более конкретный пример программы использования цифрового индикатора. В программе используются заранее описанные в библиотеке функции. Программа считает цифры от нуля до девяти приблизительно с секундным интервалом. Подобный подсчет получен приобретением модуля из большего числа. 
- 
-<code c> 
-// 
-// Пример программы 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); 
- } 
-} 
-</code> 
ru/examples/display/segment_display.1288807676.txt.gz · Last modified: (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0