====== 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);
}
}