Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Операторы перехода языка 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 мс
Популярное:
|
Последнее изменение этой страницы: 2016-03-17; Просмотров: 2370; Нарушение авторского права страницы