В данном уроке мы рассмотрим основные конструкции языка без которых не обходится почти ни одна программа — это  условия,структуры множественного выбора и циклы. Начнем по порядку с условий.
Условный оператор — оператор проверяющий истинность условия, и в зависимости от этого принимающий решение что делать дальше. В общем виде выглядит так:

if Условие then Оператор1 else Оператор2

Условие — некоторое логическое выражение принимающие значение true или false. Если условие истинно, то будет выполнен Оператор1 а если ложно то Оператор2. Ключевое слово else не является обязательным. Пример:

if a=0 then PORTB:=0xFF else PORTB:=0xAA;


Читается буквально так: Если А равно нулю, то в порт бэ выводим 0xFF в противном случае — 0xAA. Обратите внимание, что в условии у нас используется просто равно без двоеточия. А вот там где мы хотим что-то присвоить (вывод в порт) двоеточие стоит. Синтаксис языка допускает использование только одного оператора после слов then и else. Если же мы хотим чтоб при истинности (или ложности) условия выполнялось сразу несколько операторов, то нужно воспользоваться составным оператором. Составной оператор представляет собой несколько простых операторов заключённых между ключевыми словами Begin и End. Такой оператор будет восприниматься компилятором как один оператор и не вызовет синтаксической ошибки. Дополним нашу программу. Допустим мы хотим выводить некоторые данные сразу в два порта в зависимости от истинности условия:

if a=0 then
  Begin
    PORTB:=0xAA;
    PORTC:=0xBB;
  end
else
  Begin
    PORTB:=0xCC;
    PORTC:=0xDD;
  end;

Наряду с условными операторами в микропаскале существуют операторы множественного выбора. Они используются когда необходимо при различных значениях одной и той же переменной выполнять различные действия. В общем виде этот оператор выглядит так:

case Переменная of
  значение_1 : оператор_1;
  ...
  значение_n : оператор_n
  else ОператорПоУмолчанию;
end;

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

  case Key of
  1:   //Если Key=1 тогда выводим в порты то-то.
    begin
      PORTB:=0xFF;
      PORTC:=0xAA;
    end;
  2:  //Если равно 2 то то-то.. итд
    begin
      PORTB:=0xAA;
      PORTC:=0xFF;
    end;
  3:
    begin
      PORTB:=0xAA;
      PORTC:=0xAA;
    end //Перед else никогда не ставят точку с запятой. Важный момент
  else //Если не равно ни 1 ни 2 ни 3 тогда...
    begin
      PORTB:=0xFF;
      PORTC:=0xFF;
    end;
  end;

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

case Key of
  0:       PORTB:= 0; //Выполнится если Key=0
  1,2,3,4: PORTB:= 1; //Выполнится если Key=1 или 2 или 3 или 4
  5,6,7:   PORTB:= 2; ////Выполнится если Key=5 или 6 или 7
end;

Кстати в структуре case … of переменная может сравниваться не только с фиксированными списком значений но и с другими переменными. Синтаксис тот же, поэтому рассматриваться не будет. Теперь перейдем к циклам. Циклами называют некоторый набор операторов которые должны быть выполнены некоторое число раз. Цикл состоит из двух частей: тела цикла и условия. Телом цикла называется непосредственно тот набор операторов которые должны выполняться до тех пор пока истинно условие.  Как и в большинстве других языков высокого уровня, в микропаскале циклы подразделяются на три вида:

  • Циклы с предусловием
  • Циклы с постусловием
  • Циклы  со счётчиком

Первые два вида цикла,  как правило применяются когда заранее не известно сколько раз должно выполнится тело цикла, а последний рассчитан на использование в случае когда число повторений известно. Цикл с предусловием имеет следующую структуру:

while условие do ТелоЦикла;

Работает он следующим образом: Сначала идёт проверка условия и если оно истинно, то исполняется тело цикла, потом опять происходит проверка и снова всё повторяется до тех пор пока условие не станет ложным. Условия для цикла может содержать несколько простых условий объединённых какое либо логической операцией например OR или AND (об этом подробнее позже). Пример цикла с предусловием:

while a<255 do a:=a+1;

Теперь тело цикла ( a:=a+1) будет повторяться до тех пор пока условие (a<255) истинно. В данном случае тело нашего цикла состоит всего лишь из одного оператора. Но в большинстве случаев необходимо в цикле выполнять не одно действие, а сразу несколько. Для этого в микропаскале как мы помним существуют составные операторы. Немного доработаем наш цикл, добавив вывод переменной в порты A и B микроконтроллера:

