Каждая команда микроконтроллера состоит из одного 14-разрядного слова разделенного на код операции, определяющий действие команды, один или несколько операндов, указывающих на данные, над которыми будет проводиться действие.
Полный список команд представлен в табл.2, табл.3, табл.4. Команды разделены на следующие группы:
· байтовые команды (табл.2);
· битовые команды (табл.3);
· команды управления и операций с константами (табл.4).
На рис. 4 показан формат команд трех основных групп.
Для байт-ориентированных команд:
·
является указателем регистра и определяет, какой регистр должен использоваться в команде;
·
указателем адресата результата и определяет, где будет сохранен результат.
Если
, результат сохраняется в регистре W.
Если
, результат сохраняется в регистре, который используется в команде.
В бит-ориентированных командах:
·
определяет номер бита участвующего в операции;
·
— указатель регистра, который содержит этот бит.
В командах управления или операциях с константами:
·
представляет восемь или одиннадцать бит константы.
|
Рисунок 4 - Формат команд трех основных групп микроконтроллера PIC16F877.
Все команды выполняются за один машинный цикл, кроме команд условия, в которых замещается значение программного счетчика. В случае выполнения команды за два машинных цикла, во втором цикле выполняется инструкция NOP. Один машинный цикл состоит из четырех тактов генератора. Для тактового генератора с частотой 4 МГц команда выполняется за 2 мкс.
Таблица 2. Байтовые команды
| Мнемоника команды | Операция | Циклы | Код команды | Флажки | Примечание |
| ADDWF f, d | Сложение (W + f d)
| 1 | 00 0111 dfff ffff | C.DC.Z | 1,2 |
| ANDWF f, d | Логическое "И"
(W and f d)
| 1 | 00 0101 dfff ffff | Z | 1,2 |
| CLRF f | Обнулить f | 1 | 00 0001 1fff ffff | Z | 2 |
| CLRW - | Обнулить W | 1 | 00 0001 0xxx xxxx | Z | |
| COMF f, d | Дополнение f (Логическое "НЕ") | 1 | 00 1001 dfff ffff | Z | 1,2 |
| DECF f, d | Декремент f | 1 | 00 0011 dfff ffff | Z | 1,2 |
| DECFSZ f, d | Декремент f, пропуск если "0" | 1(2) | 00 1011 dfff ffff | 1,2,3 | |
| INCF f, d | Инкремент f | 1 | 00 1010 dfff ffff | Z | 1,2 |
| INCFSZ f, d | Инкремент f, пропуск если "0" | 1(2) | 00 1111 dfff ffff | 1,2,3 | |
| IORWF f, d | Логическое "ИЛИ"
(W or f d)
| 1 | 00 0100 dfff ffff | Z | 1,2 |
| MOVF f, d | Пересылка (f W)
| 1 | 00 1000 dfff ffff | Z | 1,2 |
| MOVWF f | Пересылка (W f)
| 1 | 00 0000 1fff ffff | ||
| NOP | Пустая операция | 1 | 00 0000 0xx0 0000 | ||
| RLF f, d | Сдвиг влево через перенос | 1 | 00 1101 dfff ffff | С | 1,2 |
| RRF f, d | Сдвиг вправо через перенос | 1 | 00 1100 dfff ffff | C | 1, 2 |
| SUBWF f, d | Вычитание (f W d)
| 1 | 00 0010 dfff ffff | C,DC,Z | 1, 2 |
| SWAPF f, d | Обменять полубайты f | 1 | 00 1110 dfff ffff | 1,2 | |
| XOFWF f, d | Исключающее "ИЛИ"
(W or f d)
| 1 | 00 0110 dfff ffff | Z | 1,2 |
Таблица 3. Битовые команды
| Мнемоника команды | Операция | Циклы | Код команды | Флажки | Примечание |
| BCF f. b | Обнулить бит b в f | 1 | 01 00bb bfff ffff | 1,2 | |
| BSF f, b | Установить бит b в f | 1 | 01 0lbb bfff ffff | 1,2 | |
| BTFSC f, b | Тест бита b в f, пропуск если "0" | 1(2) | 01 l0bb bfff ffff | 3 | |
| BTFSS f, b | Тест бита b в f пропуск если "1" | 1(2) | 01 11bb bfff ffff | 3 |
Таблица 4. Команды управления и операций с константами
| Мнемоника команды | Операция | Циклы | Код команды | Флажки | Примечание |
| ADDLW к | Сложение (k + W W)
| 1 | 11 111x kkkk kkkk | C,DC,Z | |
| ANDLW к | Логическое "И" (k and W W)
| 1 | 11 1001 kkkk kkkk | Z | |
| CALL k | Вызов подпрограммы k | 2 | 10 0kkk kkkk kkkk | ||
| CLRWDT - | Обнулить WDT | 1 | 00 0000 0110 0100 | TO,PD | |
| GOTO k | Переход к адресу k | 2 | 10 1kkk kkkk kkkk | ||
| IORLW k | Логическое "ИЛИ" (К or W W)
| 1 | 11 1000 kkkk kkkk | Z | |
| MOVLW k | Пересылка (k W)
| 1 | 11 00xx kkkk kkkk | ||
| RETFIE - | Возврат из прерывания | 2 | 00 0000 0000 1001 | ||
| RETLW k | Возврат с константой | 2 | 11 01xx kkkk kkkk | ||
| RETURN - | Возврат из подпрограммы | 2 | 00 0000 0000 1000 | ||
| SLEEP - | Останов | 1 | 00 0000 0110 0011 | TO,PD | |
| SUBLW k | Вычитание (k W W)
| 1 | 11 110х kkkk kkkk | C,DC,Z | |
| XORLW k | Исключающее "ИЛИ"(k or W W)
| 1 | 11 1010 kkkk kkkk | Z |
Примечание 1. Если регистр ввода/вывода изменяется, то исходным значением будет величина, считанная непосредственно с контактов.
Примечание 2. Если команда модифицирует регистр TMR0, то предделитель будет обнулен.
Примечание 3. Если в счетчик программ записывается адрес (т.е. условие проверки "истина"), то команда выполняется за два цикла. Второй цикл выполняется как команда NOP.
Пример программы для микроконтроллера PIC16F877
list p=16f877; директива определения процессора #include <p16f877.inc>; подключение списка определений переменных процессора __CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF; '__CONFIG' - директива определения битов конфигурации процессора; ОПРЕДЕЛЕНИЕ ПЕРЕМЕННЫХw_temp EQU 0x70; переменная для сохранения текущего состояния при обработке прерывания status_temp EQU 0x71; переменная для сохранения текущего состояния при обработке; прерывания ORG 0x000; размещение команд по адресу сброса процессора clrf PCLATH; очистка старших бит счетчика команд goto main; переход на основную программу ORG 0x004; размещение команд по вектору прерывания процессора movwf w_temp; сохранение текущего значения регистра W movf STATUS,w; сохранение текущего значения регистра STATUS movwf status_temp; ПРЕРЫВАЮЩАЯ ПРОГРАММАmovf status_temp,w; восстановление значения регистра STATUS movwf STATUSswapf w_temp,fswapf w_temp,w; восстановление значения регистра W retfie; возврат в основную программу main; ОСНОВНАЯ ПРОГРАММАEND; директива конца программы
d)
W 





