
Алгоритм вычисления арифметического выражения.
Считываем х1 ;
Считываем х2 ;
Вычисляем (х1 + х2) ;
Значение (х1 + х2) помещаем в ОЗУ ;
Вычисляем (х1 + х2) 2 ;
Вычисляем (х1 + х2) 3 ;
Считываем х3 ;
Вычисляем
;
Значение
помещаем в ОЗУ;
Преобразуем полученное значение у в двоично-десятичный код;
Значение у передаем на индикаторы;
Переходим к п.1.
Листинг программы.
// Присваиваем значения через EQU
DATAADDR EQU $0000
CODEADDR EQU $4000
PORTA EQU 1000
DDRD EQU 1009
// Регистры последовательного порта SPI
SPCR EQU 1028
SPSR EQU 1029
SPDR EQU 102A
// Адреса семисегментных индикаторов
INDIC_21 EQU $3400
INDIC_43 EQU $3401
INDIC_65 EQU $3402
ORG DATAADDR //Присваиваем значение счетчику адреса
AI1 FCB 0 //FCB = DB
AI2 FCB 0
AI3 FCB 0
AI_TMP FCB 0
AI1REZULT FCB 0
ORG CODEADDR
START: // Инициализируем SPI
LDAA #%00111111 // Загружаем в аккумулятор A
STAA SPCR // Сохраняем аккумулятор А
LDAA #%01111111
STAA SPCR
LDAA #%00010000
STAA DDRD
LDY SPSR // Загрузить в регистр Y содержимое SPSR
LDY SPDR // Загрузить в регистр Y содержимое SPDR
LDAA #%01010000 // Выбираем АЦП канал 1
STAA SPDR
LOOP1: // Ожидание готовности порта SPI
LDY SPSR // Загрузить в регистр Y содержимое SPSR
BRCLR 0,#80,LOOP1
LDD SPDR //Загружаем в 16-ти разрядный аккумулятор D содержимое SPDR
STAB AI1
LDAA #%01010001 // Выбираем АЦП канал 2
STAA SPDR
LOOP2: // Ожидание готовности порта SPI
LDY SPSR // Загрузить в регистр Y содержимое SPSR
BRCLR 0,#80,LOOP2
LDD SPDR
STAB AI2
LDAA #%01010010 // Выбираем АЦП канал 3
STAA SPDR
LOOP3: // Ожидание готовности порта SPI
LDY SPSR // Загрузить в регистр Y содержимое SPSR
BRCLR 0,#80,LOOP3
LDD SPDR
STAB AI3
// Рассчитываем значение согласно формулы y = x3/(x1+x2)3
LDAA AI1 // Загружаем в аккумулятор А x1
LDAB AI2 // Загружаем в аккумулятор В x2
ABA // Складываем
STAB AI_TMP // Сохраняем в ОЗУ полученное значение
TBA // Копируем B в A, чтобы можно было перемножить
LDAB AI_TMP // Загружаем в аккумулятор B x1+x2
MUL // Перемножаем А и В. Получили (x1+x2)2
XGDX // Обмен содержимым регистра D с индексным регистром X
TBA
LDAB AI_TMP
MUL // Перемножаем А и В. Получили (x1+x2)3
XGDX
LDAA AI3 // Загружаем в аккумулятор А x3
IDIV // Делим
STAB AIREZULT // Сохраняем в ОЗУ полученное значение
// Выводим на семисегментные индикаторы полученное значение
// Для этого нужно предварительно преобразовать полученное значение
// в двоично-десятичный код
LDAB AIREZULT // Загружаем в аккумулятор В полученное значение функции
LDX #10 // Загружаем в регистр Х константу 10
IDIV // Делим
STAB INDIC_TMP // Сохраняем во временную переменную данные для 1-го индикатора
XGDX
LDX #10
IDIV // Получили данные для 2-го индикатора
LDY #4
// Сдвиг на 4 бита влево
LOOP4: ROLB // Циклический сдвиг влево аккумулятора B
DEY // Уменьшение индексного регистра Y на 1
CPY ZERO // Сравниваем индексный регистр Y
BGT LOOP4 // Если Y > 0, то продолжаем цикл
EORB INDIC_TMP // Операция Искл. ИЛИ для совмещения данных для 2-х индикаторов
STAB INDIC_21 // Запись данных на индикаторы
XGDX
LDX #10 // Загружаем в регистр Х константу 10
IDIV // Делим
STAB INDIC_TMP // Сохраняем во временную переменную данные для 3-го индикатора
XGDX
LDX #10
IDIV // Получили данные для 4-го индикатора
LDY #4
// Сдвиг на 4 бита влево
LOOP5: ROLB
DEY
CPY ZERO
BGT LOOP5
EORB INDIC_TMP // Операция Искл. ИЛИ для совмещения данных для 2-х индикаторов
STAB INDIC_43 // Запись данных на индикаторы
XGDX
LDX #10 // Загружаем в регистр Х константу 10
IDIV // Делим
STAB INDIC_TMP // Сохраняем во временную переменную данные для 5-го индикатора
XGDX
LDX #10
IDIV // Получили данные для 6-го индикатора
LDY # 4
// Сдвиг на 4 бита влево
LOOP6: ROLB
DEY
CPY ZERO
BGT LOOP6
EORB INDIC_TMP // Операция Искл. ИЛИ для совмещения данных для 2-х индикаторов
STAB INDIC_65 // Запись данных на индикаторы
XGDX
JMP START //Безусловный переход к началу программы