Оператор перехода 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 мс