;++++++++++++++ Блок опису змінних ++++++++++++++++++++++++++++++++
.EQU AMPL,200FH ; Адреса змінної, яка містить значення амплітуди
.EQU Tp,2010H ; Адреса змінної, яка містить значення періоду
.EQU Fp,2256
.EQU K,2002H
.EQU NV,20F0H ; Адреса змінної, яка містить номер відліку
.EQU N,128 ; Кількість відліків
.EQU DAC,00H ; Порт ЦАП
.EQU INDYK,01H ; Порт індикатора
.EQU KLAVA,10H ; Порт клавіатури
;-----------------------------------------------------------------
.ORG 2701H
.DB 7DH,52H,00H,4DH ; Коди чисел 1,2,4 для індикатора
; 1 = 0111 1101
; 2 = 0101 0010
; 4 = 0100 1101
;++++++++++++++ Масив відліків ++++++++++++++++++++++++++++++++++++
.ORG 0400H
.DB 80H,86H,8CH,92H,98H,9FH,A5H,ABH,B0H,B6H,BCH,C1H,C7H,CCH,D1H,D5H
.DB DAH,DEH,E2H,E6H,EAH,EDH,F0H,F3H,F6H,F8H,FAH,FCH,FDH,FEH,FFH,FFH
.DB FFH,FFH,FFH,FEH,FDH,FCH,FAH,F8H,F6H,F3H,F0H,EDH,EAH,E6H,E3H,DEH
.DB DAH,D6H,D1H,CCH,C7H,C1H,BCH,B6H,B1H,ABH,A5H,9FH,99H,92H,8CH,86H
.DB 80H,79H,73H,6DH,67H,61H,5BH,55H,4FH,49H,43H,3EH,39H,33H,2EH,2AH
.DB 25H,21H,1DH,19H,15H,12H,0FH,0CH,09H,07H,05H,03H,02H,01H,00H,00H
.DB 00H,00H,00H,01H,02H,03H,05H,07H,09H,0CH,0EH,12H,15H,18H,1CH,20H
.DB 25H,29H,2EH,33H,38H,3DH,43H,48H,4EH,54H,5AH,60H,66H,6CH,73H,79H
;------------------------------------------------------------------
;++++++++++++++ Блок ініціалізації ++++++++++++++++++++++++++++++++
.ORG 0
LXI SP,2800H ; Об’явити стек
LXI H,200FH
MVI A,01H ; Присвоїти AMPL значення 1
MOV M,A
INX H
MOV M,A ; Присвоїти Tp значення 1
MVI A,82H ; Запрограмувати паралельний
OUT 03H ; інтерфейс
;-----------------------------------------------------------------
STARTNV:MVI A,00H
STA NV ; Присвоїти NV=0(NV-номер відліка)
;++++++++++++++ Перевірити чи К=0 ++++++++++++++++++++++++++++++++
STARTK: LHLD K
MOV A,H
CPI 00H ;Перевірити чи К=0
JZ STKL ;Якщо К=0 то перейти на підпр. опит. клав.
DCX H ;інакше - зменшити К на 1
SHLD K
JMP START ;Перейти на START
;-----------------------------------------------------------------
STKL: CALL KLAV ;Опитування клавіатури
;++++++++++++++ Вивід на індикатори значення AMPL та Tp ++++++++++
START:MVI B,27H ; 2701h - адреса коду для виводу значення
LDA AMPL ; амплітуди чи періоду на індикатор
MOV C,A
LDAX B
OUT INDYK ; Вивести значення амплітуди(1,2,4) на індикатор
; 1 = 0111 1101
; 2 = 0101 0010
; 4 = 0100 1101
LDA Tp
MOV C,A
LDAX B
XRI C0H ; Декодування значення періоду
OUT INDYK ; Вивести значення періоду(1,2,4) на індикатор
; 1 = 1111 1101
; 2 = 1101 0010
; 4 = 1100 1101
;-----------------------------------------------------------------
;++++++++++++++ Вивід значення відліку сигналу на ЦАП ++++++++++++
LDA NV
MOV D,A
MVI B,04H
MOV C,D
LDAX B
MOV D,A
A1: LDA AMPL
CPI 01H ; Якщо AMPL=1 - вивести значення відліку
JNZ A2
MOV A,D
OUT DAC
JMP T1
A2: CPI 02 ; Якщо AMPL=2 - вивести значення відліку/2
JZ A3
MOV A,D
RRC ; Поділити значення відліку на 2
ANI 7FH ; Замаскувати 2 старших розряда А
OUT DAC ; Вивести значення відліку/2
JMP T1
A3: MOV A,D ; Якщо AMPL=4 - вивести значення відліку/4
RRC ; Поділити значення відліку на 2
RRC ; Поділити значення відліку на 2
ANI 3FH ; Замаскувати 2 старших розряда А
OUT DAC ; Вивести значення відліку/4
JMP T1
;-----------------------------------------------------------------
;++++++++++++++ Організація затримки +++++++++++++++++++++++++++++
T1: LDA Tp ; Якщо Tp=1 – затримка dT
CPI 01H
JZ T2
;(WAIT DT)
JMP NPP
T2: CPI 02H ; Якщо Tp=2 – затримка 2*dT
JZ T3
;(WAIT 2DT)
JMP NPP
T3: ;(WAIT 4DT) ; Якщо Tp=4 – затримка 4*dT
;-----------------------------------------------------------------
;++++++++++++++ Організація переходу до наступного відліку +++++++
NPP: LDA NV
INR A ;Збільшити індекс для масиву значень відліків
STA NV
CPI N ;Перевірити чи номер відліку=N (N=128)
JZ STARTNV ;якщо так - перейти на STARTNV
JMP STARTK ;інакше перейти на STARTK
;-----------------------------------------------------------------
;++++++++++++++ Підпрограма опитування клавіатури ++++++++++++++++
.ORG 0700H
KLAV: IN KLAVA ; Ввести байт даних з порту клавіатури
ANI 03H ; перевірити чи натиснеі клавіші
JZ Kp ; якщо ні - перехід на Kp
CPI 02H ; Перевірити, чи натиснена клавіша зміни періоду
JZ Zt ; якшо так - змінити період
; якщо ні - перейти на Kp
LDA AMPL ; Зміна амплітуди
RLC
STA AMPL
CPI 08H
JNZ Kp
MVI A,01H ; Якщо AMPL=8
STA AMPL ; занести в AMPL 1
JMP Kp ; якщо ні - перейти на Kp
Zt: LDA Tp ; Зміна періоду
RLC
STA Tp
CPI 08H
JNZ Kp
MVI A,01H
STA Tp
Kp: LXI H,Fp ; Присвоїти К значення Fp(Fp=2256)
SHLD K
RET ; Вихід з підпрограми
;-----------------------------------------------------------------
;++++++++++++++ Підпрограма затримки +++++++++++++++++++++++++++++
.ORG 0750H
WAIT: DCX B
MOV A,B
ORA C
JNZ WAIT
;-----------------------------------------------------------------