Материал: 1

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

#pragma

Директива, що задає спеціальні команди для компілятора. В якості параметра в директиві зазначається задається команда. Нижче наведено ряд прикладів використання цієї директиви.

Включення / відключення повідомлень про помилки.

#pragma warn- // Вимикає попереджувальні повідомлення.

#pragma warn + // Включає попереджувальні повідомлення.

Включення / відключення оптимізації результуючого коду.

#pragma opt- // Вимикає оптимізацію.

#pragma opt + // Включає оптимізацію.

Включення / відключення оптимізації щодо мінімального розміру

результуючого коду.

#pragma optsize- // Вимикає оптимізацію за розміром.

#pragma optsize + // Включає оптимізацію за розміром.

І так далі. Повний список всіх команд, що передаються безпосередньо цієї директиви, ви можете знайти в файлі допомоги програми CodeVision в розділі

«Препроцесор» ( «The Preprocessor»).

eeprom

Керуючий слово, яке використовується при описі змінних (масивів), яке вказує транслятора, що дана змінна (Масив) буде розташовуватися в незалежній пам'яті даних (Берн). Наприклад, в рядку 9 програми знаходиться опис змінної к1еn, призначеної для зберігання довжини кодової комбінації, а в рядку 10

- 16 -

описується масив, в якому буде зберігатися сама комбінація. І змінна, і масив розміщуються в ЕЕРROM.

return

Команда повернення значення. Якщо функція мови СІ повинна повертати значення, останньою командою в тілі цієї функції повинна бути команда return. Як параметр цієї команди вказується значення, що повертається.

Прикладом може служити функція incod(), що займає в нашій програмі (лістинг 1.20) рядка 16-26. Функція виробляє визначення коду стану клавіатури з використаням процедури антидребезга. За результатами своєї роботи функція повинна повертати код стану клавіатури »Тому остання команда в тілі функції (рядок 26) - це команда return. В якості параметра ця команда використовує змінну codl, яка і містить сформований код стану.

Крімновихкоманд,втекстіпрограми (лістинг 1.20)використовуєтьсяодин, поки ще не знайомий нам цікавий прийом. подивіться, будь ласка, на рядок 54 програми. У цьому рядку записано вираз, який присвоює елементу масиву bufr значеннязмінноїcodS. Однаквякостіномераелементамасивувикористовується не просто змінна ii, а вираз ii + +. це і є ще одна оригінальна особливість мови СІ.

Мова СІ допускає одночасно використовувати змінну в будь-якому вираженні і змінювати її значення. Так, при обчисленні вираження bufг [ii + +]= codSспочаткуелементумасивузномером iiприсвоюється значенняcods,апотім значення змінної ii збільшується на одиницю. Такий же прийом допускається при використанні змінних в якості параметрів функцій або в складі будь-яких інших виразів. Крім команди збільшення, можна використовувати команду зменшення, а також змінювати порядок обчислень. Ось кілька прикладів таких виразів:

a = MyBuffer [++ ii] ; b = MyFunction (ii--) ; c = 85 + (- -ii) / 2;

- 17 -

У будь-якому випадку, при використанні даного прийому виконуютьсятакі правила:

ii ++ означає: використовувати значення, а потім збільшити його на одиницю.

++ іі означає: збільшити значення на одиницю, а потім використовувати його.

і + і - означає: використовувати значення, а потім зменшити його на одиницю.

--ііозначає:зменшити значення наодиницю, а потім використовувати його.

Природно,замістьзмінноїiiможевикористовуватисябудь-яка іншазмінна.

Опис програми (лістинг 1.20)

Кардинальною відмінністю програми на мові СІ є той факт, що всі шістнадцятирозрядні значення, використовувані в програмі, тепер не потрібно розбивати на окремі байти. Для зберігання кожної такої величини програма використовує або зммінну, або константу відповідного типу.

Наприклад, для зберігання різних варіантів коду стану клавіатури в програмі використовується кілька змінних:

cod0 - рядок 17;

codl - рядок 18;

- 18 -

codS - рядок 37.

Лістинг 1.20

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

Project : Зразок 10

Version : 1

Date : 07/=.03.2006.

Author : Belov

Company : Home

Comments :

Кодовий замок

Chip type

: ATtiny2313

Clock frequency

: 4, 000000 MHz

Memory model

: Tiny

Data Stack size

32

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

1# include <tiny2313.h>

2

#define klfree 0x77F

//Код стану при повністю відпущенихкнопках

3

#define kzad 3000

//Код затримки при скануванні

4

#define kandr 20

//Константа антидребезга

5

#define bsize 30

//Розмір буфета для зберігання коду

6

unsigned char flz;

//Прапор затримки

7

unsigner int bufr [bsize];

//Буфер в ОЗУ для зберігання коду

8#pragma warn –

9eeprom unsigned char klen ; //Комірки для зберігання довжини коду

10 eeprom unsigned int bufe [bsize]; //Буфер в EEPROM для зберігання коду

- 19 -

11#pragma warn-

// Переривання по переповненні таймера 1

12interrupt [TIM1_0VF] void timer1_ovf_isr(void)

{

13flz=1;

}

//Переривання по співпадінню в каналі А Таймера 1

14interrupt [TIM1_COMPA] void timer1_compa_isr(void)

{

15flz=1;

}

//Функція запиту клавіатури і антидребезга

16unsigned intincod (void)

 

{

//Створюємо локальні змінні

17

unsigned int cod0=0;

//Допоміжна змінна

18

unsigned int cod1;

//Ще одна допоміжна змінна

19

unsigned char k;

//Параметр циклу антидребзга

20

for (k=0; k<kandr; k++)

// Цикл антидребезга

 

{

 

21

cod1=PINB&0x7;

//Формує перший байт коду

22

cod1=(cod1<<8)+(PIND&0x7F); //Формує повний код стануклавіатур

23

if (cod0!=cod1)

//Порівнюємо з початковим кодом

 

{

 

24

k=0;

//Якщо не рівні , скидаємо лічильник

25

cod0=cod1 ;

//Нове значення початкового коду

 

}

 

 

}

 

26return cod1;

}

//Процедура формування затримки

27void wait (unsigned char kodz)

{

28

if (kodz==1) TIMSK=0x40;

//Вибір маски переривань по таймеру

- 20 -

Источник: https://studfile.net/preview/14570694/