#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 -