Смекни!
smekni.com

Измеритель расхода топлива (стр. 2 из 4)

MOV 50h, A; Младший байт произведения.

MOV 51h, B; Старший байт произведения.

MOVA, B; Деление старшего байта произведения

MOVB, 53h; на значение скорости или на 100.

DIVAB

MOV 54h, A; Целая часть от деления.

MOV 55h, B; Остаток от деления.

MOVA, 53h; Деление делителя (значение скорости

MOVB, #0Ah; или 100) на 10.

DIVAB

MOV 56h, A; Целая часть от деления делителя на 10.

MOV 57h, B; Остаток от деления делителя на 10.

JZHELP; Если целая часть от деления делителя на 10

; равна нулю, то переход в метку HELP.

MOVA, 57h

MOVB, #4h; Если остаток от деления делителя на 10 равен

SUBBA, B; 4, то переход в метку B5.

JZB5

MOVA, 57h

MOVB, #6h; Если остаток от деления делителя на 10 равен

SUBBA, B; 6, то переход в метку B5.

JZB5

MOVA, #4h; Если остаток от деления делителя на 10

CJNEA, 57h, C1 ; больше 4, то переход в метку B1.

C1: JCB1

JNCB3 ; Если меньше 4, то в метку B3.

B1: MOVA, #6h; Если остаток от деления делителя на 10

CJNEA, 57h, C; больше 6, то переход в метку B7.

C2: JCB7

JNCB2 ; Если равен 5, то в метку B2.

B2: MOVA, 56h; Получено, что остаток от деления делителя

MOVB, #2h; на 10 равен 5, тогда целая часть от деления

MULAB; делителя на 10 умножается на 2.

MOV 52h, A

INC 52h; Увеличение результата на 1. (новый делитель)

MOVA, 55h; Остаток от деления числителя формул

MOVB, 52h; (4) или (6) делится на новый делитель.

DIVAB

MOV 41h, B; Остаток от деления на новый делитель.

MOVB, #2h; Умножение целой части от деления на

MULAB; новый делитель на 2.

MOV 57h, A; В результате получены десятые доли

; деления старшего байта произведения.

MOVA, 41h; Умножение остатка от деления на новый

MOVB, #2h; делитель на 2.

MULAB

MOVB, 52h; Результат этого умножения снова делится

DIVAB; на новый делитель и целая часть этого

ADDA, 57h; деления складывается с десятыми долями

MOV 57h, A; деления старшего байта произведения.

MOV 56h, 52h

MOV 42h, B; Остаток последнего деления фиксируется.

SJMPVPERED; Переход к нахождения сотых долей.

B3: MOVA, #1h; Если остаток от деления делителя на 10

CJNEA, 57h, C3 ; 0 или 1, то переход в метку HELP_1.

C3: JNCHELP_1

JCB4 ; Если больше 1, то в метку B4.

B4: MOVA, #2h; Если остаток от деления делителя на 10

CJNEA, 57h, C4 ; равен 2, то переход в метку B5.

C4: JNCB5

JCB6 ; Если равен 3, то в метку B6.

HELP: JMPD_0 ; Переход в метку D_0.

B5: MOVA, 56h; Если остаток от деления делителя на 10

MOVB, #5h; равен 2, 4, 6 или 8, тогда целая часть от

MULAB; деления делителя на 10 умножается на 5.

MOV 52h, A

MOVA, 57h; Остаток от деления делителя на 10

MOVB, #2h; делится на 2 и складывается с предыдущим

DIVAB; результатом. Получен новый делитель.

ADDA, 52h

MOV 52h, A

MOVA, 55h; Остаток от деления числителя формул

MOVB, 52h; (4) или (6) делится на новый делитель.

DIVAB

MOV 41h, B; Остаток от деления на новый делитель.

MOVB, #5h; Умножение целой части от деления на

MULAB; новый делитель на 5.

MOV 57h, A; В результате получены десятые доли

; деление старшего байта произведения.

MOVA, 41h; Умножение остатка от деления на новый

MOVB, #5h; делитель на 5.

MULAB

MOVB, 52h; Результат этого умножения снова делится

DIVAB; на новый делитель и целая часть этого

ADDA, 57h; деления складывается с десятыми долями

MOV 57h, A; деления старшего байта произведения.

MOV 56h, 52h

MOV 42h, B; Остаток последнего деления фиксируется.

JMP VPERED ; Переход к нахождения сотых долей.

B7: MOVA, #8h; Если остаток от деления делителя на 10

CJNEA, 57h, C5 ; равен 9, то переход в метку HELP_1.

C5: JCDALEE

JNCB8 ; Если меньше или равен 8, то в метку B8.

B8: MOVA, #7h; Если остаток от деления делителя на 10

CJNEA, 57h, C6 ; равен 8, то переход в метку B5.

C6: JCB5

JNCB6 ; Если равен 7, то переход в метку B6.

HELP_1: SJMPDALEE; Переход в метку DALEE.

B6: MOVA, 56h; Если остаток от деления делителя на 10

MOVB, #3h; равен 3 или 7, тогда целая часть от

MULAB; деления делителя на 10 умножается на 3.

MOV 52h, A

MOVA, #5h; Полученный результат в случае, если

CJNEA, 57h, RAZD; остаток от деления делителя на 10 равен 7

RAZD: JCDEL1 ; увеличивается на 2. А если остаток равен

JNCDEL2 ; 3, то - на 1. Получен новый делитель.

DEL1: INC 52h

INC 52h

SJMPRETURN; Переход в метку RETURN.

DEL2: INC 52h

RETURN: MOVA, 55h; Остаток от деления числителя формул

MOVB, 52h; (4) или (6) делится на новый делитель.

DIVAB

MOV 41h, B; Остаток от деления на новый делитель.

MOVB, #3h; Умножение целой части от деления на

MULAB; новый делитель на 3.

MOV 57h, A; В результате получены десятые доли

; деление старшего байта произведения.

MOVA, 41h; Умножение остатка от деления на новый

MOVB, #3h; делитель на 3.

MULAB

MOVB, 52h; Результат этого умножения снова делится

DIVAB; на новый делитель и целая часть этого

ADDA, 57h; деления складывается с десятыми долями

MOV 57h, A; деления старшего байта произведения.

MOV 56h, 52h

MOV 42h, B; Остаток последнего деления фиксируется.

SJMPVPERED; Переход к нахождения сотых долей.

D_0: MOVA, 55h; Если целая часть от деления делителя на

MOVB, #0Ah; 10 равна нулю, то остаток от деления

MULAB; числителя формул (4) или (6) умножается

MOVB, 53h; на 10 и делится на значение скорости.

DIVAB

MOV 56h, 53h; Делитель не меняется(значение скорости).

MOV 57h, A; В результате получены десятые доли

; деления старшего байта произведения.

MOV 42h, B; Остаток последнего деления фиксируется.

SJMPVPERED; Переход к нахождения сотых долей.

DALEE: MOVA, #5h; Остаток от деления делителя на 10

CJNEA, 57h, RAZD2 ; равен 0, 1 или 9. В случае если остаток

RAZD2: JCDEL3 ; равен 9, то целая часть от деления

SJMPRETURN1 ; увеличивается на 1. В противном случае

DEL3: INC 56h; она не меняется.

RETURN1: MOVA, 55h; Остаток от деления числителя формул

MOVB, 56h; (4) или (6) делится на новый делитель.

DIVAB

MOV 57h, A; В результате получены десятые доли

; деления старшего байта произведения.

MOV 42h, B; Остаток последнего деления фиксируется.

VPERED: MOVA, #0Ah; Для нахождения сотых долей деления

MOVB, 42h; старшего байта произведения, остаток

MULAB; предыдущего деления умножается на 10.

MOV 42h, A

MOVA, #0h; Если данное произведение выходит за

CJNEA, B, OSH; рамки одного байта, то в целях

OSH: JCOSH1 ; уменьшения погрешности конечного

MOV 58h, #0h; результата, этот факт учитывается как

SJMPDALSE; 5 сотых долей.

OSH1: MOV 58h, #5h

DALSE: MOVA, 42h; Полученное произведение делится на

MOVB, 56h; делитель.

DIVAB

ADDA, 58h; Учет 5 сотых (если они есть).

MOV 58h, A; В результате получены сотые доли

; деления старшего байта произведения.

MOVA, #0Ah; Для нахождения тысячных долей деления

MULAB; старшего байта произведения, остаток

MOV 42h, A; от деления снова умножается на 10.

MOVA, #0h

CJNEA, B, OSH2 ; Аналогичный способ уменьшения

OSH2: JCOSH4 ; погрешности в результате.

MOV 58h, #0h

SJMP DALSE2

OSH4: MOV 59h, #5h

DALSE2: MOVA, 42h; Полученное произведение делится на

MOVB, 56h; делитель.

DIVAB

ADDA, 59h; Учет 5 тысячных (если они есть).

MOV 59h, A ; В результате получены тысячные доли

; деления старшего байта произведения.

MOVA, 54h; Умножение полученного частного от

; деления старшего байта произведения

MOVB, #0FFh; на 256 (т.к. старший байт).

MULAB; Сначала умножается, целая часть от

ADDA, 54h; деления старшего байта произведения.

JC PER

SJMP NPER

PER: INC B

NPER: MOV 60h, B; Старший байт конечного результата.

MOV 61h, A; Младший байт конечного результата.

MOVA, 57h; Умножаются десятые доли на 25,6 и

MOVB, #19h; результат суммируется с младшим байтом

MULAB; конечного результата.

ADDA, 61h

MOV 61h, A

MOV A, 57h

MOV B, #6h

MUL AB

MOV B, #0Ah

DIV AB

ADDA, 61h

MOV 61h, A

MOVA, #4h; Округление результата. Если остаток

CJNEA, B, OKR1 ; больше 4, то значение увеличивается на 1.

OKR1: JC OKR2

SJMP DALEE1

OKR2: INC 61h

DALEE1: MOVA, 58h; Умножаются сотые доли на 2,6 и

MOVB, #2h; результат суммируется с младшим

MULAB; байтом конечного результата.

ADD A, 61h

MOV 61h, A

MOV A, 58h

MOV B, #6h

MUL AB

MOV B, #0Ah

DIV AB

ADD A, 61h

MOV 61h, A

MOVA, #4h; Округление результата.

CJNE A, B, OKR3

OKR3: JC OKR4

SJMPDALEE2

OKR4: INC 61h

DALEE2: MOVA, 59h; Умножаются тысячные доли на 0,2 и

MOVB, #3h; результат суммируется с младшим

MULAB; байтом конечного результата.

MOV B, #0Ah

DIV AB

ADD A, 61h

JC PER1

SJMP NPER1

PER1: INC 60h

NPER1: MOV 61h, A

MOVA, #4h; Округление результата.

CJNE A, B, OKR5

OKR5 JC OKR6

SJMP DALE

OKR6: INC 61h

DALE: MOV A, 50h ; Делениемладшегобайтапроизведения

MOVB, 53h; на значение скорости или на 100.

DIVAB

ADDA, 61h; Результат суммируется с младшим

; байтом конечного результата.

JCPER2

SJMPNPER2

PER2: INC 60h

NPER2: MOV 61h, A; Для уменьшения погрешности

MOVA, B; конечного результата остаток от

MOVB, #2h; деления младшего байта участвует

MULAB; в округлении.

MOVB, 53h

DIV AB

MOV B, A

MOV A, #0h

CJNE A, B, OK

OK: JC OK1

SJMPDALEE3

OK1: INC 61h

; Преобразование в десятичную форму записи

DALEE3: MOVA, 61h; Разбиваем наше 16-разрядное значение

CLRACC.7 ; на 3 4-разрядных.

CLRACC.6

CLRACC.5

CLRACC.4

MOV 42h, A; Младшее 4-разрядное значение.

MOV A, 61h

CLR ACC.3

CLR ACC.2

CLR ACC.1

CLR ACC.0

SWAPA

MOV 41h, A; Среднее 4-разрядное значение.

MOV 40h, 60h; Старшее 4-разрядное значение.

MOV A, 41h ; Среднее 4-разрядное значение

MOVB, #06h; умножается на 6.

MULAB

MOVB, #0Ah; Затем делится на 10. Целая часть - число

DIVAB; десятков, остаток - число единиц.

MOV 45h, A; Число десятков.

MOV 46h, B; Число единиц.

MOVA, 40h; Старшее 4-разрядное значение

MOVB, #06h; умножается на 6.

MULAB

ADDA, 46h; Результат складывается с числом единиц.

ADDA, 42h

MOVB, #0Ah; Потом делится на 10.

DIVAB

ADDA, 45h; Целая часть от деления складывается с

MOV 45h, A; числом десятков.

MOV 46h, B; Остаток - окончательное число единиц.

MOVA, 40h; Старшее 4-разрядное значение

MOVB, #5h; умножается на 5.

MULAB

ADDA, 41h; Результат складывается с числом десятков

ADDA, 45h

MOVB, #0Ah; Потом делится на 10.

DIVAB

MOV 44h, A; Число сотен.

MOV 45h, B; Окончательное число десятков.

MOVA, 40h; Старшее 4-разрядное значение

MOVB, #2h; умножается на 2.

MULAB

ADD A, 44h ; Результат складывается с числом сотен

MOV 44h, A ; Окончательное число сотен.

; Вывод результата на трехразрядный семисегментный индикатор

MOV 60h, #11000000b ; Цифра 0.

MOV 61h, #11111001b ; Цифра 1.

MOV 62h, #10100100b ; Цифра 2.

MOV 63h, #10110000b ; Цифра 3.

MOV 64h, #10011001b ; Цифра 4.

MOV 65h, #10010010b ; Цифра 5.

MOV 66h, #10000010b ; Цифра 6.

MOV 67h, #11111000b ; Цифра 7.

MOV 68h, #10000000b ; Цифра 8.

MOV 69h, #10010000b ; Цифра 9.

; Определение выводимых на индикатор цифр (т.е. двоичных комбинаций)

MOVR0, #60h; Номер ячейки памяти с цифрой 0.