"РЛ" - НАЧИНАЮ Щ ИМ
&
; директива адреса начала программы
; метка
; команда инвертирования уровня сигнала линии порта
; метка
; закосим в регистр R0 число 2
; уменьшаем R0, пока не станет равным нулю
; организуем цикл по содержимому регистра R1
; организуем цикл по содержимому регистра R2
; перейти на метку nain
; конец программы
(1)
(2)ш1&±п:
org
0
(3)
(4)
loop:
cpi
*3о
b
(S)
mov
RO, #2
(6)
djnz
R0,
$
(7)
djnz
R1, loop
(8)
djnz
R2, loop
(9)
sjmp
main
(Ю)
end
Как видите, программа очень корот-
кая. Рекомендую ввести ее в какой-ни-
будь тестовый файл (помните, как это
сделать в МС8Шбю?) - это позволит вам
потренироваться в наборе программ, за-
одно посмотреть на подсветку синтакси-
са, а в последствии изучить процесс от-
ладки. При вводе рекомендую для орга-
низации отступов и промежутков между
командой и операндами, а так же перед
комментарием, применять табуляцию -
так принято, да и удобно. Чтобы убедить-
ся, что это именно та программа, коды
Которой вы вводили вручную, необходи-
мо выполнить ее
компиляцию
и ознако-
миться с ее результатом - вы увидите
левее каждой команды ее шестнадцате-
ричные коды, которые полностью совпа-
дутс ранее предложенными вам для руч-
ного ввода.
Попытаемся теперь разобраться с
каждой строкой программы.
В первой строке используется дирек-
тива ОЙв. Эта директива устанавливает
адрес памяти, с которого начнется раз-
мещение следующей команды. Таким
образом, первая команда, последующая
за этой директивой, будет помещена по
адресу 0. Как видим; операнд 0 является
неотъемлемой частью директивы ОЛЭ.
У микроконтроллеров семейства МС851
выполнение программы пост е сброса
всегда начинается с адреса 0, поэтому лю-
бую нашу программу мы должны начи-
нать с директивы ОЛ6 0. Самое интерес-
ное, что и без нее первая команда про-
граммы будет по умолчанию помещена в
нулевой адрес. Зачем же тогда исполь-
зовать какую-то директиву? Дело в том,
что директив ОЛС в программе может
быть любое количество, то есть мы мо-
жем разместить различные части про-
граммы по различным адресам. И совсем
не обязательно, чтобы первой была ди-
ректива ОЛв с меньшим адресом - по-
рядок следования адресов может быть
любым. Но рано или поздно мы должны
использовать и начальный, стартовый,
адрес программы - а он всегда должен
быть нулевым. Если в простеньких про-
граммах можно обойтись и без явного
указания адреса первой команды про-
граммы, то в более сложных уже никак.
Поэтому лучше всего приучить себя все-
гда использовать эту директиву. Кроме
того, она используется не только для па-
мяти программ, но и для распределения
памяти данных, т.е. ОЗУ, о чем мы еще
поговорим.
Вторая строка состоит только из мет-
ки
main
и комментария. То есть никакой
команды в этой строке нет. Для нас мет-
ка m in просто состава ствует второй стро-
ке, а для компилятора будет соответство-
вать адресу текущей ячейки памяти про-
грамм. Как вы помните, доректива ORG
задала адрес О, значит, с точки зрения
ком
1
илятора метка main будет однознач-
но соответствовать адресу программы
OOOOh.
В третьей строке мы встречаемся с
первой исполняемой микроконтроллером
командой - CPL. Эта команда означает
“Инвертировать”, и что именно инверти-
ровать, указывает операнд. В нашем слу-
чае, это одна линия порта
РО,
а именно
самая младшая. В качестве операнда ко-
манды CPL может использоваться явно
указанный бит (как в нашем случае) или
же метка бита. Как это делается, мы уз-
наем чуть позже. Кроме того, в качестве
операнда этой команда может выступать
еще незнакомый нам
аккумулятор,
но об
этом снова потом ©. Встретив эту коман-
ду, микроконтроллер изменит на проти-
воположное значение указанного операн-
да. В нашем случае это будет уровень сиг-
нала навыводе 39 микроконтроллера.
В четвёртой строке снова метка. Но
обратите внимание - для нас эта метка
обозначает четвертую строку, а для ком-
пилятора - адрес второй команды. Чему
этот адрес на самом деле равен, нас в
настоящий момент не интересует, но мы
уже понимаем, что он будет больше о ©.
В пятой строке мы знакомимся с оче-
редной командой MOV. Это команда пе-
ресылки, обознанает она “
переслать
” или
“занести.
Операндов у этой команды два:
Первый показывает
куда переносится,
а
второй -
откуда
или
что
именно. В каче-
стве первого операнда может выступать
любая ячейка памяти, регистр, порт вво-
да-вывода и некоторые другие “места”. В
качестве второго операнда так же может
использоваться любая ячейка памяти, ре-
гистр, порт ит.п., но так же может исполь-
зоваться и
константа,
которая обязатель-
но помечается символом # (решетка). То
есть если нам необходимо занести конк-
ретное число (в нашем случае 2), мы за-
пишем #2 в качестве второго операнда
команды MOV. Использовать константу
в качестве первого операнда нельзя.
Небольшое отступление. Вы обра-
тили внимание, что константа в нашей
программе указана в десятичной систе-
ме счисления (верный признак
-
отсут-
сгтжзавершающегосимволаыН'или¥ЬГ).
Вообще же в своих программах вы мо-
жете использовать константы в десятич-
ной, двоичной или шестнадцатеричной
системах.
Встретив команду пересылки, микро-
контроллер занесет значение второго
операнда в первый операнд. При этом,
по месту второго операнда, если это
была не константа, значение^охраняет-
ся. То есть фактически именно
переме-
щения
не происходит, происходит
копи-
рование
значений.
В строках с 6-й по 8-ю мы видим одну
и ту же команду DJNZ, но с различными
операндами. Команда эта обозначает
уменьшить на 1 и перейти к метке, если
в результате не ноль".
Если попытаться
расшифровать эту аббревиатуру, то по-
лучится следующее (маленькие буквы
подразумеваются): Decrement and Jump
if Not Zero - DJNZ. Слово Jump (прыжок,
произносится как
джамп
) будет часто
встречаться, запоминайте его. Что каса-
ется действия команды, то вроде все по-
нятно, но вот какие операнды могут быть
у нее? Их два - первый указывает,
что
именно
должно уменьшаться на 1 (это
может быть
регистр
или
любая ячейка
50
U
Радиолюбитель - 0 3 /2 0 0 7
предыдущая страница 50 Радиолюбитель 2007-03 читать онлайн следующая страница 52 Радиолюбитель 2007-03 читать онлайн Домой Выключить/включить текст