- •1.Организация микроконтроллера мк1816
- •1.1.Общие сведения о семействе микроконтролеров к1816.
- •2.Арифметическо-логическое устройство (алу) микроконтроллера мк1816
- •3.Память микроконтроллера мк1816
- •3.1.Память программ (или - память команд, пк)
- •3.2.Память данных (или - оперативная память, озу)
- •4.Организация ввода – вывода в микроконтроллере мк1816
- •4.1.Порты (или каналы) ввода - вывода р1 и р2.
- •4.2.Порт ввода - вывода bus (или db).
- •5.Управление работой микроконтроллера мк1816
- •5.1.Синхронизация микроконтроллера.
- •5.2.Системный сброс.
- •5.3.Пошаговый режим работы.
- •6.Варианты структур микроконтроллерных систем(мкс) на основе мк1816
- •6.1.Мк-система с расширенной памятью программ.
- •6.2.Мк-система с расширенной памятью данных.
- •6.3.Мк-система с расширенным вводом-выводом.
- •7.Система команд микроконтроллера мк1816
- •7.1.Команды пересылки и обмена
- •7.2.Команды арифметических и логических операций (в том числе и операций над признаками)
- •7.2.1.Общие сведения.
- •7.2.2.Команды группы арифметических операций
- •7.2.3.Команды группы логических операций:
- •Xrl a,Rr - Исключающее или аккумулятора с маской в регистре
- •Xrl a,#d - Исключающее или аккумулятора с непосредственным операндом
- •Xrl a,@Rr - Исключающее или аккумулятора и маской в ячейке памяти
- •7.3.Команды ввода – вывода
- •7.4.Команды передачи управления (в том числе и операций с подпрограммами)
- •7.5.Команды операций с таймером
- •7.6.Команды управления режимом работы мк
7.2.Команды арифметических и логических операций (в том числе и операций над признаками)
7.2.1.Общие сведения.
Микроконтроллер 1816 выполняет операции сложения, инкремента и декремента, сдвигов, конъюнкции, дизъюнкции и т.д. над непосредственным операндом, содержимым аккумулятора, регистров или ячеек памяти. В МК 1816 нет команд вычитания, что приводит к необходимости ее замены последовательностью операций: получение дополнительного кода содержимого аккумулятора, суммирование числа с содержимым аккумулятора и вычисление дополнительного кода результата. Все более сложные операции (умножение, деление, возведение в степень и т. д.) выполняются по подпрограммам.
7.2.2.Команды группы арифметических операций
Изменяют состояние регистра признаков. Из множества признаков результата операции для пользователя программно-доступны только четыре признака: перенос, вспомогательный перенос, а также признаки F0 и F1, функциональное назначение которых специфицируется программистом. Признак F0, кроме того, доступен через слово состояния программы, формат которого показан на рисунке.
ADD A,Rr - Прибавить содержимое регистра к аккумулятору
"0110'1rrr", "6*"
(А) <-- (A) + (Rr); где r = {0 ÷ 7}
ADD A,#d - Прибавить непосредственный операнд к аккумулятору
"0000'0011", "03" [d0 - d7 ]
(A) <-- (A) + d
ADD A,@Rr - Прибавить содержимое ячейки памяти к аккумулятору
"0110'000r", "60" для R0 и "61" для R1
(А) <-- (A) + ((Rr)) где r = {0 ÷ 7}
ADDC A,Rr - Прибавить признак переноса и содержимое
регистра к аккумулятору
"0111'1rrr", "7*"
(А) <-- (A) + (Rr) + (С) где r = {0 ÷ 7}
ADDC A,#d - Прибавить признак переноса и непосредственный
операнд к аккумулятору
"0001'0011", "13"
(А) <-- (A) + d + (С)
ADDC A,@Rr - Прибавить признак переноса и содержимое памяти
к аккумулятору
"0111'000r", "70" для R0 и "71" для R1
(А) <-- (A) + ((Rr)) + (С)
DAA - Команда десятичной коррекции аккумулятора
"0101'0111", "57"
Это безопасная команда используется после команды двоичного сложения десятичных двоично-кодированных чисел с целью формирования результата сложения по правилам десятичной арифметики. Коррекция выполняется следующим образом:
если в младшей тетраде зафиксирован результат больше 9 или если признак вспомогательного переноса равен 1, то к содержимому аккумулятора добавляется корректирующее число 6;
далее выполняется проверка старшей тетрады байта, и досуммирование числа 6 производится, если число в битах 4-7 превышает 9 или если признак С равен 1.
При переполнении в результате коррекции признак С устанавливается в 1.
INC A - Инкремент содержимого аккумулятора
"0001'0111", "17"
(А) <-- (A) + 1
INC Rr - Инкремент содержимого регистра
"0001'0rrr", "1*"
(Rr) <-- (Rr) + 1; r = {0 ÷ 7}
INC @Rr - Инкремент содержимого ячейки памяти
"0001'000r", "10" для R0 и "11" для R1
((Rr)) <-- ((Rr)) + 1; r = {0 ÷ 7}
DEC A - Декремент содержимого аккумулятора
"0000'0111", "07"
(A) <-- (A) - 1;
DEC Rr - Декремент содержимого регистра
"1100'1rrr", "C*"
(Rr) <-- (Rr) - 1; r = {0 ÷ 7}
RL A - Циклический сдвиг влево содержимого аккумулятора
"1110'0111", "E7"
(Аn+1) <-- (An); (А0) <-- (A7); n = {0 ÷ 7}
RLC A - Циклический сдвиг влево через перенос
"1111'0111", "E7"
(Аn+1) <-- (An); (А0) <-- (C); (C) <-- (A7); n = {0 ÷ 7}
RR A - Циклический сдвиг вправо содержимого аккумулятора
"0111'0111", "77"
(Аn) <-- (An+1); (А7) <-- (A0); n = {0 ÷ 7}
RRC A - Циклический сдвиг влево через перенос
"0110'0111", "67"
(Аn) <-- (An+1); (А7) <-- (C); (C) <-- (A0); n = {0 ÷ 7}
Работу команд RL, RLC, RR и RRC иллюстрирует схема выполнения операций сдвига, показаггая на рисунке ниже
SWAP A - Обменять тетрады в аккумуляторе
"0100'0111", "E7"
(А4-7) <-- (A0-3);
Пример: неупакованные десятичные двоично-кодированные цифры находятся в ячейках 10 и 31. Требуется упаковать их в ячейку 10.
PACK: MOV R0,#10 ; загрузка регистра R0
MOV R1,#31 ; загрузка регистра R1
XCHD A,@R0 ; обменять биты 0-3 аккумулятора и ячейки 10 памяти
SWAP A ; обменять тетрады в аккумуляторе
XCHD A,@R1 ; обменять биты 0-3 аккумулятора и ячейки 31 памяти
MOV @R0,A ; перечлать А в ячейку 10 памяти