MOV [BX+2],FFh[BX+2],FFh
ReadSignal:
;-------------------------------
;Считать внешний сигнал
;-------------------------------BX,0400h;Выбор таймера[BX+3],80h;Извещаем таймер о чтении третьего каналаCL,[BX+2];Читаем младший байтCH,[BX+2];Читаем старший байт
SUB CX,FFFFh;Инвертируем результат (таймер обратносчетный)
;-------------------------------
;Считать результат измерений
;-------------------------------[BX+3],40h;Извещаем таймер о чтении второго каналаDL,[BX+2];Читаем младший байтDH,[BX+2];Читаем старший байт
SUB DX,FFFFh;Инвертируем результат (таймер обратносчетный)
;-------------------------------
;Поступил сигнал?
;-------------------------------CX,1CheckFreq;Да
;Нет - далее
;-------------------------------
;Результат выше предела измерений?
;-------------------------------CX,0DisplayErrorDX,7530h;7530h=30 000 (10 Герц при учете кванта в 0,001 сек)ReadSignal;Нет - перейти на чтение сигнала
:
;-------------------------------
;Вывод сообщения об ошибке
;-------------------------------BX,0400h;Выбор IOPAX,AX;Очищаем AX[BX+1],90h;Извещаем IOP о записи в память дисплея[BX],AL;Очищаем дисплей (5 ячеек)
MOV [BX],AL[BX],AL[BX],AL[BX],AL
JMP InitTimer;Перейти к инициализации аймера
:
;-------------------------------
;Результат ниже предела измерений?
;-------------------------------DX,03E8h;03E8h=1 000(1 Герц при учете кванта в 0,001 сек)DisplayError;Да - перейти на отображение ошибки
;-------------------------------
;Расчет частоты
;-------------------------------DX,000Fh;Эти две команды устанавливают DX:AX в 1 000 000AX,4240hCX;Делим 1 000 000 на период в мсек,
;получаем частоту в AX в мГц
;-------------------------------
;Вывод частоты
;-------------------------------BX,0400h;Выбор IOP[BX+1],90h;Извещаем IOP о записи в память дисплеяCX,0Ah;Для вывода на дисплей будем делить на 0Ah, тоесть на
DX, DX;Обнуляем DX для деления, в AX уже нужное число
DIV CXDX,[DX+Digits]
MOV [BX],DX;Первая цифра по адресу :остаток от деления + база
массива цифр
XOR DX,DX
DIV CX
MOV DX,[DX+Digits][BX],DX;Вторая цифра
XOR DX,DXCXDX,[DX+Digits]
MOV [BX],DX;Третья цифра
DX,DXCX[BX],[DX+Digits];Четвертая цифраAX,1;Если пятая цифра - 1 то выводим один, иначе пустой экран
JNE BlankDigitDX,[Digits+1]
MOV [BX],DXInitTimer;Цикл закончен - переининциализируем таймер и заново
BlankDigit:[BX],0InitTimer
;-------------------------------
;Точка входа
;-------------------------------
F0:00:0E00;Переход в начало памяти и задание CS:
;-------------------------------
;Наборы бит для отображения цифр
;-------------------------------;0
h;1h
hh
BEhh;8h;9
Литература
1.«Микропроцессорный комплект К1810: структура, программирование, применение. Справочная книга» Казаринов, Номоконов, Филиппов - Москва, 2010г.
2.Методическое пособие №1882 «Освоение ассемблера» Мичурина М.М., Сушкин И.Н.
.Методическое пособие №2000 «Контроллер клавиатуры и индикации» Мичурина М.М.
.Методическое пособие №2187 «Цифровые устройства и микропроцессоры. Архитектура микропроцессоров Intel» Мичурина М.М.
.Информация сети Internet