- Lektsia - бесплатные рефераты, доклады, курсовые работы, контрольные и дипломы для студентов - https://lektsia.info -

Операторы перехода языка mikroC: break, continue, goto. Выполняемые функции, промеры использования в программах.



 

Оператор перехода break

 

Оператор break имеет два назначения. Первое – это окончание работы оператора switch. Второе – это принудительное окончание цикла, минуя стандартную проверку условия. Когда оператор break встречается в теле цикла, цикл немедленно заканчивается и выполнение программы переходит на строку, следующую за циклом.

Рассмотрим пример использования оператора break для досрочного прекращения работы цикла for.

 

char in_port, x;

void main( )

{

TRISB = 0xFF; // настроить порт B на ввод

TRISC = 0; // настроить порт С на вывод

PORTC = 0;

in_port = PORTB; // ввод числа из порта B

for( x = 1; x < 100; x++ )

{

if ( x == in_port )

break; // прекращение цикла вывода

PORTC = x; // вывод в порт С

}

}

В этой программе оператор цикла for выполняет вывод в порт С переменной х, изменяющейся от 0 до 100. Однако, если значение переменной х будет равно переменной in_port, введенной из порта B, причем это значение меньше 100, то цикл вывода немедленно прекращается.

 

Оператор перехода continue

 

Работа оператора continue чем-то похожа на работу оператора break. Но вместо форсированного окончания цикла оператор continue переходит к следующей итерации цикла, пропуская оставшийся код тела цикла.

Рассмотрим пример применения оператора continue для вывода в порт С чисел от 1 до 10 за исключением числа 5.

 

void main( )

{

char k; // объявление однобайтной переменной

TRISC = 0; // настроить порт С на вывод

PORTC = 0; // вывод нулей в порт С

for( k = 1; k <= 10; k++)

{

if( k == 5 ) // если k равно 5, то

continue; // пропустить вывод в порт С

PORTC = k; // вывод в порт С

}

}

 

Оператор перехода goto

 

Оператор goto (идти к ….) – это безусловный переход на метку. Метка – это идентификатор Си, завершающийся двоеточием. Пример записи оператора goto:

goto label;

………

……….

label: …….

 

Рассмотрим простейшую программу, где используется оператор перехода goto.

 

void main( )

{

char x = 1;

loop:

x++;

if ( x <= 10 )

goto loop;

}

В программе реализуется цикл инкремента переменной x от 1 до 10 с помощью оператора goto и метки loop. Очевидно, что такой цикл можно было бы реализовать и с использованием операторов while или for.

 

Функции языка mikroC: определение и прототипы.

Определение функции. Программа на языке mkroC состоит из одной или нескольких функций. Функция – это логически самостоятельная именованная часть программы, которой могут передаваться параметры и которая может возвращать какое-то значение. Современный стиль языка Си предполагает следующий формат определения функции:

возвращаемый_тип имя_функции(тип параметр_1, …,тип параметр_n)

{

описание данных;

оператор_1;

……



оператор_m;

return (выражение);

}

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

Поле «возвращаемый_тип» задает тип возвращаемого функцией значения (char, int, float и т.д.). Если функция не возвращает никакого значения, то в поле «возвращаемый_тип» записывается ключевое слово void (пустой).

После имени функции в скобках помещаются аргументы (или по-другому входные параметры), передаваемые в функцию, они содержат любую комбинацию типов и имен. Это поле в определении функции называется списком формальных аргументов (или параметров). Поле «список аргументов» - не обязательная часть в определении функции. Если в функцию не передаются никакие параметры, то это поле – пустое или содержит ключевое слово void.

Примеры определения функций:

int mul(int a, int b) // функция умножения

{

int y;

y = a * b;

return y;

}

 

float cube(float m) // функция вычисления куба числа

{

return m * m * m;

}

 

void delay( ) // функция временной задержки

{

long j;

for(j = 0; j < 50000; j++);

}

 

Определения функций могут размещаться в различных частях программы, в том числе и в различных файлах. Поэтому может возникнуть ситуация, когда вызывается функция, определение которой находится ниже (по тексту) в программе. Это вызывает сбой в работе компилятора.

