Функция get_it (), текст которой приведен в Программе 11.8, накапливает в переменной count число вызовов функции scan_it (), каждый раз сравнивая возвращаемое значение, которое присваивается переменной new_key, с предыдущим значением, хранящимся в переменной old_key. Если эти значения не совпадают, то счетчик обнуляется. Выход из цикла происходит только после 254 идентичных считываний, в результате чего в вызывающую программу возвращается стабильное значение.
unsigned int get_it(void)
{
unsigned int count, old_key, new_key;
count = 0;
while(count<255)
{
new_key = scan_it();
if(new_key == old_key)
{ count++;}
else
{
old_key = new_key;
count = 0;
}
}
return (old_key);
}
Несмотря на все более широкое распространение жидкокристаллических алфавитно-цифровых матричных дисплеев, для отображения многоразрядных чисел до сих пор очень часто используются дискретные 7-сегментные светодиодные индикаторы. Применение таких индикаторов особенно эффективно при низкой освещенности и при необходимости использования больших дисплеев.
Если учесть, что для управления каждым индикатором требуется восемь линий (семь сегментов плюс десятичная точка), то получается, что для управления «-разрядным дисплеем нам потребуется 8х
Индикаторы, показанные на схеме, выполнены по схеме с общим катодом, поэтому каждый сегмент включается тогда, когда на соответствующем выходе регистра присутствует ВЫСОКИЙ уровень. Резисторы, включенные последовательно с сегментами, служат для ограничения тока. На практике некоторые логические схемы могут отдавать больший выходной ток в состоянии НИЗКОГО уровня, поэтому чаще используются индикаторы с общим анодом, в которых включение сегментов осуществляется подачей НИЗКОГО уровня. В крупногабаритных дисплеях, например высотой 5 см (2 дюйма), каждый сегмент может состоять из нескольких СИД, включенных последовательно и/или параллельно. В этом случае для управления индикатором может потребоваться большее напряжение и/или ток, для обеспечения которых необходимо подключить к выходам регистра подходящие драйверы.
Рис. 11.15.
Альтернативное решение, показанное на Рис. 11.16, часто применяется для дисплеев на базе светодиодных индикаторов. Вместо использования отдельного регистра для каждого разряда, все индикаторы подключены параллельно к одному из портов микроконтроллера. Каждый индикатор поочередно включается на короткий промежуток времени, отображая соответствующие данные с выходного порта. Если обновлять изображение чаще чем 50 раз в секунду (а еще лучше — чаще 100 раз в секунду), то из-за инерционности системы зрения будет казаться, что индикаторы не мерцают[149]. Разумеется, ток, протекающий через каждый сегмент, следует увеличить, чтобы скомпенсировать снижение яркости, вызванное импульсным режимом работы. А поскольку в таком режиме СИД работают более эффективно, зависимость между сопротивлением последовательных резисторов и коэффициентом заполнения управляющего сигнала будет не прямо пропорциональной.
Рис. 11.16.
Прикиньте все плюсы и минусы обоих решений, учитывая как аппаратные затраты, так и затраты на программирование. Для иллюстрации своего ответа напишите программу, отображающую число, хранящееся в регистре h’20’. Например, если в этом регистре (назовем его BINARY) находится число h’FF’, то на дисплее должно отображаться
Решение
Что касается программного обеспечения, то тут можно выделить две основные функции. Сначала код, находящийся в регистре BINARY, необходимо преобразовать в три BCD-разряда (HUNDREDS, TENS и UNITS). После этого значение каждого из разрядов (0…9) следует преобразовать в 7-сегментный код, чтобы включить соответствующие сегменты индикаторов, отображая требуемую цифру. У нас уже есть подпрограммы для реализации 1-го (см. Программу 6.11 на стр. 196) и последнего (см. Программу 6.6 на стр. 184) этапов. С учетом этих программ, можно составить алгоритм управления схемой, приведенной на Рис. 11.15:
1. Преобразовать двоичное однобайтное число в BCD-число.
2. ВЫПОЛНЯТЬ: