Листинг программы. Главная программа. Определение вершины стека. Переход на подпрограмму MAIN. Вектор прерывания по входу INT0, страница 2

CALL OUTPUT                   ; передача байта

INC             R0

DJNZ          R7, LOOP        ; цикл передачи

RET

RS:            ORG 0000H;                        ; основная программа

JMP VZVESTAR

ORG 0003H                         ; вектор прерывания по INT

CALL   TRANSMIT

RET I

ORG 0050H

MOV SP, #70H                   ; опред. стек.

CLR P 1.0                           ; вывод сигнала DTR

SETB EX0                ; разрешение прерывания по INT0

SETB EA                            ; общее разрешение прер.

CLR EX0                       ; запретить прерывание по INT

DJNZ R2, M1

JMP  M2

; Подпрограмма взвешивания

; выходные параметры по адресам внутренней памяти данных в данной программе

20H – младший байт первого датчика

21H – старший байт первого датчика

22H – младший байт второго датчика

23H – старший байт второго датчика

24H – младший байт третьего датчика

25H – старший байт третьего датчика

26H– младший байт четвертого датчика

27H– старший байт четвертого датчика

28H– младший байт пятого датчика

29Н– старший байт пятого датчика

VZVESH:      CLR P1.0; включение  SA1

CALL VVOD

SETB P1.4; включение SA2

CALL VVOD

MOV A, # 10H

MOV P1, A; включение SA3

CALL VVOD

RET

; Подпрограмма ввода данных

; входной параметр

R0 – адрес младшего байта результата работы подпрограммы

VVOD:  SETB P1.0

NOP

NOP

CLR P1.1; запуск АЦП

M1:         IN A, P1

RRC

JNC M1

SETB P1.1; подключение регистра ввода мл. б. из АЦП

MOVX A, @R1

MOV @R0, A

INC R0

MOV A, # 10H

MOV P1, A; подключение регистра ввода ст. б. из АЦП

MOVX A, @R1

MOV @R0, A

INC R0

CLR P1.0

RET

; Подпрограмма суммирования трех двухбайтных чисел расположенных в памяти подряд

; входные параметры

R0 – адрес младшего байта первого числа

R1 – адрес старшего байта первого числа

; выходные параметры

R0 – адрес младшего байта

R1 – адрес старшего байта

SUM:     MOV A, @R0

INC R0

INC R0

ADD A, @R0

MOV @R0, A

MOV A, @R1

INC R1

INC R1

ADDC A, @R1

MOV @R1, A

MOV A, @R0

INC R0

INC R0

ADD A, @R0

MOV @R0, A

MOV A, @R1

INC R1

INC R1

ADDC A, @R1

MOV @R1, A

RET

; Подпрограмма деления двухбайтного числа на однобайтное

; входные параметры

R0 – адрес младшего байта первого числа

R1 – адрес старшего байта первого числа

R5 – делитель в дополнительном коде

; выходные параметры

R2–  младший байт

R3 –  старший байт

DIV:       MOV R4, # 02H

MOV R3, # 00H

MOV R2, # 00H

M2:         MOV A, @R0

ADD A, R5

MOV @R0, A

JNC M1

MOV A, R2

ADD A, # 01H

MOV R2, A

JNC M2

INC R3

JMP M2

M1:         MOV A, @R1

ADD A, # FFH

MOV @R1, A

JNZ M2

MOV A, R4

ADD A, # FFH

MOV R4, A

JZ M3

INC @R1

JMP M2

M3:         RET

; Подпрограмма умножения двухбайтного числа на 100

; входные параметры

R2–  младший байт

R3 –  старший байт

; выходные параметры

R0 –  младший байт

R1 –  средний байт

R5 – старший байт

YM100:  MOV A, R2

MOV R0, A

MOV A, R3

MOV R1, A

MOV R4, # 64H; счетчик циклов

CYCLE:  MOV A, R0

ADD A, R2

MOV R0, A

MOV A, R1

ADDC A, R3

MOV R1, A

MOV A, R5

ADDC A, # 00H

MOV R5, A

DJNZ R4, CYCLE

RET

; Подпрограмма деления  трехбайтного числа на 273

; входные параметры

R0 –  младший байт

R1 –  средний байт

R5 – старший байт

; выходные параметры

R2–  младший байт

R3 –  старший байт

DIV2:     MOV R2, # 00H

MOV R3, # 00H

MOV R6, # 02H

M3:         MOV A, R2

ADD A, # 01H

MOV R2, A

JNC M1

INC R3

M1:        MOV A, R0

ADD A, # 0EFH

MOV R0, A

MOV A, R1

ADDC A, # FEH

MOV R1, A

JC M2

MOV A, R5

ADD A, # FFH

MOV R5, A

JZ M3

JMP M4

M3:         INC R5

MOV A, R6

ADD A, # FFH

MOV R6, A

JNZ M4

MOV A, R2

ADD A, # FFH

MOV R2, A

JC M2

DEC R3

M2:         RET

; Подпрограмма вычисления двоично-десятичного кода

; входные параметры

R0 – адрес младшего байта

R1 – адрес старшего байта

; выходные параметры

R6–  тысячи и сотни

R7 –  десятки и единицы

BCD:     MOV R5, # (NOT(10)+1); делитель

CALL DIV

MOV A, @R0

ADD A, # 0AH; восстановление остатка

MOV R7, A;  единицы

MOV A, R2

MOV @R0, A; младший байт

MOV A, R3

MOV @R1, A; старший байт

CALL DIV

MOV A, @R0

ADD A, # 0AH; восстановление остатка

SWAP A

ORL A, R7; десятки и единицы

MOV A, R2

MOV @R0, A

MOV A, R3

MOV @R1, A

CALL DIV

MOV A, @R0

ADD A, # 0AH; восстановление остатка

MOV R6, A; сотни

MOV A, R2

MOV @R0, A

MOV A, R3

MOV @R1, A

CALL DIV

MOV A, @R0

ADD A, # 0AH; восстановление остатка

SWAP A

ORL A, R6; тысячи и сотни

RET