Table of Contents

7-сегментный цифровой индикатор

Необходимые знания: [HW] Kasutajaliidese moodul, [LIB] Viide,
[LIB] 7-segmendiline LED indikaator, [PRT] Valgusdiood

Теория

7-сегментный цифровой LED индикатор - это индикатор, состоящий из семи светодиодов, установленных в форме цифры 8. Зажигая или выключая соответствующие LED-ы (сегменты) можно отображать цифры от нуля до девяти, а так же некоторые буквы.

Расположение и электросхема сегментов LED индикатора

Электрически все аноды LED-ов соединены с общим выводом анода ca. LED-ы загораются при включении их катодов (a, b, c…) . Существуют так же и обратные соединения, где у индикаторов есть общий катод cc. Обычно используется несколько цифровых индикаторов, чтобы создать многозначные цифры – для этого индикаторы снабжены сегментом в виде запятой (точки) - dp. В итоге, у одного индикатора 8 сегментов, хотя называют их по числу цифровых сегментов 7-сегментным.

Цифровые LED индикаторы легко использовать, потому что управлять ими можно напрямую от выводов микроконтроллера, но также имеются специальные драйвера, которые позволяют управлять цифровым индикатором с меньшим количеством выводов микроконтроллера. Цифровые индикаторы LED бывают различных цветов, они могут быть очень яркими и большими. Для отображения всего латинского алфавита существуют индикаторы с добавочными сегментами.

Практика

На плате дигитального модуля есть один 7-сегментный цифровой LED индикатор. Он управляется через драйвер A6275 с последовательным интерфейсом. Последовательный интерфейс драйвера похож на SPI, где так же используется тактовый сигнал и сигнал данных. В отличие от SPI не используется выбор чипа (на английском языке chip-select), но вместо этого существует сигнал блокировки данных (на английском языке latch). Три названных линии объединены микроконтроллером ATmega128 следующим образом:

Структура регистра сдвига LED драйвера вместе с соответствующими сегментами индикатора

Данные передаются через вывод данных по битам. . Каждый раз когда тактовый сигнал становится высоким, смещается содержание регистров сдвига вправо и в самое левое гнездо считывается бит, приходящий из вывода данных. Таким образом в регистр сдвига загружается 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);
	}
}