Микропроцессоры

Объявление переменных в языке программирования PLM-51

В языке программирования PLM-51 могут быть объявлены пять типов объектов: переменные, константы, литералы, метки и подпрограммы. В одном блоке для каждого имени допустимо только одно объявление. Переменные, константы, литералы и подпрограммы должны быть объявлены раньше, чем они будут использованы в исполняемом операторе.

Метка может быть объявлена двумя способами:

  1. если она стоит перед выполняемым оператором и заканчивается с двоеточием (:)
  2. определена в операторе DECLARE.

Подпрограмма объявляется оператором PROCEDURE и определяется между операторами PROCEDURE и END.

Переменные, константы и литералы объявляются оператором DECLARE. При этом они могут объявляться как в разных операторах DECLARE, так и в одном. Если оператор DECLARE содержит более чем одно объявление, то они разделяются запятыми. При объявлении переменной обязательно указывается тип объявляемой переменной. Пример использования оператора DECLARE:

  declare Chr byte;
  declare Count word;
  declare Chr byte, Count word;

Переменная может быть скаляром, массивом или структурой.

Cкаляр является объектом, значение которого не известно на этапе трансляции, и может изменяться в процессе выполнения программы. К нему обращаются при помощи идентификатора переменной.

Скаляр обязательно имеет тип. В языке программирования PLM-51 это может быть восьмибитовая беззнаковая переменная - byte, шестнадцатибитовая беззнаковая переменная - word или однобитовая переменная - bit.

Массив - это набор скаляров одинакового типа, имеющих один идентификатор, и различающихся индексами.

Например:

А(0),  A(1),  A(2), A(3),  и т.д.

Структура позволяет объединять под одним именем переменные разного типа. Ее элементы различаются друг от друга идентификаторами поля. Например, индикатор Employees.Name обращается к полю Name внутри структуры Employees. Массивы и структуры могут быть как переменной, так и константой.

Так как микроконтроллеры семейства MCS-51 имеют несколько адресных пространств, то транслятору необходимо указывать, в какой из областей памяти необходимо размещать переменные. Это осуществляется при помощи уточняющих слов, следующих за определением типа переменной. 

  1. MAIN - переменная размещается во внутренней памяти данных с прямой адресацией
  2. IDATA - переменная размещается во внутренней памяти данных с косвенной адресацией
  3. REGISTER - переменная размещается в области регистров специальных функций
  4. AUXILIARY - переменная размещается во внешней памяти данных
  5. CONSTANT - константа размещается в памяти программ

Если уточняющее слово отсутствует, то по умолчанию переменные размещаются во внутренней памяти данных. В приведенном выше примере переменные были размещены во внутренней памяти данных. ПриведЈм пример объявления переменной в области регистров специальных функций:

declare SBUF byte at (99h) register; /*рег. данных последовательного порта */

В этом примере была объявлена переменная, совпадающая с регистром данных последовательного порта. Поэтому при записи байта в эту переменную, записанное число будет передано через последовательный порт.

Суффикс CONSTANT описывает переменные в адресном пространстве памяти программ, где должно находиться ПЗУ. Содержимое такой переменной в отличие от других не изменяется в процессе выполнения всей программы. Идентификатор такой переменной никогда не должен находиться в левой части оператора присваивания. Инициализация данных производится добавлением значения константы к ключевому слову CONSTANT. Следующий оператор:

declare Porog byte constant (48);

объявляет байт Porog в памяти программ и присваивает ему значение 48. Оператор:

declare (Counter, Limit, Incr) word constant (1024, 0, -2)

объявляет скаляры Counter (счетчик англ), Limit (граница англ) и Incr (увеличение англ) типа WORD, указывает, что они находятся в ПЗУ, и устанавливает значение константы Counter равным 1024, значение константы Limit - 0, значение константы Incr равным (-2).

Достаточно мощное средство программирования предоставляет макроподстановка LITERALLY. Строка, следующая за ключевым словом LITERALLY подставляется на этапе трансляции.

Следующий пример иллюстрирует использование ключевого слова LITERALLY:

declare True literally '1',  False literally '0';
declare Rough bit;
declare (x, y, Delta, Final) word;
...
rough = True;
do while Rough;
  x = smooth (x, y, Delta);/* smooth это подпрограмма, объявленная  в другом месте .*/
  if (x - Final) < Delta then Rough = False;
end;
...

В этом примере при помощи ключевого слова LITERALLY определяются булевы значения True и False для работы с операциями отношения. Это делает программу более удобной для чтения.

ЕщЈ один вариант использования ключевого слова LITERALLY это объявление констант, неизменных во время одной компиляции, но которые могут принимать другое значение при последующих компиляциях исходного текста программы.

Рассмотрим следующий пример:

declare Buffer$Size literally '32'
declare Print$Buffer (Buffer$Size) word;
...
print$buffer (buffer$size - 10) = 'g';

Последующие изменения Buffer$Size могут быть сделаны в одном месте в первом операторе declare. Компилятор распространит изменение по всей программе во время компиляции. Таким образом, программист сократит утомительный и приводящий к ошибкам процесс поиска в программе тех мест, где строка  '32' используется как размер буфера, и внесение нового значения размера буфера.

Язык программирования PLM очень похож на широко распространЈнный язык программирования PASCAL, так как оба этих языка произошли от общего родоначальника - языка программирования ALGOL-68. При помощи макроподстановок LITERALLY эти языки программирования можно сделать ещЈ более похожими. Это очень полезное свойство для людей, привыкших программировать на PASCAL.


[Назад] [Содержание] [Вперёд]