Каждая команда микроконтроллера состоит из одного 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; директива конца программы