В программировании на ассемблере важно предоставлять комментарии к коду, чтобы его было легче отслеживать. Комментарии в сборке начинаются с точки с запятой, подобной этой:
;это комментарий
Первой важной строкой в программе является
#INCLUDE <P16F84A.INC>
Это указывает ассемблеру добавить включаемый файл для этого конкретного микроконтроллера. Каждый микроконтроллер имеет свой собственный включаемый файл, который можно найти в C:\Program Папка Files (x86)\Microchip\MPASM Suite. Включаемый файл позволяет обращаться к имени регистра, а не к его адресу.
Программирование микроконтроллеров на ассемблере фокусируется на манипулировании регистрами. Вот регистры PIC16F84A:
Смена банка
Фактическое выполнение программы начинается в строке,
BSF STATUS, RP0
Команда BSF расшифровывается как “регистр набора битов f”, где следующим оператором является регистр f и бит, связанный с этим регистром. Просмотрите остальную часть набора инструкций. Для приведенного выше регистра f является регистром СОСТОЯНИЯ:
Бит RP0 называется битом выбора банка регистров. PIC16F84A группирует свои регистры в два банка. Давайте еще раз посмотрим на карту регистров устройства:
Прежде чем вы сможете манипулировать конкретным реестром, вы должны сначала обратиться в банк, где он находится. Это делается путем очистки (сделайте его нулевым) или установки (сделайте его единицей) бита RP0. Обратите внимание, что некоторые регистры, включая регистр СОСТОЯНИЯ, расположены в обоих банках, что означает, что вам не нужно переключать банки для доступа к ним.
Регистр TRIS
Так почему же мы установили бит RP0? Это потому, что следующие строки,
MOVLW 0xFE MOVWF TRISB
использует регистр TRISB, который находится в банке 1.
Операция MOVLW означает “переместить буквальное значение в регистр W”. Регистр W – это регистр общего назначения, который действует как временное хранилище при перемещении значений из регистра в регистр.
Операция MOVWF означает “переместить содержимое W в TRISB”. Это означает, что после этих двух строк регистр TRISB теперь имеет значение 0xFE.
Так почему же это значение для TRISB? Сначала мы обсудим функцию регистра TRISB.
ТРИС – это сокращение от tri-state. Это описывает характеристики портов микроконтроллера, что означает, что порт a может быть (1) входом, (2) выходом или (3) оставленным зависшим. PIC16F84A имеет два порта: PORTA и PORTB. Это означает, что существуют также два регистра TRIS: TRISA и TRISB. Ноль в любом бите TRIS делает соответствующий бит ПОРТА выходным. И наоборот, единица в любом бите TRIS делает соответствующий бит ПОРТА входнымсигналом.
В нашем примере значение TRISB равно 0xFE:
Вы видите, что только бит 0 является низким или очищенным. Это соответствует тому, что PORTB.0 или RB0 становятся выходным выводом, а остальные – входными выводами. Если, например, вы хотите сделать выходные контакты PORTB.0 и PORTB.1, а остальные – входными контактами, то ваш TRISB будет:
который равен 0xFC в шестнадцатеричном значении.
Следующая строка:
BCF STATUS, RP0
просто возвращает нас к банку 0, потому что следующие строки:
MAIN BSF PORTB, 0 CALL delay BCF PORTB, 0 CALL delay GOTO main
предполагает использование регистра PORTB, который находится в банке 0.
Операционный код BSF расшифровывается как “набор битов f”. Команда line BSF PORTB, 0 устанавливает нулевой бит регистра PORTB. Помните, что регистр PORTB – это регистр, привязанный к физическим контактам RB. Таким образом, когда установлен ПОРТB.0, вывод RB0 является высоким.
Строка BCF PORTB, 0 выполняет действие, противоположное только что рассмотренной команде. Это сделает вывод RB0 низким.