Прототип функции. Стандарт языка Си требует, чтобы функции были объявлены до первой ссылки на них. Это «предварительное» объявление называется прототипом функции. Оно извещает компилятор о типе возвращаемого значения, количестве и типе аргументов. Используя прототип, компилятор может выполнить тщательный контроль числа аргументов и соответствие их типов в вызовах функции и ее определении.

Современный стиль записи прототипа имеет следующий формат:

возвращаемый_тип имя_функции(тип параметр_1, …., тип параметр_n);

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

int mul(int a, int b);

float cube(float m);

void delay( );

 

Прототипы функций обычно размещаются в начале программы перед функцией main( ). А определения функций размещаются после функции main( ). Например, если программа с именем primer.c использует три функции mul( ), cube( ) и delay( ), то она записывается в следующем виде:

/**********************************************************************************

primer.c – пример оформления программы с несколькими функциями

*********************************************************************************/

int mul(int a, int b); // прототип функции mul( )

float cube(float m); // прототип функции cube( )

void delay( ); // прототип функции delay( )

void main( ) // главная функция

{

int y;

float f;

…………..

y = mul(50, 100); // вызов функции mul( )

……………...

f = cube(32.45); // вызов функции cube( )

………………..

delay( ); // вызов функции delay( )

………………

}

 

/* определения функций */

 

int mul(int a, int b)

{

int y;

y = a * b;

return y;

}

float cube(float m)

{

return m * m * m;

}

void delay( )

{

long j;

for(j = 0; j < 50000; j++);

}

 

Управление отдельными разрядами регистров PIC-микроконтроллеров в языке mikroC. Встроенные функции формирования временных задержек компилятора mikroC PRO for PIC.

 

В программах для PIC-микроконтроллеров часто требуется управлять отдельными линиями портов МК, а также опрашивать их состояния.

Язык mikroC позволяет иметь доступ к отдельными битами регистров специальных функций. Это можно выполнить следующими способами.

1. Указать имя регистра, а затем после знака точки как разделителя идентификатор номера бита в регистре в виде: B0, B1, B2, B3, B4, B5, B6, B7, где В0 – младший бит.

Например:

// для порта С, настроенного на вывод

PORTC.B0 = 1; // вывести лог. 1 на 0-ю линию порта С

PORTC.B7 = 0; // вывести лог. 0 на 7-ю линию порта С

 

// для регистра управления прерываниями INTCON

INTCON.B7 = 1; // Установить в 1 бит GIE разрешения глобальных

// прерываний (7-й бит в регистре INTCON)

 

2. Указать имя бита в регистре специальных функций, а затем идентификатор вида: _bit.

Например:

GIE_bit = 1; // установить в 1 бит GIE в регистре INTCON

 

В языке mikroC биты линий портов PIC-микроконтроллеров обозначаются:

RA0, RA1, RA3 и т.п. порта А;

RB0, … , RB7 порта В;

RC0, … , RC7 порта С.

RD0, … , RD7 порта D.

 

// для порта С, настроенного на вывод

RC0_bit = 1; // вывести лог. 1 на 0-ю линию порта С

RC7_bit = 0; // вывести лог. 0 на 7-ю линию порта С

 

В управляющих программах для микроконтроллеров часто возникает необходимость в формировании временных задержек. Компилятор mikroC PRO for PIC имеет так называемые встроенные функции задержки, которые формируют временные задержки программным методом. Наибольшее применение находят три функции:

1) Delay_us(константа), где константа определяет величину задержки в микросекундах (константа – это целое число типа unsigned long в пределах от 1 до 4294967295);

2) Delay_ms(константа), где константа определяет величину задержки в миллисекундах ( константа – это целое число типа unsigned long в пределах от 1 до 4294967295);

3) Vdelay_ms(переменная), где значение переменной определяет величину задержки в миллисекундах (переменная должна быть типа unsigned int, а величина ее в пределах от 1 до 65535).

Примеры:

 

Delay_us(100); // задержка на время 100 мкс

Delay_ms(2000); // задержка на время 2000 мс = 2 с

unsigned int time = 500;

Vdelay_ms(time); // задержка на время 500 мс