while a<255 do
Begin
    a:=a+1;   // Теперь все эти
    PORTA:=a; // три строчки
    PORTB:=a; // являются телом цикла
End;

Таким образом составной оператор можно подставлять туда где синтаксисом языка разрешено использовать только один оператор. В микропаскале существуют операторы при помощи которых можно управлять ходом выполнения цикла, это операторы break и continue. Если во время выполнения  цикла исполняется оператор break то тело цикла немедленно перестает исполняться несмотря на то что условие истинно. Continue — прекращает исполнение тела цикла, проверяет условие и если оно истинно, то начинает исполнять тело цикла заново. Эти два оператора могут использоваться во всех трёх типах циклов. Пример использования:

program test2;
var a:byte; //Объявляем переменную a
begin
a:=0; //Сначала a=0
While a<100 do //Цикл выполняется пока а<100
  Begin  //Начало тела цикла
    if a=10 then break; //Если а=10 то завершаем выполнение цикла вообще.
    a:=a+1;             //Увеличиваем а на единицу. Можно написать просто inc(a)
    if a=4 then continue; //Если а=4 тогда начинаем выполнять тело цикла с начала.
    PORTB:=a;  //Выводим в порты значение переменной а
    PORTC:=a;
  end;  //Конец тела цикла
//В результате в порт B и C будут выведены числа 1,2,3,5,6,7,8,9,10.
//Число 4 будет пропущено командой continue,
//а после числа 10 цикл завершится командой break
end.

Следующий тип цикла — цикл с постусловием. Он очень сильно похож на цикл рассмотренный выше, но у него есть два отличия. Тело такого цикла расположено перед условием, а это означает что оно будет выполнено хотя бы один раз, после чего произойдет проверка условия и если оно ложное то начнется следующая итерация. Цикл с постусловием имеет следующую структуру:

    repeat
    ТелоЦикла
    until условие;

Стоит заметить, что если тело цикла состоит из нескольких операторов, то в данном случае их не обязательно заключать между ключевыми словами Begin и End, однако если это сделать то ошибки не будет. В качестве примера немного изменим нашу предыдущую программу:

program test3;
var a:byte;
begin
a:=0;
    repeat
    begin
      if a=10 then break;
      a:=a+1;
      if a=4 then continue;
      PORTB:=a;
      PORTC:=a;
    end;
    until a=100; //Проверка условия после выполнения тела цикла!
end.
//В результате в порт B и C будут выведены числа 1,2,3,5,6,7,8,9,10.
//Число 4 будет пропущено командой continue,
//а после числа 10 цикл завершится командой break

Частный случай циклов с предусловием и постусловием это бесконечный цикл. Суть его в том, что его тело будет выполнятся до бесконечности потому что условие постоянно истинно (для цикла с предусловием) или ложно (для цикла с постусловием). Сделать такой цикл можно например так:

  While true do //Очевидно что условие всегда будет истинным!
  //А значит цикл будет выполняться до бесконечности (если не встретит команду break)
  begin
      ///Тело цикла
  end;

Последний вид цикла который мы сегодня рассмотрим это цикл со счётчиком. Переменная счётчик была у нас и в предыдущих примерах (переменная а), но в циклах с предусловием и постусловием её может и не быть. А вот в циклах со счётчиком её наличие обязательно. С каждой итерацией значение этой переменной увеличивается либо уменьшается на единицу. Шаг изменения счётчика задать нельзя. Выполнение тела цикла происходит пока переменная счётчик не примет заданное значение. В общем виде цикл выглядит так:

for ПеременнаяСчётчик:= НачальноеЗначение to[downto] КонечноеЗначение do ТелоЦикла

Как видите ничего особо сложного. Нужно отметить что слово to указывает на то, что переменную-счётчик нужно увеличивать при каждой итерации, а downto означает что нужно наоборот уменьшать! Перепишем наш пример для цикла со счётчиком и получим следующее :

program test3;
var a:byte;
begin
  for a:=1 to 100 do //Должны выполнить тело цикла сто раз....
    begin
      if a=10 then break; //...но после десятого раза завершаем цикл принудительно
      if a=4 then continue;
      PORTB:=a;
      PORTC:=a;
    end;
end.
//В результате в порт B и C будут выведены числа 1,2,3,5,6,7,8,9,10.
//Число 4 будет пропущено командой continue,
//а после числа 10 цикл завершится командой break

Есть один важный момент. Переменная-счётчик предназначена только для чтения. Если мы попытаемся что-то записать в эту переменную внутри тела цикла, то компилятор поругается и не позволит скомпилировать программу.  Вне тела цикла переменная доступна для записи. Спасибо что дочитали до конца :-)