Каждая команда микроконтроллера состоит из одного 14-разрядного слова разделенного на код операции, определяющий действие команды, один или несколько операндов, указывающих на данные, над которыми будет проводиться действие.
Полный список команд смотрите в табл. 1, табл. 2, табл. 3. Команды разделены на следующие группы:
байтовые команды (табл. 1);
битовые команды (табл. 2);
команды управления и операций с константами (табл. 3).
На рис. 1 показан формат команд трех основных групп.
Для байт ориентированных команд:
является указателем регистра и определяет какой регистр должен использоваться в команде;
указателем адресата результата и определяет, где будет сохранен результат.
Если , результат сохраняется в регистре W.
Если , результат сохраняется в регистре, который используется в команде.
В бит ориентированных командах:
определяет номер бита участвующего в операции;
— указатель регистра, который содержит этот бит.
В командах управления или операциях с константами:
представляет восемь или одиннадцать бит константы.
Рис. 1.
Все команды выполняются за один машинный цикл, кроме команд условия, в которых замещается значение программного счетчика. В случае выполнения команды за два машинных цикла, во втором цикле выполняется инструкция NOP. Один машинный цикл состоит из четырех тактов генератора. Для тактового генератора с частотой 4 МГц команда выполняется за 2 мкс.
Таблица 1
Мнемоника команды
Операция
Циклы
Код команды
Флажки
Примечание
ADDWF f, d
Сложение (W + f d)
00 0111 dfff ffff
C.DC.Z
1,2
ANDWF f, d
Логическое "И" (W and f d)
00 0101 dfff ffff
Z
1,2
CLRF f
Обнулить f
00 0001 1fff ffff
Z
CLRW -
Обнулить W
00 0001 0xxx xxxx
Z
COMF f, d
Дополнение f (Логическое "НЕ")
00 1001 dfff ffff
Z
1,2
DECF f, d
Декремент f
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
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)
00 0100 dfff ffff
Z
1,2
MOVF f, d
Пересылка (f W)
00 1000 dfff ffff
Z
1,2
MOVWF f
Пересылка (W f)
00 0000 1fff ffff
NOP
Пустая операция
00 0000 0xx0 0000
RLF f, d
Сдвиг влево через перенос
00 1101 dfff ffff
С
1,2
RRF f, d
Сдвиг вправо через перенос
00 1100 dfff ffff
C
1, 2
SUBWF f, d
Вычитание (f W d)
00 0010 dfff ffff
C,DC,Z
1, 2
SWAPF f, d
Обменять полубайты f
00 1110 dfff ffff
1,2
XOFWF f, d
Исключающее "ИЛИ" (W or f d)
00 0110 dfff ffff
Z
1,2
Таблица 2
Мнемоника команды
Операция
Циклы
Код команды
Флажки
Примечание
BCF f. b
Обнулить бит b в f
01 00bb bfff ffff
1,2
BSF f, b
Установить бит b в f
01 0lbb bfff ffff
1,2
BTFSC f, b
Тест бита b в f, пропуск если "0"
1(2)
01 l0bb bfff ffff
BTFSS f, b
Тест бита b в f пропуск если "1"
1(2)
01 11bb bfff ffff
Таблица 3
Мнемоника команды
Операция
Циклы
Код команды
Флажки
Примечание
ADDLW к
Сложение (k + W W)
11 111x kkkk kkkk
C,DC,Z
ANDLW к
Логическое "И" (k and W W)
11 1001 kkkk kkkk
Z
CALL k
Вызов подпрограммы k
10 0kkk kkkk kkkk
CLRWDT -
Обнулить WDT
00 0000 0110 0100
TO,PD
GOTO k
Переход к адресу k
10 1kkk kkkk kkkk
IORLW k
Логическое "ИЛИ" (К or W W)
11 1000 kkkk kkkk
Z
MOVLW k
Пересылка (k W)
11 00xx kkkk kkkk
RETFIE -
Возврат из прерывания
00 0000 0000 1001
RETLW k
Возврат с константой
11 01xx kkkk kkkk
RETURN -
Возврат из подпрограммы
00 0000 0000 1000
SLEEP -
Останов
00 0000 0110 0011
TO,PD
SUBLW k
Вычитание (k W W)
11 110х kkkk kkkk
C,DC,Z
XORLW k
Исключающее "ИЛИ"(k or W W)
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 ; сохранение текущего значения регистра Wmovf STATUS,w ; сохранение текущего значения регистра STATUSmovwf status_temp ; ПРЕРЫВАЮЩАЯ ПРОГРАММА movf status_temp,w ; восстановление значения регистра STATUSmovwf STATUSswapf w_temp,fswapf w_temp,w ; восстановление значения регистра Wretfie ; возврат в основную программу main ; ОСНОВНАЯ ПРОГРАММА END ; директива конца программы