Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

252 Часть 111. Практическое программирование микроконтроллеров АVR низком уровне на выходе. Сохранить положительную логику можно, если на выход микросхемы подключить п-р-п транзистор в качестве эмиттерного повторителя, тогда базовые резисторы можно и не включать . П рограммирование динамическо й индикации При программировании режима динамической индикации необходимо учесть, что переключение между разрядами должно происходить достаточно быстро - с час­ тотой, не меньшей, чем 50-60 Гц, иначе индикаторы будут мерцать заметно для глаза. Очень большую частоту при этом задавать не рекомендуется, т. к. , во­ первых, из-за инерционности ключей будут подсвечиваться выключенные сегмен­ ты в соседних разрядах, во-вторых, не следует сильно перегружать контроллер - как мы увидим, даже в нашем простейшем случае процедура индикации достаточно громоздкая . Предположим, что время у нас отсчитывается посредством Timer l , тогда с по­ мощью TimerO удобно управлять индикаторами. Подадим на него частоту, равную, например, 1 /6 4 от тактовой (4 МГц), тогда прерывания по переполнению будут про­ исходить с частотой около 244 Гц, что для четырех индикаторов приемлемо (часто­ та переключения составит 244/4 = 6 1 Гц). Перед тем, как «изобретать» процедуру управления индикаторами, определимся с тем, как формировать рисунок цифр . Фактически для этого необходимо в про­ грамму занести таблицу, приведенную на рис. 9 . 2 . Это можно сделать несколькими способами: просто расположить ее в памяти (в EEPROM или, что проще, прямо в программе) или сформировать 10 процедур (по одной на каждую цифру от О до 9), в которых непосредственно устанавливаются нужные разряды портов. Последний вариант, хотя и громоздок, но вполне приемлем в ситуации, когда биты управления сегментами «разбросаны» по разрядам разных портов, - тогда все равно прихо­ дится фактически управлять этими разрядами индивидуально. Мы же здесь рассмотрим более универсальный способ с представлением маски цифр в виде констант в памяти и последующим приложением этой маски к регист­ ру данных порта С. Как записать такую маску в память программ и прочесть ее командой lpm, описано в разд. «Команды пересылки данных» гл а вы 7. Расположим распакованные значения часов и минут в оперативной памяти подряд, начиная со старшего разряда так же, как мы делали ранее (см. листинг 9 . 5) . Кроме того, зададим специальную глобальную переменную - счетчик разрядов cRazr, изменяющийся по кругу: 0-1-2-3-0-1 " . Сказанное иллюстрирует листинг 9 . 1 2 . ; адреса распакованных часов в SRAМ . equ DdН = ОхО б ; часы старший . equ DeH = Ох07 ; часы младший . equ DdМ = Ох08 ;минуты старший . equ DeM = Ох0 9 ;минуты младший

RkJQdWJsaXNoZXIy MTExODQxMg==