Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Программирование динамической индикации
При программировании режима динамической индикации необходимо учесть, что переключение между разрядами должно происходить достаточно быстро — с частотой, не меньшей, чем 50-60 Гц, иначе индикаторы будут мерцать заметно для глаза. Очень большую частоту при этом задавать не рекомендуется, т. к., во-первых, из-за инерционности ключей будут подсвечиваться выключенные сегменты в соседних разрядах, во-вторых, не следует сильно перегружать контроллер — как мы увидим, даже в нашем простейшем случае процедура индикации достаточно громоздкая. Предположим, что время у нас отсчитывается с помощью Timerl, тогда с помощью TimerO удобно управлять индикаторами. Подадим на него частоту, равную, например, 1/64 от тактовой (4 МГц), тогда прерывания по переполнению будут происходить с частотой около 244 Гц, что для четырех индикаторов приемлемо (частота переключения составит 244/4 = 61 Гц).

Перед тем как "изобретать" процедуру управления индикаторами, определимся с тем, как формировать рисунок цифр. Фактически для этого необходимо в программу занести таблицу, приведенную на рис. 8.2. Это можно сделать несколькими способами: просто расположить ее в памяти (в EEPROM или, что проще, прямо в программе) или сформировать 10 процедур (по одной на каждую цифру от 0 до 9), в которых непосредственно устанавливаются нужные разряды портов. Последний вариант, хотя и громоздок, но вполне приемлем в ситуации, когда биты управления сегментами "разбросаны" по разрядам разных портов — тогда все равно приходится фактически управлять этими разрядами индивидуально. Именно такой случай представлен в упомянутой программе часов из [8].

Мы же здесь разберем более универсальный способ с представлением маски цифр в виде констант в памяти и последующим приложением этой маски к регистру данных порта В. Как записать такую маску в память программ и прочесть ее командой lpm, описано в разделе "Команды пересылки данных" главы 6. Только здесь мы сразу немного модифицируем маски цифр с учетом того, что разряд РВЗ у нас занят "мигалкой". Для этого достаточно, в масках сдвинуть все биты, начиная с четвертого, влево на одну позицию — седьмой бит оригинальных масок так и так у нас свободен, и всегда равен нулю, а место третьего бита займем, например, нулем:
N_mask: ;маски семисегментных цифр, 3-й бит свободен
.db ObOlllOlll, ObOOOOllO, ОЫ0110011, 0Ы0010111, 0Ы1000110, 0Ы1010101,
0Ы1110101, ObOOOOOlll, 0Ы1110111, 0Ы1010111

В процессе работы третий бит программы придется не обнулять, а сохранять его текущее состояние, которое устанавливается таймером автоматически. Это усложнит процедуру маскирования, но не намного.

Расположим распакованные значения часов в оперативной памяти подряд, начиная со старшего разряда (так же, как мы делали ранее, только с учетом того, что в AT90S2313 всего 128 байт SRAM, и доступные адреса начинаются с $60, при старшем байте адреса 0). Кроме того, зададим специальную глобальную переменную— счетчик разрядов cRazr (изменяющуюся по кругу 0-1-2-3-0-1...). Сказанное иллюстрирует листинг 8.13.
Листинг 8.13: /распакованные часы в SRAM, начиная с адреса $66 .equ DdH = 0x66 /часы старший .equ DeH = 0x67 /часы младший .equ DdM = 0x68 /минуты старший .equ DeM = 0x69 /минуты младший
.def temp = г16 /рабочая переменная .def cRazr = г17 /счетчик разрядов

Не забудем предварительно обнулить счетчик разрядов, разрешить прерывание переполнения TimerO и установить разряды PD0-PD3, а также все разряды порта В на выход. Листинг 8.14 иллюстрирует прерывание переполнения TimerO.
Листинг 8.14
TIM0OVF: /динамическая индикация inc cRazr /счетчик разрядов cpi cRazr,4 /всего 4 разряда brne Set_razr
clr cRazr /если равен 4, очищаем Set_razr:
clr YH /старший разряд адреса = 0
mov YL,cRazr+DdH /установка тек. адреса
Id temp,Y /в temp — значение дес. цифры
ldi ZH,HIGH(N_mask*2) ;адрес констант в памяти - в Z ldi ZL,LOW(N_mask*2)
add ZL,temp /адрес маски цифры, равной temp adc ZH,0 /на всякий случай учитываем перенос
lpm /в гО — маска in temp,PortB /загружаем состояние порта в temp bst temp,3 /сохраняем бит 3 во флаге Т mov temp,rO /загружаем маску в temp bid temp,3 /загружаем бит 3 из флага Т out PortB,temp /установили сегменты /установка разряда биты PD0-PD3 cpi cRazr,О brne Setl
sbr temp,1 /устанавливаем разряд PDO out PortD,temp reti /выход Setl: cpi cRazr,1 brne Set2
sbr temp,2 /устанавливаем разряд PD1
out PortD,temp
reti /выход
Set2: cpi cRazr,2
brne Set3
sbr temp,4 /устанавливаем разряд PD2
out PortD,temp
reti /выход
Set3: /если не 0, 1 или 2, значит 3
sbr temp,8 /устанавливаем разряд PD3
out PortD,temp reti /выход — конец прерывания



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru