- •Аналоговые и цифровые устройства автоматики
- •Глава 1. Архитектура и устройство
- •1.1. Внутренняя организация мк
- •1.2. Назначение выводов микросхемы мк
- •1.3. Организация памяти в мк
- •1.4. Регистр состояния программы psw
- •1.5. Таймеры/счетчики, регистры tmod и tcon
- •1. 6. Режимы работы таймеров/счетчиков
- •Структура прерываний мк
- •1.8. Блок последовательного интерфейса мк
- •1.8.1. Последовательная передача информации
- •1.8.2. Последовательный порт однокристального мк
- •1.8.3. Регистр управления последовательным портом scon
- •1.8.4. Режимы работы последовательного порта
- •1.8.5. Асинхронный обмен (режимы 1,2,3) данными
- •1.8.6. Скорость приёма/передачи
- •1.8.7. Работа мк в локальной сети
- •1.9. Системный сброс однокристального мк
- •1.10. Режим пониженного энергопотребления мк
- •1.11. Нагрузочная способность портов ввода/вывода
- •1. 12. Расширение портов ввода/вывода
- •Глава 2. Система команд однокристальных мк семейства mcs51
- •Способы адресации операндов
- •2.2. Команды мк
- •2.3. Правила написания программ на языке assembler
- •Метка операция операнд(ы) комментарии
- •2.3.1. Метка
- •2.3.2. Операция
- •2.3.3. Операнды
- •2.3.4. Комментарий
- •2.4. Директивы ассемблера
- •2.4.1. Директивы символических определений
- •Пример:
- •Ozu_org xdata 0800h; Адрес начала области внешнего озу.
- •2.4.2. Директивы резервирования и инициализации памяти
- •2.4.3. Директивы управления состоянием ассемблера
- •Глава 3. Обработка данных в однокристальных микроконтроллерах
- •3.1. Обращение к внутренней, внешней памяти данных и памяти программ
- •3.2. Арифметические операции
- •3.3. Логические операции
- •3.4. Операции с битами
- •Глава 4. Взаимодействие однокристального мк с объектом управления
- •4.1. Программный опрос и ожидание срабатывания позиционных датчиков
- •4.2. Ожидание импульсного сигнала
- •4.3. Программирование таймеров/счетчиков и формирование дискретных управляющих сигналов
- •4.4. Программирование прерываний в микропроцессорном устройстве
- •4.5. Программирование последовательного порта
- •Глава 5. Аппаратные средства
- •5.1. Ввод информации с клавиатуры
- •5.1.1. Прямое подключение клавиш к разрядам порта мк
- •В блоке основной программы происходит инициализация системы, разрешение прерываний, а затем выполняется основная программа.
- •Применение шифратора для организации клавиатуры
- •Шифратора
- •5.1.3. Матричный способ подключения клавиатуры
- •5.1.4. Комбинированный способ организации клавиатуры
- •5.2. Отображение информации в микропроцессорном устройстве
- •5.2.1. Контроллер клавиатуры и дисплея к580вв79 ( intel 8279 )
- •5.2.2. Матричные светодиодные индикаторы
- •5.2.3. Жидкокристаллический дисплей
- •Ввод аналоговых сигналов в микропроцессорный контроллер
- •Ацп с параллельными цифровыми выходами
- •5.3.2. Применение ацп с последовательным выходом
- •5.3.3. Применение таблиц для вычисления функций
- •5.4. Формирование управляющих аналоговых сигналов
- •5.5. Построение ацп с использованием цап
- •5.6. Микропроцессорный контроллер как управляющее устройство в системах автоматического регулирования
- •Согласование дискретных датчиков и исполнительных механизмов с однокристальным мк
- •5.8. Контроль напряжения питания в микропроцессорных системах
- •Глава 6. Отладка программного обеспечения и программирование однокристальных мк
- •6.1. Интегрированная система отладки программного обеспечения для мк ProView
- •6.1.1. Оптимизирующий кросс - компилятор c51
- •6.1.2. Макроассемблер a51
- •6.1.4. Отладчик/симулятор WinSim51
- •6.2. Запуск ProView и создание файла проекта
- •Если в системе задействованы таймеры-счетчики, то удобно промоделировать их работу при разворачивании соответствующих окон Timer (рис.76).
- •В окне указаны источники и адреса векторов прерываний, их состояние и приоритет. Разрешенные прерывания отмечены словом Enable, неразрешенные - Not Enable.
- •Рассмотрим основные пункты раздела debug (отладка), представлены на рис. 84. Эти функции предназначены для выполнения процесса отладки прикладной программы пользователя.
- •6.3. Программирование однокристальных мк
- •Контрольные вопросы для закрепления материала
- •Заключение
- •Библиографический список
- •Глава 1. Архитектура и устройство однокристальных мк семейства mcs51………………………..6
- •Глава 6. Отладка программного обеспечения и программирование однокристальных мк ……….203
- •162600, Г.Череповец , пр. Луначарского, 5
2.2. Команды мк
Рассмотрим мнемонику и назначение команд, представленных в табл. 15.
Таблица 15
Мнемоника |
Код |
Кол – во байт |
Кол – во циклов |
ACALL addr11 |
11 |
2 |
2 |
|
31 |
2 |
2 |
|
51 |
2 |
2 |
|
71 |
2 |
2 |
|
91 |
2 |
2 |
|
B1 |
2 |
2 |
|
D1 |
2 |
2 |
|
F1 |
2 |
2 |
Продолжение табл. 15
Мнемоника |
КОД |
Кол-байт |
Кол-во циклов |
ADD A, RØ |
28 |
1 |
1 |
A,R1 |
29 |
1 |
1 |
A,R2 |
2A |
1 |
1 |
A,R3 |
2B |
1 |
1 |
A,R4 |
2C |
1 |
1 |
A,R5 |
2D |
1 |
1 |
A,R6 |
2E |
1 |
1 |
A,R7 |
2F |
1 |
1 |
ADD A, #data |
24 |
2 |
1 |
ADD A, direct |
25 |
2 |
1 |
ADD A,@RØ |
26 |
1 |
1 |
A,@R1 |
27 |
1 |
1 |
ADDC A, RØ |
38 |
1 |
1 |
A, R1 |
39 |
1 |
1 |
A, R2 |
3A |
1 |
1 |
A, R3 |
3B |
1 |
1 |
A, R4 |
3C |
1 |
1 |
A, R5 |
3D |
1 |
1 |
A, R6 |
3E |
1 |
1 |
A, R7 |
3F |
1 |
1 |
ADDC A, #data |
34 |
2 |
1 |
ADDC A, direct |
35 |
2 |
1 |
ADDC A,@RØ |
36 |
1 |
1 |
A,@R1 |
37 |
1 |
1 |
AJMP addr 11 |
Ø1 |
2 |
2 |
|
21 |
2 |
2 |
|
41 |
2 |
2 |
|
61 |
2 |
2 |
|
81 |
2 |
2 |
|
A1 |
2 |
2 |
|
C1 |
2 |
2 |
|
E1 |
2 |
2 |
ANL A, RØ |
58 |
1 |
1 |
A, R1 |
59 |
1 |
1 |
A, R2 |
5A |
1 |
1 |
A, R3 |
5B |
1 |
1 |
A, R4 |
5C |
1 |
1 |
A, R5 |
5D |
1 |
1 |
A, R6 |
5E |
1 |
1 |
A, R7 |
5F |
1 |
1 |
ANL A, #data |
54 |
2 |
1 |
ANL A, direct |
55 |
2 |
1 |
ANL A, @RØ |
56 |
1 |
1 |
A, @R1 |
57 |
1 |
1 |
ANL direct,A |
52 |
1 |
1 |
ANL direct, #data |
53 |
3 |
2 |
ANL C, bit |
82 |
2 |
2 |
ANL C, /bit |
BØ |
2 |
2 |
CJNE A, # data, addr |
B4 |
3 |
2 |
Продолжение табл. 15
Мемоника |
КОД |
Кол-байт |
Кол-во циклов |
CJNE A, direct, addr |
B5 |
3 |
2 |
CJNE RØ, # data, addr |
B8 |
3 |
2 |
R1, # data, addr |
B9 |
3 |
2 |
R2, # data, addr |
BA |
3 |
2 |
R3, # data, addr |
BB |
3 |
2 |
R4, # data, addr |
BC |
3 |
2 |
R5, # data, addr |
BD |
3 |
2 |
R6, # data, addr |
BE |
3 |
2 |
R7, # data, addr |
BF |
3 |
2 |
CJNE @RØ, # data, addr |
B6 |
3 |
2 |
@RØ, # data, addr |
B7 |
3 |
2 |
CLR A |
E4 |
1 |
1 |
CLR bit |
C2 |
2 |
1 |
CLR C |
C3 |
1 |
1 |
CPL A |
F4 |
1 |
1 |
CPL bit |
B2 |
2 |
1 |
CPL C |
B3 |
1 |
1 |
DA A |
D4 |
1 |
1 |
DEC A |
14 |
1 |
1 |
DEC direct |
15 |
2 |
1 |
DEC RØ |
18 |
1 |
1 |
R1 |
19 |
1 |
1 |
R2 |
1A |
1 |
1 |
R3 |
1B |
1 |
1 |
R4 |
1C |
1 |
1 |
R5 |
1D |
1 |
1 |
R6 |
1E |
1 |
1 |
R7 |
1F |
1 |
1 |
DEC @RØ |
16 |
1 |
1 |
@R1 |
17 |
1 |
1 |
DIV AB |
84 |
1 |
4 |
DJNZ RØ, addr |
D8 |
2 |
2 |
R1, addr |
D9 |
2 |
2 |
R2, addr |
DA |
2 |
2 |
R3, addr |
DB |
2 |
2 |
R4, addr |
DC |
2 |
2 |
R5, addr |
DD |
2 |
2 |
R6, addr |
DE |
2 |
2 |
R7, addr |
DF |
2 |
2 |
DJNZ direct, addr |
D5 |
3 |
2 |
INC A |
Ø4 |
1 |
1 |
INC direct |
Ø5 |
2 |
1 |
INC DPTR |
A3 |
1 |
2 |
INC RØ |
Ø8 |
1 |
1 |
R1 |
Ø9 |
1 |
1 |
R2 |
ØA |
1 |
1 |
R3 |
ØB |
1 |
1 |
R4 |
ØC |
1 |
1 |
R5 |
ØD |
1 |
1 |
Продолжение табл. 15
Мемоника |
КОД |
Кол-байт |
Кол-во циклов |
INC R6 |
ØE |
1 |
1 |
R7 |
ØF |
1 |
1 |
INC @RØ |
Ø6 |
1 |
1 |
@R1 |
Ø7 |
1 |
1 |
JB bit, addr |
2Ø |
3 |
2 |
JBC bit, addr |
1Ø |
3 |
2 |
JC addr |
4Ø |
2 |
2 |
JMP @A+DPTR |
73 |
1 |
2 |
JNB bit, addr |
3Ø |
3 |
2 |
JNC addr |
5Ø |
2 |
2 |
JNZ addr |
7Ø |
2 |
2 |
JZ addr |
6Ø |
2 |
2 |
LCALL addr16 |
12 |
3 |
2 |
LJMP addr 16 |
Ø2 |
3 |
2 |
MOV A, direct |
E5 |
2 |
1 |
MOV A, RØ |
E8 |
1 |
1 |
A,R1 |
E9 |
1 |
1 |
A,R2 |
EA |
1 |
1 |
A,R3 |
EB |
1 |
1 |
A,R4 |
EC |
1 |
1 |
A,R5 |
ED |
1 |
1 |
A,R6 |
EE |
1 |
1 |
A,R7 |
EF |
1 |
1 |
MOV A, @RØ |
E6 |
1 |
1 |
A, @ R1 |
E7 |
1 |
1 |
MOV A, #data |
74 |
2 |
2 |
MOV bit, C |
92 |
2 |
1 |
M0V C, bit |
A2 |
2 |
1 |
MOV direct, A |
F5 |
2 |
2 |
MOV direct, #data |
75 |
3 |
2 |
MOV direct, direct |
85 |
3 |
2 |
MOV direct, RØ |
88 |
2 |
2 |
direct, R1 |
89 |
2 |
2 |
direct, R2 |
8A |
2 |
2 |
direct, R3 |
8B |
2 |
2 |
direct, R4 |
8C |
2 |
2 |
direct, R5 |
8D |
2 |
2 |
direct, R6 |
8E |
2 |
2 |
direct, R7 |
8F |
2 |
2 |
MOV direct, @RØ |
86 |
2 |
2 |
direct, @R1 |
87 |
2 |
2 |
MOV DPTR, #data 16 |
9Ø |
3 |
1 |
MOV RØ, A |
F8 |
1 |
1 |
R1, A |
F9 |
1 |
1 |
R2, A |
FA |
1 |
1 |
R3, A |
FB |
1 |
1 |
R4, A |
FC |
1 |
1 |
R5, A |
FD |
1 |
1 |
R6, A |
FE |
1 |
1 |
R7, A |
FF |
1 |
1 |
Продолжение табл. 15
Мемоника |
КОД |
Кол-байт |
Кол-во циклов |
MOV @RØ,A |
F6 |
1 |
1 |
@R1,A |
F7 |
1 |
1 |
MOV RØ, #data |
78 |
2 |
1 |
R1, #data |
79 |
2 |
1 |
R2, #data |
7A |
2 |
1 |
R3, #data |
7B |
2 |
1 |
R4, #data |
7C |
2 |
1 |
R5, #data |
7D |
2 |
1 |
R6, #data |
7E |
2 |
1 |
R7, #data |
7F |
2 |
1 |
MOV @RØ, #data |
76 |
2 |
1 |
@R1, #data |
77 |
2 |
1 |
MOV RØ, direct |
A8 |
2 |
2 |
R1, direct |
A9 |
2 |
2 |
R2, direct |
AA |
2 |
2 |
R3, direct |
AB |
2 |
2 |
R4, direct |
AC |
2 |
2 |
R5, direct |
AD |
2 |
2 |
R6, direct |
AE |
2 |
2 |
R7, direct |
AF |
2 |
2 |
MOV @RØ, direct |
A6 |
2 |
2 |
@R1, direct |
A7 |
2 |
2 |
MOVC A, @A+DPTR |
93 |
1 |
2 |
MOVC A, @A+PC |
83 |
1 |
2 |
MOVX A, @DPTR |
EØ |
1 |
2 |
MOVX A, @RØ |
E2 |
1 |
2 |
A, @R1 |
E3 |
1 |
2 |
MOVX @DPTR, A |
FØ |
1 |
2 |
MOVX @RØ, A |
F2 |
1 |
2 |
@R1, A |
F3 |
1 |
2 |
MUL AB |
A4 |
1 |
4 |
NOP |
ØØ |
1 |
1 |
ORL A, RØ |
48 |
1 |
1 |
A, R1 |
49 |
1 |
1 |
A, R2 |
4A |
1 |
1 |
A, R3 |
4B |
1 |
1 |
A, R4 |
4C |
1 |
1 |
A, R5 |
4D |
1 |
1 |
A, R6 |
4E |
1 |
1 |
A, R7 |
4F |
1 |
1 |
ORL A, direct |
45 |
2 |
1 |
ORL A, #data |
44 |
2 |
1 |
ORL A,@RØ |
46 |
1 |
1 |
A,@R1 |
47 |
1 |
1 |
ORL C, bit |
72 |
2 |
2 |
ORL C, /bit |
AØ |
2 |
2 |
ORL direct, A |
42 |
2 |
1 |
ORL direct, #data |
43 |
2 |
2 |
POP direct |
DØ |
2 |
2 |
PUSH direct |
CØ |
2 |
2 |
Окончание табл. 15
Мемоника |
КОД |
Кол-байт |
Кол-во циклов |
RET |
22 |
1 |
2 |
RETI |
32 |
1 |
2 |
RL A |
23 |
1 |
1 |
RLC A |
33 |
1 |
1 |
RR A |
03 |
1 |
1 |
RRC A |
13 |
1 |
1 |
SETB bit |
D2 |
2 |
1 |
SETB C |
D3 |
1 |
1 |
SJMP addr |
80 |
2 |
2 |
SUBB A,R0 |
98 |
1 |
1 |
A,R1 |
99 |
1 |
1 |
A,R2 |
9A |
1 |
1 |
A,R3 |
9B |
1 |
1 |
A,R4 |
9C |
1 |
1 |
A,R5 |
9D |
1 |
1 |
A,R6 |
9E |
1 |
1 |
A,R7 |
9F |
1 |
1 |
SUBB A,#data |
94 |
2 |
1 |
SUBB A,direct |
95 |
2 |
1 |
SUBB A,@R0 |
96 |
1 |
1 |
A,@R1 |
97 |
1 |
1 |
SWAP A |
C4 |
1 |
1 |
XCH A,R0 |
C8 |
1 |
1 |
A,R1 |
C9 |
1 |
1 |
A,R2 |
CA |
1 |
1 |
A,R3 |
CB |
1 |
1 |
A,R4 |
CC |
1 |
1 |
A,R5 |
CD |
1 |
1 |
A,R6 |
CE |
1 |
1 |
A,R7 |
CF |
1 |
1 |
XCH A,direct |
C5 |
2 |
1 |
XCH A,@R0 |
C6 |
1 |
1 |
A,@R1 |
C7 |
1 |
1 |
XCHD A,@R0 |
D6 |
1 |
1 |
A,@R1 |
D7 |
1 |
1 |
XRL A,R0 |
68 |
1 |
1 |
A,R1 |
69 |
1 |
1 |
A,R2 |
6A |
1 |
1 |
A,R3 |
6B |
1 |
1 |
A,R4 |
6C |
1 |
1 |
A,R5 |
6D |
1 |
1 |
A,R6 |
6E |
1 |
1 |
A,R7 |
6F |
1 |
1 |
XRL A,direct |
65 |
1 |
1 |
XRL A,#data |
64 |
2 |
1 |
XRL A,@R0 |
66 |
1 |
1 |
XRL A,@R1 |
67 |
1 |
1 |
XRL direct,A |
62 |
2 |
1 |
XRL direct,#data |
63 |
3 |
2 |
Команда ACALL addr11.
Команда “абсолютный вызов подпрограммы” вызывает подпрограмму, размещенную по указанному адресу в пределах двухкилобайтного адресного пространства. Счетчик команд увеличивается на 2 для получения адреса следующей команды. После этого полученное 16 – битное значение РС помещается в стек ( сначала младший байт, затем старший), содержимое SP увеличивается на 2. Адрес перехода получается с помощью конкатенации (сцепления) старших битов увеличенного содержимого счетчика команд, битов старшего и младшего байтов команды.
Алгоритм: (PC) (PC) +2
(SP) (SP) + 1
((SP)) (PC0-7)
(SP) (SP) + 1
((SP)) (PC8-15)
(PC0 -10) A10A9A8 II A7A6A5A4A3A2A1A0 II – знак конкатенации.
Пример: До выполнения команды ACALL
; (SP) = 07H
; метка DISPLAY соответствует адресу 0300Н
ACALL DISPLAY; команда ACALL расположена по адресу 0203Р=Н
; (PC) = 0200H.
; После выполнения команды
; (SP) = 09H, (PC) = 0300H
; ОЗУ (08Н) = 05Н, ОЗУ(09Н) = 02Н
; Адрес 0205Н – адрес возврата в основную программу.
Команда ADD A, <байт - источник>.
Команда “сложение” складывает содержимое аккумулятора А с содержимым байта – источника, результат помещается в А. При возникновении переносов из разрядов 7 и 3 устанавливаются флаги переноса С и вспомогательного переноса АС соответственно, в противном случае флаги сбрасываются. Флаг переполнения OV устанавливается, если есть перенос из бита 6 и нет переноса из бита 7 или есть перенос из бита 7 и нет переноса из бита 6, в противном случае флаг OV сбрасывается.
Алгоритм: (A) (A) + (<байт-источник>).
Возможные варианты команды:
1. ADD A,Ri ; (A) (A) + (Ri),
где Ri – один из регистров R0 – R7
Пример: ; До выполнения команды ADD A,R5
; C=X, OV=X, AC=X, где Х=(0 или 1), (A)=0C3H, (R5)=0AAH
ADD A,R5 ;
;После выполнения команды
;(A)=6DH, (R5)=0AAH.
;(AC)=0, (C)=1, (OV)=1.
2. ADD A,@Ri ; (A) (A) + ((Ri)), где Ri=R0 или R1
Пример: ;До выполнения команды ADD A,@R0
; C=X, OV=X, AC=X, где Х=(0 или 1), (A)=95 H, (R0)=20H,
; (ОЗУ [20H]) = 4CH
ADD A,@R0 ;
;После выполнения команды
;(A)=0E1H, (ОЗУ[20H]) = 4CH,
; (C)=0, (AC) = 1, (OV) =0.
3. ADD A,<direct>; (A) (A) + (<direct>), где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н-7FH) или регистром специальных функций.
Пример: ;До выполнения команды ADD A,80Н
; C=X, OV=X, AC=X, где Х=(0 или 1), (A)=77 H,
; (ОЗУ [80H]) = 0FFH
ADD A,80Н ;
;После выполнения команды
;(A)=76H, (ОЗУ[80H]) = 0FFH,
; (C)=1, (AC) = 1, (OV) =0.
4. ADD A,#<data>; (A) (A) + (<data>), где data – байтовое непосредственное данное, входящее в код операции (КОП).
Пример: ;До выполнения команды ADD A,#0D3Н
; C=X, OV=X, AC=X, где Х=(0 или 1), (A)=09 H,
ADD A,#0D3Н ;
;После выполнения команды
;(A)=0DCH, (C)=0, (AC) = 0, (OV) =0.
Команда ADDC A,<байт источник>.
Команда “сложение с учетом флага переноса” одновременно складывает содержимое А, содержимое байта-источника и бита переноса С. Результат посылается в аккумулятор. При этом флаги переноса и дополнительного переноса устанавливаются, если есть перенос из бита 7 или бита 3, и сбрасываются в противном случае. Флаг переполнения OV устанавливается, если имеется перенос бита 6 и нет переноса бита 7 или есть перенос из бита 7 и нет из бита 6, в противном случае OV сбрасывается.
Алгоритм: (A) (A) + (<байт - источник>) + (С ).
Возможные варианты команды:
1. ADDC A,Ri ; (A) (A) + (Ri) + (C), где Ri – один из регистров R0 - R7.
2. ADDC A,@Ri ; (A) (A) +((Ri)) + (C), где Ri=R0 или R1.
3. ADDC A,<direct>; (A) (A) +(<direct>) + (C), где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н-7FH) или регистром специальных функций.
4. ADDC A,#<data>; (A) (A) +(<data>) + (C), >), где data – байтовое непосредственное данное, входящее в код операции (КОП).
Рассмотрим пример выполнения одной из команд.
Пример: ;До выполнения команды ADDС A,20Н
; C=X, OV=X, AC=X, где Х=(0 или 1), (A)=11 H,
; (ОЗУ[20H]) = 0DFH, (C)=1
ADDC A,20Н ;
;После выполнения команды
;(A)=0F1H, (ОЗУ[20H]) = 0DFH,
; (C)=0, (AC) = 1, (OV) =0.
Команда AJMP addr11.
Команда “абсолютный безусловный переход” передает управление по указанному адресу, который получается при конкатенации пяти старших бит счетчика команд РС (после увеличения его содержимого на 2), 7-5 битов кода операции и второго байта команды. Адрес перехода должен находиться в пределах двухкилобайтного адресного пространства памяти программы.
Алгоритм: (PC15-0) (PC15-0) + 2.
(PC10-0) (addr11).
Пример: ; До выполнения команды
;(PC) = 0128H.
; Метке AGAIN соответствует адрес 0300Н.
AJMP AGAIN ;
; После выполнения команды
; (PC) = 0300H.
Команда ANL <байт - назначения>,< байт - источник>.
Команда “логическое “И” ” для байтов выполняет операцию логического “И” над битами указанных переменных и размещает результат в байте назначения. Операция не влияет на состояние флагов.
Имеются следующие команды:
1. ANL A,Ri; (A) (A) (Ri), где Ri – один из регистров R0 – R7.
Пример: ; До выполнения команды
; (A) = 0FEH, (R6) = 0C5H.
ANL A,R6 ;
; После выполнения команды
; (A) = 0C4H, (R6) =0C5H
2. ANL A,<direct>; (A) (A) (<direct>), где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н-7FH) или регистром специальных функций.
Пример: ; До выполнения команды
; (A) = 0A3H, (P1) = 86H.
ANL A,P1 ;
; После выполнения команды
; (A) = 82H, (R6) =86H
3. ANL <direct>,A ; (<direct>) (<direct>) (A).
Пример: ; До выполнения команды
; (A) = 0FEH, (P1) = 0C5H.
ANL P1,A ;
; После выполнения команды
; (A) = 0FEH, (P1) =0C4H
4. ANL <direct>,#<data>; (<direct>) (<direct>) (<data>), где data – байтовое непосредственное данное, входящее в код операции (КОП).
Пример: ; До выполнения команды
; (P1) = 0FFH.
ANL P1,#73H ;
; После выполнения команды
; (P1) = 73H.
5. ANL A,#<data>; (A) (A) (<data>).
Пример: ; До выполнения команды
; (A) = 36H.
ANL A,#0DDH ;
; После выполнения команды
; (A) = 14H.
6. ANL A,@Ri ; (A) (A) ((Ri)).
Пример: ; До выполнения команды: (A) = 07H, (R1) =21H, (ОЗУ[21H])=0FFH.
ANL A,@R1 ;
;После выполнения команды: (A) = 07H, (R1) =21H, (ОЗУ[21H])=0FFH.
Команда ANL C,< бит источника >.
Команда “ логическое “И” для переменных битов” выполняет операцию логического “И” над указанными битами. Если бит источника равен нулю, то происходит сброс флага переноса С, в противном случае флаг С не изменяет текущего значения.
Алгоритм: (С) (С) (<bit>), где bit – прямоадресуемый бит источника.
Пример: ; До выполнения команды (С)=1, Р3.0 = 0.
ANL C,P3.0 ;
; После выполнения команды
; (С)=0, Р3.0 =0.
Команда ANL C,/<bit>.
Команда “ логическое “И” между битом переноса и инверсией бита”. Бит источника после выполнения команды не изменяется.
Алгоритм: (C ) ( C ) (</bit>), где bit – прямоадресуемый бит источника.
Пример: ; До выполнения команды
; (С)=1, (ОЗУ[20H.1])=0.
ANL C,/20H.1 ;
;После выполнения команды
; (C)=1, (ОЗУ[20H.1])=0.
Команда CJNE <байт назначения>, <байт источник>, <addr>.
Команда “сравнение и переход, если не равно” сравнивает значения первых двух операндов и выполняет ветвление, если операнды не равны. Адрес ветвления вычисляется при помощи сложения значения (со знаком), указанного в последнем байте команды, с содержимым счетчика команд после увеличения его на три.
Флаг переноса С = 1, если значение целого без знака байта назначения меньше, чем значение целого без знака байта источника, в противном случае С = 0. Команда не оказывает влияния на операнды. Дальность действия команд ограничена 255 байтовым адресным пространством, 128 байт в сторону уменьшения адресов и 127 байт в сторону увеличения.
Рассмотрим имеющиеся команды:
1. CJNE A,<direct>,<addr>, >), где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н-7FH) или регистром специальных функций.
Алгоритм: Если (А) > (direct), то (С)=0 и (PC)=(addr),
Если (А) < (direct), то (С)=1 и (РС) =(addr).
2. CJNE A,#<data>, <addr>, где data – байтовое непосредственное данное, входящее в код операции (КОП).
Алгоритм: Если (А) > (data), то (С)=0 и (PC)=(addr),
Если (А) < (data), то (С)=1 и (РС) =(addr).
CJNE Ri, #<data>,<addr>.
Алгоритм: Если (Ri) > (data), то (С)=0 и (PC)=(addr),
Если (Ri) < (data), то (С)=1 и (РС) =(addr).
4. CJNE @Ri,#<data>,<addr>, где Ri – регистры - указатели ( R0 или R1).
Алгоритм: Если ((Ri)) > (data), то (С)=0 и (PC)=(addr),
Если ((Ri)) < (data), то (С)=1 и (РС) =(addr).
Пример: CJNE A,P3,BACK.
; До выполнения команды:
;(А) = 97Н, (Р3) = 0F0H, (C) = 0, (PC) = 0300H.
;Адрес, соответствующий метке BACK – 02F0H.
CJNE A,P3,BACK ;
; После выполнения команды:
;(А) = 97Н, (Р3) = 0F0H, (C) = 1, (PC) = 02F0H.
Команда CLR A.
Команда “обнуление аккумулятора” обнуляет содержимое А, не влияя на содержимое флагов.
Алгоритм: (A) 00.
Команда CLR <bit>.
Команда “ сброс бита” сбрасывает указанный бит в 0. Эта команда работает с флагом переноса С или с любым прямоадресуемым битом.
Алгоритм: (<bit>) 0.
Примеры: CLR C
; Сброс бита переноса (С) 0.
CLR ACC.1 ; Сброс первого бита аккумулятора, АСС.1 = 0.
CLR P2.7 ; Сброс седьмого бита порта Р2, Р2.7 =0.
CLR 21H.3 ; Сброс третьего бита в 21Н ячейке внутреннего ОЗУ, 21Н.3 = 0.
Команда CPL A.
Команда “инвертировать аккумулятор” инвертирует каждый бит аккумулятора на противоположный. Команда не влияет на содержимое флагов.
Алгоритм: (А) (/A).
Пример: CPL A
;До выполнения команды: (А) = 01Н.
CPL A ;
; После выполнения команды: (А) = 0FEH.
Команда CPL <bit>.
Команда “инвертировать бит ” инвертирует содержимое бита переноса или любого прямоадресуемого бита. На другие флаги команда не влияет.
Алгоритм: (<bit>) (/<bit>).
Примеры: CPL C ; Инвертировать бит переноса, (С) (/C).
; До выполнения команды (С) = 1.
; После выполнения команды (С) = 0.
CPL ACC.3; Инвертировать третий бит аккумулятора.
;До выполнения команды (А) = 0FFH.
; После выполнения команды (A) =0F7H.
CPL 0AH ; Инвертировать второй бит в 21Н ячейке внутреннего
; ОЗУ.
; До выполнения команды (ОЗУ[21H])=5EH.
; После выполнения команды (ОЗУ[21H]) = 5AH.
Команда DA A.
Команда “ десятичная коррекция аккумулятора для сложения” упорядочивает 8- битовую величину в аккумуляторе после выполненной ранее команды сложения двух переменных ( каждая в BCD формате ). При сложении может быть использована любая команда ADD или ADDC. Установка флага переноса С=1 указывает на то, что сумма двух исходных BCD (двоично-десятичных) чисел больше, чем 100.
Алгоритм: Если А3-0 >9 или (АС) = 1, (А3-0) = (А3-0) + 06
Если А7-4 >9 или (С) = 1, (А7-4) = (А7-4) + 60
Примеры: 1. ; До выполнения команд:
; (А) = 56Н, (R2) = 67H, (C) = 1
ADDC A,R2 ;
DA A ; (А) = 0BEH
;После выполнения команд:
; (A) = 24H, (R2) = 67H, (C) = 1.
; C=1 говорит о том, что результат сложения больше
; чем 100, то есть результат равен 124.
2. ;До выполнения команд: (А)=30Н, (С)=0.
ADD A,#99H ;
DA A ; (А) = 0С9Н
;После выполнения команд:
; (А) = 29Н, (С) =1.
; Таким образом, результат равен 129.
Команда DEC <байт>.
Команда “декремент” производит вычитание единицы из указанного операнда. Если операнд равен 00H, то произойдет переход в 0FFH. Эта команда не влияет на флаги.
Алгоритм: <байт> <байт> - 1.
Рассмотрим команды декремента:
1. DEC A , (A) (A) - 1
2. DEC Ri , где Ri - один из регистров R0 - R7. (Ri) (Ri) -1
DEC <direct> , где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н - 7FH) или регистром специальных функций. <direct> <direct> -1
4. DEC @Ri, где Ri или R0 или R1. ((Ri)) ((Ri)) – 1.
Команда DIV AB.
Команда “ деление ” делит 8-битное целое без знака в аккумуляторе А на 8 – битное целое без знака в регистре В. В А посылается целая часть частного, а регистр В – остаток. Флаги переноса С и переполнения OV сбрасываются. Если (А) < (B), то флаг вспомогательного переноса не сбрасывается.
Алгоритм: (А) (А) / (B)[15-8],
(B) (A) / (B)[7-0].
Пример: ; До выполнения команды: (А) = 0FBH, (B) = 12H
DIV AB ;
; После выполнения команды:
; (A) = 0DH, (B) = 11H, (C) = 0, (OV) = 0.
Команда DJNZ <байт>, <addr> .
Команда “декремент и переход, если не равно нулю” выполняет вычитание единицы из содержимого указанного байта и осуществляет ветвление по вычисляемому адресу, если результат не равен нулю. На флаги эта команда не влияет.
Алгоритм: <байт> <байт> - 1,
Если <байт> 0, то (PC) = (addr).
Рассмотрим имеющиеся команды:
DJNZ Ri, <addr>, где Ri - один из регистров R0 или R1.
(Ri) (Ri) – 1, если (Ri) 0, то (PC) = (addr).
DJNZ <direct>, <addr>, где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н - 7FH) или регистром специальных функций.
<direct> <direct> - 1, если <direct> 0, то (РС) = <addr>.
Пример: ; До выполнения команд (R5) = 08H
AGAIN: CPL P3.2 ;
DJNZ R5,AGAIN ;
; После выполнения команд:
; На выходе разряда P3.2 будет сформирована серия из четырех прямоугольных импульсов.
Команда INC <байт>.
Команда “инкремент” выполняет добавление единицы к указанной переменной и не влияет на флаги. При значении 0FFH осуществляется переход в 00Н.
Алгоритм: <байт> <байт> + 1.
Рассмотрим команды:
1. INC A, (A) (A) + 1.
2. INC Ri , где Ri - один из регистров R0 – R7. (Ri) (Ri) + 1.
3. INC <direct>, где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н - 7FH) или регистром специальных функций.
<direct> <direct> + 1.
4. INC @Ri, где Ri - один из регистров R0 или R1. ((Ri)) ((Ri)) + 1.
Пример: ;До выполнения команды: (ОЗУ [20H]) = 2EH.
INC 20H ;
; После выполнения команды:
; (ОЗУ[20H]) = 2FH.
Команда INC DPTR .
Команда “ инкремент указателя адреса ячеек ” выполняет инкремент содержимого 16- битного указателя DPTR. Прибавление “1” происходит к младшему байту регистра, при DPL = 0FFH происходит перенос “1” в старший байт DPH, при этом младший байт обнуляется. На флаги эта команда не влияет.
Алгоритм: (DPTR) (DPTR) + 1.
Команда не требует пояснения.
Команда JB <bit>, <addr>.
Команда “переход, если бит установлен” выполняет переход по адресу ветвления, если указанный бит равен “1”, в противном случае выполняется следующая команда. Проверяемый бит не изменяется, команда на флаги не влияет.
Алгоритм: если (bit) = 1, то (РС) = (addr), иначе (РС) = (РС) +3.
Пример: ;До выполнения команды: (А) = 59Н, (LOOP)=0200H.
JB ACC.3, LOOP ; Переход на метку LOOP, так как ACC.3=1.
; После выполнения команды: (PC)= (0200H).
Команда JBC <bit>,<addr>.
Команда “переход, если бит установлен и сброс этого бита” выполняет переход по адресу ветвления, если указанный бит равен “1”, в противном случае выполняется следующая команда, при этом анализируемый бит сбрасывается. Команда на флаги не влияет.
Алгоритм: если (bit) = 1, то (РС) = (addr) и (bit)=0, иначе (РС) = (РС) +3.
Пример: ;До выполнения команды (Р3.2)=1, (REPEAT)= 03FFH.
JBC P3.2, REPEAT ;Переход на метку REPEAT, так как Р3.2 = 1.
; После выполнения команды:
; (Р3.2) = 0, (РС) = 03FFH.
Команда JC <addr>.
Команда “переход, если перенос установлен” выполняет ветвление по адресу, если флаг переноса С = 1, в противном случае выполняется следующая команда.
Алгоритм: если (С) = 1, то (РС) = (addr), иначе (РС) = (РС) +2.
Пример: ; До выполнения команды: (С) = 1, (М) = 07FFH.
JC M ; Переход на метку М, так как (С) = 1.
; После выполнения команды: (РС) = 07FFH.
Команда JMP @A+DPTR.
Команда “косвенный переход” осуществляет переход по адресу, который получается в результате суммирования содержимого А и содержимого DPTR. При этом содержимое аккумулятора и регистра указателя адреса не меняется.
Алгоритм: (PC) (A)[7-0] + (DPTR)[15-0].
Пример: ;До выполнения команды: (РС) = 00АВН, (А) = 05Н, (DPTR)=0300H.
JMP @A+DPTR ; Переход по адресу 0305Н.
; (PC) = 0305H, (A) = 05H, (DPTR) = 0300H.
Команда JNB <bit>, <addr>.
Команда “переход, если бит не установлен” выполняет переход по адресу ветвления, если указанный бит равен “0”, в противном случае выполняется следующая команда. Проверяемый бит не изменяется, команда на флаги не влияет.
Алгоритм: если (bit) = 0, то (РС) = (addr), иначе (РС) = (РС) +3.
Команда JNC <addr>.
Команда “переход, если перенос не установлен” выполняет ветвление по адресу, если флаг переноса С = 0, в противном случае выполняется следующая команда.
Алгоритм: если (С) = 0, то (РС) = (addr), иначе (РС) = (РС) +2.
Команда JNZ <addr>.
Команда “переход, если содержимое аккумулятора не равно нулю” выполняет ветвление по адресу, если содержимое аккумулятора не равно 0. Содержимое А при этом не изменяется. Команда на флаги не влияет.
Алгоритм: Если (А) 0, (РС) = (addr), иначе (PC) = (PC) + 2.
Команда JZ <addr>.
Команда “переход, если содержимое аккумулятора равно нулю” выполняет ветвление по адресу, если содержимое аккумулятора равно 0. Содержимое А при этом не изменяется. Команда на флаги не влияет.
Алгоритм: Если (А) = 0, (РС) = (addr), иначе (PC) = (PC) + 2.
Пример: До выполнения команд:(А)=01,(TEST)=0100H, (OZU)=0200H.
JZ TEST ;Нет перехода на TEST, так как (А) 0.
DEC A ;
JZ OZU ; Переход по адресу 0200H.
; После выполнения: (РС)=0200Н.
Дальность действия команд JB bit, addr, JBC bit, addr, JC addr, JNB bit, addr, JNC addr, JNZ addr, JZ addr ограничена 255 - байтным адресным пространством, 128 байт по убывающим адресам и 127 байт по возрастающим адресам прикладной программы.
Команда LCALL <addr>.
Команда “длинный вызов” вызывает подпрограмму, находящуюся по указанному адресу. По этой команде к счетчику команд прибавляется 3 для получения адреса следующей команды, после чего полученный адрес сохраняется в стеке ( вначале младший байт, затем старший). Содержимое указателя стека увеличивается на 2. Подпрограмма может располагаться в любом месте 64 - килобайтного адресного пространства. На флаги эта команда не влияет.
Алгоритм: (РС)=(РС) + 3,
(SP)=(SP) +1,
((SP)) (PC[7-0]),
(SP) = (SP) +1,
((SP)) (PC[15-8]),
(PC) = addr[15-0].
Пример: ;До выполнения команды: (SP) = 07H, (KLAV) = 01FFH.
LCALL KLAV ; Команда LCALL находится по адресу 0400Н.
; После выполнения команды:
; (SP) =09H, (PC) = 01FFH, (ОЗУ[08])= 03Н, (ОЗУ[09])=04Н.
Команда LJMP <addr>.
Команда “длинный переход” выполняет безусловный переход по указанному адресу. Адрес перехода может находиться в любом месте 64 - килобайтного пространства. На флаги команда не влияет.
Алгоритм: (PC) <addr[15-0]>.
Команда MOV <байт-назначения>,<байт-источника>.
Команда "переслать переменную-байт" пересылает переменную-байт, указанную во втором операнде, в ячейку, указанную в первом операнде. Содержимое байта источника не изменяется. Эта команда на флаги и другие регистры не влияет. Команда MOV допускает 15 комбинаций адресации байта-источника и байта-назначения.
1. MOV A,Ri , где Ri - один из регистров R0 - R7, (A) (Ri).
Пример: ;До выполнения команды: (A)=EEH, (R5) = 3FH.
MOV A,R5 ;
; После выполнения команды: (A)=3FH, (R5) = 3FH.
2. MOV A,<direct>, где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н - 7FH) или регистром специальных функций, (A) <direct>.
Примеры: ;До выполнения команд: (Р1)=0FFH, (ОЗУ[2EH])=5BH, (PSW)=01H.
MOV A,P1 ;пересылка состояния порта Р1 в аккумулятор, (A) =0FFH.
MOV A,2EH ; переслать в А содержимое 2ЕН ячейки ОЗУ, (A)=5BH.
MOV A,PSW;переслать в А содержимое регистра состояния PSW, (A)=01H.
;После выполнения команд:(A)=01H, (Р1)=0FFH,(ОЗУ[2EH])=5BH, (PSW)=01H.
MOV A,@Ri , где Ri – один из регистров R0 или R1, (A) ((Ri)).
Пример: ;До выполнения команд: (ОЗУ[20H])=01H, (ОЗУ[21H])=02H, (R0)=20H, (R1) = 21H.
MOV A,@R0 ; (А) = 01Н.
MOV A,@R1 ; (А) = 02Н.
;После выполнения команд: (А)=02Н, : (ОЗУ[20H])=01H, (ОЗУ[21H])=02H.
4. MOV A,#<data> , (А) <data>.
Пример: ; До выполнения команды: (А)=0ААН.
MOV A,#11H ;
; После выполнения команды: (А) =11Н.
5. MOV Ri,A , где Ri - один из регистров R0 - R7, (Ri) (A).
Пример: ; До выполнения команды: (А)=5EH, (R7)= 34H.
MOV R7,A ;
; После выполнения команды: (А)=5ЕН, (R7) =5EH.
6. MOV Ri ,<direct> , (Ri) <direct>.
Пример: ;До выполнения команды: (Р3) =0FH, (R3) =0AAH.
MOV R3,P3 ;
; После выполнения команды: (Р3)=0FH, (R3)=0FH.
7. MOV Ri ,#<data> , (Ri) <data>.
Пример: ;До выполнения команды: (R6) = 00H
MOV R6,#45H ;
;После выполнения команды: (R6) =45H.
8. MOV <direct>, A , <direct> (A).
Пример: ; До выполнения команды: (А)=12Н, (Р2) = 0FFH.
MOV P2,A ;
;После выполнения команды: (А)=12Н, (Р2) = 12H.
9. MOV <direct>,Ri , <direct> (Ri).
Пример: ; До выполнения команды: (TLO)=61H, (R5)=0AEH.
MOV TLO,R5 ;
; После выполнения команды: (TLO)=0АЕH, (R5)=0AEH.
10. MOV <direct>, <direct>, <direct> <direct>.
Пример: ; До выполнения команды: (P2)=00H, (P1)= 22H.
MOV P2,P1 ;
; После выполнения команды: (P2)=22H, (P1)= 22H.
11. MOV <direct>,@Ri , <direct> ((Ri)).
Пример: ;До выполнения команды: (ОЗУ[70H])=5AH, (R1)=70H, (TH0)=23H.
MOV TH0,@R1 ;
;После выполнения команды: (ОЗУ[70H])=5AH, (R1)=70H, (TH0)=5AH.
12. MOV <direct>,#<data>, <direct> <data>.
Пример: ;До выполнения команды: (P0) =55H.
MOV P0,#0F0H ;
; После выполнения команды: (Р0)=0F0H.
13. MOV @Ri ,A , ((Ri)) A.
Пример: ;До выполнения команды: (A)=19H, (R0)=40H, (ОЗУ[40H])=99H.
MOV @R0,A ;
;После выполнения команды: (A)=19H, (R0)=40H, (ОЗУ[40H])=19H.
14. MOV @Ri ,<direct> , ((Ri)) <direct>.
Пример: ; До выполнения команды: (TL1)=0B1H, (ОЗУ[19H])=02H, (R1)=19H.
MOV @R1,TL1 ;
;После выполнения команды: (TL1)=0B1H, (ОЗУ[19H])=0B1H, (R1)=19H.
15. MOV @Ri , #<data> , ((Ri)) <data>.
Пример: ;До выполнения команды: (ОЗУ[7AH]) = 13H, (R0)=7AH.
MOV @R0,#0EEH ;
;После выполнения команды: (ОЗУ[7AH]) = 0EEH, (R0)=7AH.
Команда MOV С, <bit >.
Команда “ переслать бит данных” пересылает значение прямоадресуемого бита в разряд переноса С, который указан в первом операнде.
Алгоритм: (С) (bit).
Команда MOV <bit>, C.
Команда “ переслать бит данных” пересылает значение бита переноса С в прямоадресуемый бит, который указан в первом операнде.
Алгоритм: (bit) (C).
Пример: ;До выполнения команд:(P3.0)=0, (ACC.5)=0, (ОЗУ[2CH.3])=0,(С)=1.
MOV P3.0,C ;
MOV ACC.5,C ;
MOV 2CH.3,C ;
; После выполнения команд: (P3.0)=1, (ACC.5)=1,(ОЗУ[2CH.3])=1,(С)=1.
Команда MOV DPTR,#<data>.
Команда “загрузить указатель данных 16 - битовой константой” загружает указатель регистр DPTR шестнадцатиразрядной константой, указанной в 2 и 3 байтах команды.
Алгоритм: (DPTR) (data), (DPL) (data[7-0]), (DPH) (data[15-8]).
Пример: ;До выполнения команды: (DPTR) = 0200H.
MOV DPTR,#0300H ;
; После выполнения команды: (DPTR) = 0300H.
Команда MOVC A,@A+DPTR.
Команда “переслать байт из памяти программ ” загружает в аккумулятор байт кода или константу из ПЗУ. Адрес считываемого байта вычисляется как сумма восьмибитного содержимого аккумулятора и шестнадцатиразрядного содержимого DPTR. На флаги команда не влияет.
Алгоритм: (A) ((A) + (DPTR)).
Пример: ;До выполнения команды: (A) = 0BH, (DPTR) = 0300H, (ПЗУ[030BH]) = 23H.
MOVC A,@A+DPTR ;
;После выполнения команды: (A) = 23H, (DPL)=0BH, (DPH)=03H.
Команда MOVC A,@A + PC.
Команда “переслать байт из памяти программ ” загружает в аккумулятор байт кода или константу из ПЗУ. Адрес считываемого байта вычисляется как сумма восьмибитного содержимого аккумулятора и шестнадцатиразрядного содержимого счетчика команд. На флаги команда не влияет.
Алгоритм: (A) ((A) + (PC)).
Команда MOVX <байт приемника>,<байт источника>.
Команда “переслать во внешнюю память ( из внешней памяти ) данных (ОЗУ) ” пересылает данные между аккумулятором и байтом внешней памяти данных. Имеются два типа команд, которые обеспечивают восьмибитовый или шестнадцатибитовый косвенный адрес при обращении к ячейке внешнего ОЗУ. В первом случае адрес указывается в регистрах указателях R0 или R1, адрес выставляется в мультиплексном порте Р0, микросхема внешнего ОЗУ должна иметь информационную емкость не более 256 байт. Во втором случае адрес внешней ячейки памяти данных указывается в DPTR и выставляется в двух портах в Р0 (младший байт) и в Р2 (старший байт). В этом случае максимальный объем адресуемой памяти может быть 64 кБайта.
Рассмотрим имеющиеся команды и алгоритмы:
1. MOVX A,@Ri , где Ri или R0 или R1 (A) (внешнее RAM((Ri))).
2. MOVX A,@DPTR , (A) (внешнее RAM ((DPTR))).
3. MOVX @Ri ,A , (внешнее RAM((Ri))) (A).
4. MOVX @DPTR,A , (внешнее RAM((DPTR))) (A).
Примеры: ;До выполнения команды:
; (DPTR)=0300H, (внешнее RAM(0300H))=4CH, (A) =00.
MOVX A,@DPTR ;
; После выполнения команды:
; (A) = 4CH.
Команда MUL AB.
Команда “умножение” умножает восьмибитное целое без знака в аккумуляторе на восьмибитное целое без знака в регистре В. Старший байт 16-битного произведения помещается в регистр В, а младший байт в аккумулятор. Если результат произведения больше 255, то устанавливается флаг переполнения OV, в противном случае OV = 0. Флаг переноса С сбрасывается всегда.
Алгоритм: (А[7-0]) (A) *(B),
(B[15-8]) (A) * (B).
Пример: ; До выполнения команды:(А)=14H(20DEC), (B)=32H(50DEC).
MUL AB ;
;После выполнения команды:(A)=0E8H, (B)=03H.
; (03E8H) = (1000DEC).
Команда NOP.
Команда “нет операции” не выполняет никаких операций, не влияет на флаги. Команда используется для создания задержек, NOP выполняется за 1 мкс ( при fBQ=12 МГц).
Алгоритм: (PC) (PC) + 1.
Команда ORL <байт назначения>,< байт источника>.
Команда “ логическое ИЛИ ” для переменных байтов выполняет операцию логического “ИЛИ” над битами указанных переменных байтов, записывая результат в байт назначения. Команда не влияет на флаги.
Имеются следующие команды:
1. ORL A,Ri; (A) (A) (Ri), где Ri – один из регистров R0 – R7.
Пример: ; До выполнения команды
; (A) = 0FEH, (R6) = 0C5H.
ORL A,R6 ;
; После выполнения команды
; (A) = 0FFH, (R6) =0C5H
2. ORL A,<direct>; (A) (A) (<direct>), где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н-7FH) или регистром специальных функций.
Пример: ; До выполнения команды
; (A) = 0A3H, (P1) = 86H.
ORL A,P1 ;
; После выполнения команды
; (A) = 0A7H, (R6) =86H
3. ORL <direct>,A ; (<direct>) (<direct>) (A).
Пример: ; До выполнения команды
; (A) = 0FEH, (P1) = 0C5H.
ORL P1,A ;
; После выполнения команды
; (A) = 0FEH, (P1) =0C5H
4. ORL <direct>,#<data>; (<direct>) (<direct>) (<data>), где data – байтовое непосредственное данное, входящее в код операции (КОП).
Пример: ; До выполнения команды
; (P1) = 0F0H.
ORL P1,#73H ;
; После выполнения команды
; (P1) = 0F3H.
5. ORL A,#<data>; (A) (A) (<data>).
Пример: ; До выполнения команды
; (A) = 00H.
ORL A,#0DDH ;
; После выполнения команды
; (A) = 0DDH.
6. ORL A,@Ri ; (A) (A) ((Ri)).
Пример: ; До выполнения команды: (A) = 07H, (R1) =21H, (ОЗУ[21H])=0FFH.
ORL A,@R1 ;
;После выполнения команды: (A) = 0FFH, (R1) =21H, (ОЗУ[21H])=0FFH.
Команда ORL C,< бит источника >.
Команда “ логическое “ИЛИ” для переменных битов” выполняет операцию логического “ИЛИ” над указанными битами.
Алгоритм: (С) (С) (<bit>), где bit – прямоадресуемый бит источника.
Команда ORL C,/<bit>.
Команда “ логическое “ИЛИ” для переменных битов” выполняет операцию логического “ИЛИ” над битом переноса и инверсией прямоадресуемого бита. Сам бит источника не изменяется.
Алгоритм: (С) (С) /(<bit>), где bit – прямоадресуемый бит источника.
Пример: ;До выполнения команды: (С)=0, (Р3)=11111110B.
ORL C,/P3.0 ;
; После выполнения команды: (С)=1, (Р3)=11111110В.
Команда POP <direct>.
Команда “ чтение из стека ” считывает содержимое ячейки ОЗУ, которая адресуется с помощью указателя стека, в прямоадресуемый байт, при этом указатель стека уменьшается на единицу. Команда на флаги не воздействует.
Алгоритм: <direct> ((SP)), (SP) (SP) – 1.
Пример: ; До выполнения команд: (SP)=0BH, (TL0)=0ABH, (TH0)=0FFH.
; (ОЗУ[0BH])=55H, (ОЗУ[0AH])=0AAH.
POP TL0 ;Загрузить из стека TL0,
POP TH0 ;Загрузить из стека TH0.
; После выполнения команд: (SP)=09H, (TL0)=55H, (TH0)=0AAH.
; (ОЗУ[0BH])=55H, (ОЗУ[0AH])=0AAH.
Команда PUSH <direct>.
Команда “ запись в стек ” увеличивает указатель стека на единицу. После этого содержимое указанного байта копируется в ячейку внутреннего ОЗУ, адресуемой посредством указателя стека. На флаги команда не влияет.
Алгоритм: (SP) (SP) + 1, ((SP)) <direct>.
Пример: ; До выполнения команд: (SP)=07H, (DPTR)=030AH.
PUSH DPL ;
PUSH DPH ;
;После выполнения команд: (SP)=09H, (DPTR)=030AH,
; (ОЗУ[08H])=0AH, (ОЗУ[09H])=03H.
Команда RET.
Команда “ возврат из подпрограммы ” последовательно выгружает старший и младший байты счетчика команд из стека, уменьшая указатель стека на 2. Выполнение основной программы продолжается по адресу команды, следующей за ACALL или LCALL. На флаги команда не влияет.
Алгоритм: (PC[15 - 8]) ((SP)),
(SP) (SP) – 1,
(PC[7 - 0]) ((SP)),
(SP) (SP) – 1.
Команда RETI.
Команда “возврат из подпрограммы обслуживания прерывания” выгружает старший и младший байты счетчика команд из стека и устанавливает логику прерываний, разрешая прием других прерываний с уровнем приоритета, равным уровню приоритета только что обработанного прерывания. Указатель стека уменьшается на 2. PSW не восстанавливается автоматически. Выполнение основной программы продолжается с команды, следующей за командой, на которой произошел запрос на прерывание системы. Если при выполнении команды RETI обнаружено прерывание с таким же или меньшим уровнем приоритета, то одна команда основной программы успевает выполниться до обработки такого прерывания.
Алгоритм: (PC[15 - 8]) ((SP)),
(SP) (SP) – 1,
(PC[7 - 0]) ((SP)),
(SP) (SP) – 1.
Команда RL A.
Команда “ сдвиг содержимого аккумулятора влево ” сдвигает 8 бит аккумулятора на один бит влево, 7 - й бит посылается на место бита 0. На флаги эта команда не влияет.
Алгоритм: (A[N+1]) (A[N]), где N =0 - 6,
(A[0]) (A[7]).
Пример: ; До выполнения команды: (А) =10000001B=81H.
RL A;
; После выполнения команды: (A)=00000011B=03H.
Команда RLC A.
Команда “ сдвиг содержимого аккумулятора влево через флаг переноса С ” сдвигает восемь бит аккумулятора и флаг переноса влево на один бит. Содержимое флага переноса помещается на место бита 0 аккумулятора, а содержимое бита 7 переносится в бит С. На другие флаги эта команда не влияет.
Алгоритм: (A[N+1]) (A[N]), где N = 0 – 6,
(A[0]) (C),
(C) (A[7]).
Пример: ; До выполнения команды: (A)=01000111B=47H, (C)=1.
RLC A ;
; После выполнения команды: (A)=10001111B=8FH, (C)=0.
Команда RR A.
Команда “сдвиг содержимого аккумулятора вправо ” сдвигает вправо на один бит все восемь бит аккумулятора. Содержимое бита 0 помещается на место бита 7. На флаги эта команда не влияет.
Алгоритм: (A[N]) (A[N+1]), где N=0 – 6.
(A[7]) (A[0]).
Пример: ; До выполнения команды: (A)=11010110B=0D6H, (C)=1.
RR A ;
; После выполнения команды: (A)=01101011B=6BH, (C)=1.
Команда RRC A.
Команда “ сдвиг содержимого аккумулятора вправо через флаг переноса ” сдвигает восемь бит аккумулятора и флаг переноса на один бит вправо. Бит 0 перемещается в флаг переноса С, а содержимое флага С помещается в бит 7. На флаги эта команда не влияет.
Алгоритм: (A[N]) (A[N+1]), где N = 0 – 6,
(A[7]) (C),
(C) (A[0]).
Пример: ; До выполнения команды: (A)=10010101B=95H, (C)=0.
RRС A ;
; После выполнения команды: (A)=01001010B=4АH, (C)=1.
Команда SETB <bit>.
Команда “установить бит” устанавливает указанный бит в “1”.
1. SETB C, (C) 1.
2. SETB <bit>, где <bit> - прямоадресуемый бит, (bit) 1.
Примеры: ; До выполнения команд: (С)=0, (Р3.4)=0, (20Н.2)=0, (A)=00.
SETB ACC.1;
SETB C;
SETB P3.4;
SETB 20H.2;
; После выполнения команд: (С)=1, (Р3.4)=1, (20Н.2)=1, (A)=02H.
Команда SJMP <addr>.
Команда “ короткий безусловный переход по адресу” выполняет ветвление в программе по указанному адресу. Адрес ветвления вычисляется сложением смещения со знаком во втором байте команды с содержимым счетчика команд после прибавления к нему 2. Таким образом, адрес перехода должен находиться в диапазоне от 128 байт, предшествующих команде, до 127 байт, следующих за ней.
Алгоритм: (PC) <addr>.
Команда SUBB A,<байт источника>.
Команда “ вычитание с заемом ” вычитает указанную переменную вместе с флагом переноса из содержимого аккумулятора. Команда устанавливает флаг С, если вычитаемое больше уменьшаемого, в противном случае флаг С = 0. Флаг вспомогательного переноса АС устанавливается, если заем необходим для бита 3, и сбрасывается в противном случае. Флаг переполнения OV необходим, если заем необходим для бита 6, но его нет для бита 7 или есть для бита 7, но нет для бита 6.
Алгоритм: (A) (A) - <байт источника> - (С).
Рассмотрим имеющиеся команды вычитания с заемом.
SUBB A,Ri , где Ri - один из регистров R0 – R7, (A) (A) – (Ri) – (C).
Пример: ;До выполнения команды: (А)=0C9H, (R4)=54H, (C)=1.
SUBB A,R4;
;После выполнения команды: (A)=74H, (R4)=54H, (C)=0, (AC)=0, (OV)=1.
SUBB A,<direct>, где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н - 7FH) или регистром специальных функций. (A) (A) - <direct> - (C).
Пример: ;До выполнения команды: (А)=97H, (P3)=25H, (C)=0.
SUBB A,P3;
;После выполнения команды: (A)=72H, (P3)=25H, (C)=0, (AC)=0, (OV)=1.
3. SUBB A,@RI ,где Ri - один из регистров R0 или R1, (A) (A) – (Ri) – (C).
Пример: ;До выполнения команды: (А)=49H, (ОЗУ[21H])=68H, (C)=1, (R0)=21H.
SUBB A,@R0;
;После выполнения команды: (A)=0E0H, (ОЗУ[21H])=68H, (C)=1, (AC)=0, (OV)=0, (R0)=21H.
4. SUBB A,#<data> , (A) (A) - <data> (C).
Пример: ;До выполнения команды: (А)=0BEH, (C)=0.
SUBB A,#3FH;
;После выполнения команды: (A)=7FH, (C)=0, (AC)=1, (OV)=1.
Команда SWAP A.
Команда “ обмен тетрадами внутри аккумулятора” осуществляет обмен между четырьмя младшими и четырьмя старшими битами аккумулятора. На флаги команда не влияет.
Алгоритм: (A[3-0]) (A[4-7]),
(A[7-4]) (A[3-0]).
Пример: ;До выполнения команды: (А)=0BEH=10111110B.
SWAP A;
;После выполнения команды: (A)=11101011B=0EBH.
Команда XCH A,<байт>.
Команда “обмен содержимого аккумулятора с переменным байтом ” осуществляет обмен содержимого аккумулятора с содержимым источника, указанного в команде.
Алгоритм: (A) <байт>,
<байт> (А).
Рассмотрим имеющиеся команды:
1. XCH A,Ri , где Ri - один из регистров R0 – R7, (A) (Ri).
2. XCH A,<direct> , где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н - 7FH) или регистром специальных функций. (A) <direct>.
XCH A,@Ri , где Ri - один из регистров R0 или R1. (A) ((Ri)).
Пример: ;До выполнения команд: (A)=05H, (P2)=0FFH, (ОЗУ[20H])=0AAH, (R0)=20H, (R5)=0CCH.
XCH A,R5; (A)=0CCH, (R5)=05H.
XCH A,P2; (A)=0FFH, (P2)= 0CCH.
XCH A,@R0; (A)=0AAH, (ОЗУ[20H])=0FFH.
;После выполнения команд: (R5)=05H, (P2)=0CCH, (A)=0AAH, (ОЗУ[20H])=0FFH.
Команда XCHD A,@Ri .
Команда “ обмен тетрадой ” выполняет обмен младшей тетрады аккумулятора с содержимым младшей тетрады ячейки внутреннего ОЗУ, косвенная адресация к которой производится с помощью указанного регистра. На старшие биты [7- 4] эта команда не влияет.
Алгоритм: XCHD A,@Ri , где Ri – один из регистров R0 или R1,
(A[3-0]) ((Ri[3-0])),
((Ri[3-0])) (A[3-0]).
Пример: ;До выполнения команды: (A)=89H, (R0)=20H, (ОЗУ[20H])=0FEH.
XCHD A,@R0;
;После выполнения команды: (A)=8EH, (R0)=20H, ,(ОЗУ[20H])=0F9H.
Команда XRL <байт назначения>, <байт источника>.
Команда “логическое “ИЛИ ИСКЛЮЧАЮЩЕЕ” для переменных байтов” выполняет операцию “ ИЛИ ИСКЛЮЧАЮЩЕЕ ” над битами указанных переменных, записывая результат в байт назначения. На флаги команда не влияет.
Рассмотрим имеющиеся команды:
1. XRL A,Ri , где Ri - один из регистров R0 – R7, (A) (A) (Ri).
Пример: ; До выполнения команды: (A)=0C3H, (R7)=0AAH.
XRL A,R7;
; После выполнения команды: : (A)=69H, (R7)=0AAH.
2. XRL A,<direct> , где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н - 7FH) или регистром специальных функций. (A) (A) <direct>.
Пример: ; До выполнения команды: (A)=0FH, (P2)=0A6H.
XRL A,Р2;
; После выполнения команды: : (A)=0A9H, (P2)=0A6H.
3. XRL A,@Ri , где Ri – один из регистров R0 или R1, (A) (A) ((Ri)).
Пример: ; До выполнения команды: (A)=55H, (R0)=77H, (ОЗУ[77])=5AH.
XRL A,@R0;
; После выполнения команды: (A)=0FH, (R0)=77H, (ОЗУ[77])=5AH.
4. XRL A, #<data>, (A) (A) <data>.
Пример: ; До выполнения команды: (A)=0C3H.
XRL A,#0F5H;
; После выполнения команды: (A)=36H.
5. XRL <direct>,A <direct> <direct> (A).
Пример: ; До выполнения команды: (A)=31H, (P1)=82H.
XRL P1,A;
; После выполнения команды: (A)=31H, (P1)=0B3H.
6. XRL <direct>,#<data> , <direct> <direct> <data>.
Пример: ; До выполнения команды: (P1)=77H.
XRL P1,#77H;
; После выполнения команды: (P1)=00H.
В табл.2 приведены команды М, разделенные по группам: команды передачи данных; арифметические команды, логические команды; команды передачи управления, операции с битами.