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





Вернемся к подсчету времени. Другой (точнее первый из упомянутых) метод состоит в том, что счет времени мы ведем в обычной шестнадцатеричной форме, а значения разрядов в BCD-формате храним в SRAM. Причем могут понадобиться значения времени как в распакованном виде (для индикации), так и в упакованном (для обмена с "внешним миром", например, для установки времени в отдельной микросхеме часов реального времени, RTC). Так что реализацию этого способа мы начнем с резервирования памяти под все эти нужды. При этом для удобства положим старший байт адреса памяти навсегда равным единице, что равносильно использованию адресов, начиная с 256-й ячейки, и страхует нас от случайного обращения к области регистров (для моделей вроде 2313, где объем SRAM менее 256 байт, адреса придется менять, см. далее в конце этой главы). Код программы содержит листинг 8.5.

Листинг 8.5
;SRAM старший байт адреса SRAM = 0x01 .equ Sek = 00 /текущие секунды в упакованном формате .equ Min =01 /текущие мин в упакованном формате .equ Hour = 02 ;текущие часы в упакованном формате
;распакованные
.equ DdH = 0x0б ; часы старший BCD
.equ DeH = 0x07 ; часы младший BQD
.equ DdM = 0x08 /минуты старший BCD
.equ DeM = 0x09 /минуты младший BCD
.def temp = rl6 /рабочая переменная
.def tempi = rl7 /рабочая переменная
.def cSek = rl8 / счетчик секунд
.def cMin = rl9 / счетчик минут
.def cHour = r20 / счетчик часов

TIMICOMPA: /прерывание по сравнению 1 сек
ldi ZH,0x01 /старший адреса SRAM для сохранения в памяти
inc cSek /увеличиваем число секунд на 1
cpi cSek,60 /сравнить со значением 60
brne Tsek_exit /если не равно, на выход
clr cSek /очистить секунды
inc cMin /увеличиваем число минут на 1
cpi cMin,60 /сравнить со значением 60
brne Tmin_exit /если не равно, на выход
clr cMin /очистить секунды
inc cHour /увеличиваем число часов на 1
cpi cHour,24 /сравнить со значением 24
brne Thour_exit /если не равно, на выход
clr cHour /очистить секунды Thour_exit:
mov temp, cHour'/часы
rcall bin2bcd8 /на выходе в tempi десятки, в temp единицы час ldi ZL,DdH /адрес десятков часов st Z+,tempi /Сохраняем десятки st Z,temp /сохраняем единицы swap tempi /десятки в старшую тетраду add temp,tempi /упакованные часы ldi ZL,Hour /адрес упаков. часов st
Z,temp /сохраняем часы Tmin_exit:
mov temp,cMin /минуты
rcall bin2bcd8 /на выходе в tempi десятки, в temp единицы мин
ldi ZL,DdM /адрес десятков минут
st Z+,tempi /сохраняем десятки
st Z,temp /сохраняем единицы
swap tempi /десятки в старшую тетраду
add temp,tempi /упакованные минуты
ldi ZL,Min /адрес упаков. минут
st Z,temp /сохраняем минуты
Tsek_exit:
mov temp, cSek /секунды
rcall bin2bcd8 ;на выходе в tempi десятки, в temp единицы сек swap tempi /десятки в старшую тетраду add temp,tempi /упакованные секунды ldi ZL,Sek /адрес упаков. секунд st Z,temp /сохраняем секунды reti

По этому алгоритму все три величины будут сохраняться в памяти каждый час, минуты и секунды — каждую минуту, только секунды — каждую секунду. Как видите, алгоритм получился даже длиннее предыдущего, зато тут мы имеем три значения времени, готовые к употреблению каждый в своей области: с обычными hex-значениями легко производить всякие арифметические и логические операции (например, сравнивать моменты времени между собой), упакованные значения можно посылать во "внешний мир", а распакованные использовать для вывода на индикаторы в независимом от подсчета времени цикле (чем мы и займемся немного далее).



     
 

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