Устройство для измерения угла опережения зажигания четырехтактных карбюраторных двигателей

Страница: 4/7

CALL DEL

LD BC, (A1)

LD (A2), BC

LD (A1), HL

CALL DEL

LD BC, (A1)

LD (R3), BC

LD BC, (A3)

LD (R10), BC

CALL DECT

EXX

RETI

Подпрограмма DECT:

; процедура разбиения числа на десятки (на цифры).

LD BC, (R3) ; ввод числа, которое нужно разбить осуществляется через ячейку с адрессом R3.

LD (A1), BC

C: LD (A2), 10

CALL DEL

LD B, (A3)

INC (R4) ; количество десятков в ячейке с адресом R4.

LD A, (R4)

ADD A, (R5)

LD (A), B

LD A, (A1)

CPS 10

JP NC C;

LD B, (A1)

INC (R4)

LD A, (R4)

ADD A, R5

LD (A), B ; цифры находятся в памяти друг за другом, в порядке возрастания начиная с адреса R5.

INC A

LD (A), 128 (10) ; вывод точки

INC A

LD B, (R10)

LD (A), B

RET

Подпрограмма DEL:

; процедура деления одного числа (в ячейке памяти по адресу А1) на другое ( в ячейке памяти по адрессу А2).

PUSH BC

PUSH DE

PUSH HL

LD HL, (A2)

LD DE, (A1)

LD BC, 0

M1: LD (A4), HL

SBC HL, DE

INC BC

JR NC, M1;

DEC BC

LD (A1), BC ; результат заносится в ячейку памяти с адресом А1.

LD HL, (A4)

LD (A3), HL ; остаток от деления находится в ячейке памяти с адресом А3.

POP HL

POP DE

POP BC

RET

Подпрограмма YMH:

; процедура для умножения одного числа (в ячейке памяти по адресу А1) на другое ( в ячейке памяти по адрессу А2).

PUSH DE

PUSH HL

LD DE, (A2)

DEC DE

LD HL, (A1)

M2: ADC HL, HL

DINZ M2;

LD (A1), HL ; результат заносится в ячейку памяти с адресом А1.

POP HL

POP DE

RET

Опишем подробней каждую из процедур.

DECT: процедура разбиения числа на десятки. Программа делит число на десять, остатком от деления будет младший разряд, который заносится в ячейку R5. Эта процедура повторяется несколько раз, при этом каждый раз увеличивается число количества десятков ( ячейка R4), пока частное не будет меньше 10, после чего процедура останавливается, а последнее полученное нами частное будет старшим разрядом, которое заносится в ячейку по адресу R5+R4.

DEL и YMH: процедуры умножения и деления двух чисел. Наиболее рациональным методом деления и умножения в цифровых приборах является метод двоичного умножения (деления). Но в нашей схеме по ряду причин мы будем использовать другой метод. Одна из причин - это то, что в ассемблере для Z-80 не существует команды для сдвига влево или вправо пары восьмибитовых регистров, а мы производим вычисления над 16-битовыми числами. И второе - быстродействие достигаемое методом двоичного умножения (деления) нам не нужно так, как микропроцессор только обслуживает одно прерывание с Датчика1 (которое появляется с частотой 10-100 Гц) и второе - с таймера (появляющееся с частотой 200 Гц), а все остальное время находится в режиме ожидания.

Процедура умножения запрашивает два числа А1 и А2, а результат возвращает в А1. Умножение производится обычным сложением А1+А1 А2 раз. Поэтому рекомендуется, чтобы А1 было больше чем А2.

Процедура деления запрашивает два числа А1 и А2, а результат и остаток возвращает соответственно в А1 и А3. Деление производится вычитанием из А1 числа А2 пока не будет установлен флаг переноса.

На индикатор информация выводится следующим образом:

Берется цифра соответствующего разряда (разряды перебираются с конца) и из ячейки с адресом “R6+цифра” выбирается код сегментного индикатора.

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

Реферат опубликован: 17/03/2010