Здавалка
Главная | Обратная связь

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



Рядки 1, 2 програми, я думаю, питань не викликають. У рядках 3–11 відбувається опис усіх використовуваних у програмі змінних. Призначення кожної із цих змінних ми розглянемо в ході опису принципів роботи програми. Далі, у рядках 12–14 відбувається опис констант. Кожна із трьох констант визначає один з параметрів нашого пристрою. Зупинимося на цьому докладніше.

Константа bsize (рядок 12) визначає розмір буфера для зберігання кодової комбінації. Цей розмір обраний рівним 60 гніздам. Враховуючи, що в буфер будуть записуватися коди стану клавіатури, а кожний такий код складається із двох байтів, у буфер зазначеного розміру можна записати послідовність із 30 кодів.

Якщо враховувати, що запису підлягає кожна зміна коду стану, а його зміна відбувається як при натисканні кнопки, так і при її відпусканні, то після натискання й відпускання однієї із кнопок у буфер запишеться два коди.

Виходить, обсягу буфера нам вистачить на 15 послідовних натискань. Цього цілком достатньо, тому що типова кодова комбінація полягає звичайно з 4–5 цифр. Якщо ви вважаєте, що цього недостатньо, ви можете збільшити розмір буфера, просто помінявши значення константи bsize в рядку 12. Максимально можливий розмір обмежений обсягом ОЗУ й рівний приблизно 100 байтам (повний розмір ОЗУ 128 байт).

Урахуйте, що буфер не може займати весь обсяг ОЗУ, тому що у верхніх адресах необхідно обов'язково залишити простір, який буде використовувати пам'ять. Обертаю вашу увагу, що константа bsize використовується для завдання розміру не тільки буфера в ОЗУ, але й для завдання розміру буфера в ЕЕРRОМ, який призначений для довгочасного зберігання кодової комбінації.

Константа kzad (рядок 13) визначає тривалість захисної паузи. Призначення захисної паузи докладно описане вище. Константа являє собою коефіцієнт перерахування для таймера, при якім величина сформованої затримки буде рівна 48 мс.

Константа kandr (рядок 14) – це константа антидрібізгу. Вона

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

Після визначення констант починається блок резервування оперативної пам'яті (рядка 15–17). У рядку 15 вибирається відповідний сегмент пам'яті, у рядку 16 установлюється покажчик на адресу 0x60. Міркування для вибору саме цієї адреси вже приводилися в попередньому прикладі.

Властиво резервування гнізд проводиться в рядку 17. Директива byte резервує необхідна кількість гнізд ОЗУ, починаючи з адреси, обумовленої міткою byfr. У цьому випадку byfr буде рівний 0x60. Кількість гнізд визначається константою bsize.

Далі, у рядках 18–21 відбувається резервування гнізд в енергонезалежній пам'яті (ЕЕРROМ). У рядку 18 вибирається сегмент ЕЕРROМ. У рядку 19 установлюється поточне значення покажчика цього сегмента. Покажчику привласнюється значення 0x08. Тобто розміщення даних у пам'яті ЕЕРROМ буде починатися з восьмого гнізда. Взагалі в цьому випадку можна було починати з нульового гнізда. Це не зроблене лише з міркувань надійності роботи.

Фірма Atmel не рекомендує без особливої необхідності використовувати гніздо з нульовою адресою, тому що саме вона зазнає найбільшому ризику втрати інформації при неприпустимих перепадах напруги живлення, особливо якщо перепади напруги виникають у момент запису інформації в ЕЕРROМ. Тому що ЕЕРROМ не працює зі стеком, у нас є запас по гніздах. Тому ми відступили на цілих вісім гнізд.

Властиво команди резервування займають рядки 20 і 21. У рядку 20 резервується одне гніздо, у якім буде зберігатися довжина ключової комбінації. У рядку 21 резервується буфер довжиною bsize, у якім буде зберігатися сама комбінація.

Після резервування гнізд ми переходимо в сегмент програмного коду (рядок 22). І починаємо формування програми з нульової адреси (команда org у рядку 23). Програмний код починається з таблиці перевизначення векторів переривань (рядки 24–42).

Як бачите, у цьому випадку ми будемо використовувати два види переривань.

Це переривання по збігові в каналі А таймера/лічильника 1 (рядок 28) і переривання по переповненню того ж таймера (рядок 29). Перше переривання використовується для формування захисної затримки в 48 мс. А друге – для формування контрольного проміжку часу в 1 с. Для обох видів переривань призначена та сама процедура обробки: proper. Чому та сама і як вона працює, ми довідаємося трохи пізніше.

У рядках 44–61 розташований модуль ініціалізації. Починається ініціалізація із програмування портів уведення-виводу (рядка 46–53). Усі розряди порту PD і більша частина розрядів порту РВ конфігуруються як входи. І лише два розряди РВ.З і РВ.4 конфігуруються як виходи.

Розряд РВ.4 використовується для керування механізмом замка. А розряд РВ.З взагалі поки не використовується (зарезервований). Його ми будемо використовувати як вихід звуку, коли будемо поєднувати в один пристрій наш кодовий замок і музичну скриньку. Для всіх розрядів обох портів, настроєних на введення, включаються внутрішні навантажувальні резистори. На обох виходах (РВ.З і РВ.4) установлюється низький логічний рівень.

У рядках 54, 55 програмується аналоговий компаратор.

Програмування таймера/лічильника 1 проводиться в рядках 56–61. Спочатку в обидві половинки регістру збігу (OCR1AH, OCR1AL) записується код, що визначає тривалість захисної затримки (рядка 56–59). Потім у регістр стану TCCR1B записується код 0x03 (рядка 60, 61). При записі цього коду таймер/лічильник 1 переводиться в режим Normal з використанням попереднього дільника. А коефіцієнт попереднього розподілу стає рівним 1/64.

Рядки 62–119 займає основний цикл програми, рядка 120–174– набір допоміжних підпрограм, а рядка 175 і 176 – процедура обробки переривань. Розгляд програми зручніше почати з допоміжних процедур.

І перша процедура, яку ми розглянемо – це процедура введення й попередньої обробки коду стану клавіатури. Процедура являє собою підпрограму з іменем incod і розташовано в рядках 120–140. У процесі роботи процедура використовує регістрову пару X і дві допоміжні регістрові пари: codh, codl (описано в рядках 10, 11) і drebh, drebl (описано в рядках 3, 4).

Головне завдання даної процедури – одержати код стану клавіатури, використовуючи алгоритм багаторазового зчитування для боротьби з антидрибізгом. Крім того, процедура виконує ще одну, допоміжну функцію. Вона порівнює отриманий описаним вище способом код стану клавіатури з іншим кодом, який зберігається в парі регістрів codh-codl. Таке порівняння використовується в основній програмі для оцінки значення коду стану.

Таким чином, процедура incod по закінченню своєї роботи повертає два різні значення. По-перше, код стану клавіатури ( у регістровій парі X), а по-друге, результат порівняння коду з контрольним значенням (використовуючи прапор нульового результату Z).

Розглянемо роботу процедури докладніше. По-перше, підпрограма використовує традиційне збереження й відновлення вмісту регістрів у стеці. Цього разу збереженню підлягає всього один регістр – регістр count. У рядку 120 його значення зберігається, а в рядку 139 – відновлюється. Основний же текст підпрограми складається із двох частин:

■ у першій частині (рядка 121–133) реалізується алгоритм уведення коду й боротьби з антибрязком;

■ у другій частині (рядка 134–138) проводиться порівняння отриманого коду із числом у буфері codh-codl.

Почнемо із процедури введення коду й боротьби з антидрибізгом. Ця процедура являє собою нескінченний цикл, який при кожному проході робить формування коду стану клавіатури й при цьому підраховує, скільки раз підряд отриманий код буде мати однакове значення. Для підрахунку використовується регістр count. Причому на початку в count записується константа kandr, і щораз, коли новий код рівний попередньому, уміст count зменшується на одиницю (використовується зворотний рахунок).

Якщо при черговому проході код стану змінить своє значення, то в регістр count знову записується константа kandr, і підрахунок починається спочатку. Закінчується цикл зчитування кодів лише тоді, коли значення count досягнеться нуля. Нове значення коду стану клавіатури формується в регістровій парі X. Для того, щоб нове значення можна було порівнювати зі старим, старе записується в буфер drebh-drebl.

Тепер текст описаної вище програми розглянемо по черзі.

Усе починається з підготовки регістрової пари X до прийняття нового значення коду. У рядках 121, 122 вміст X обнуляется. Нескінченний цикл багаторазового зчитування займає рядки 123–135.

У рядку 123 у регістр count записується початкове значення kandr. У рядках 124, 125 уміст регістрової пари X зберігається в буфері drebh-drebl. У такий спосіб запам'ятовується старе значення коду стану перед тем, як буде отримано нове. У рядках 126–129 відбувається зчитування кодів з портів PD і PB і накладення масок. Отриманий у результаті цих операцій код стану клавіатури виявиться в регістровій парі X.

У рядках 130–133 проводиться порівняння старого й нового значень кодів. Порівняння відбувається побайтно. Спочатку рівняються молодші байти (рядка 130,131), потім старші (рядка 132, 133). Оператор brne виконує перехід за умовою «не рівно». Тому, якщо хоча б одна з операцій порівняння дасть позитивний результат (коди виявляться неоднаковими), те керування перейде по мітці ici. Тобто до того місця програми, де лічильнику count знову привласнюється значення kandr.

Якщо ж обидві операції порівняння дадуть негативні результати коди виявляться рівними, керування перейде до рядка 134. У рядку 134 відбувається зменшення вмісту регістру count на одиницю. Після цього проводиться перевірка на нуль (рядок 135). Якщо після зменшення вмісту count воно ще не дорівнює нулю, то оператор brne у рядку 135 передає керування по мітці ic2, і цикл антидрибізгу триває. А якщо ні, то.цикл завершиться, і керування переходить до рядка 136.

У рядках 136–138 перебуває процедура порівняння тільки що отриманого значення коду стану клавіатури із числом у буфері codh-codl. Порівняння проходить побайтно. Спочатку в рядку 136 рівняються молодші байти. Якщо вони не рівні, то подальше порівняння не має змісту. Тому керування передається по мітці ic5, і підпрограма завершується.

Якщо молодші байти порівнюваних величин виявилися рівні, то остаточний результат порівняння тепер можна одержати, просто зрівнявши між собою старші байти. Це порівняння проводиться в рядку 138.

У результаті, при виході з підпрограми incod:

■ прапор Z буде встановлений, якщо порівнювані коди рівні між собою;

■ прапор Z буде скинутий, якщо коди не рівні.

Наступна додаткова процедура, що забезпечує роботу основної частини програми, – це підпрограма формування затримки. Для формування тимчасових інтервалів ця процедура використовує таймер. Ми вже розглядали два варіанти подібних процедур. Одна з них використовувала пряме читання вмісту таймера й цикл очікування, а друга використовувала переривання.

У цьому випадку розроблений ще один варіант, який являє собою щось середнє між двома попередніми. У цьому варіанті будуть використовуватися й переривання, і цикл очікування. Новий алгоритм реалізує підпрограма wait, яка займає рядки 141–157. Підпрограма має три режими роботи. Номер режиму передається в підпрограму при її виклику.

Для цього він записується в регістр data. У режимі номер 1 підпрограма формує затримку 48 мс. У режимі номер 3 формується затримка в 1 с. У режимі номер 2 затримка не формується. Підпрограма просто набудовує таймер точно так само, як у режимі номер 3, дозволяє переривання й закінчує свою роботу. Контрольний інтервал часу тривалістю 1 з формується вже поза підпрограмою wait (в основному тексті програми).

Основний принцип формування затримки будується на використанні прапора затримки. У якості прапора затримки застосовується регістр flz. Опис цього регістру ви можете бачити в рядку 7 програми. Перед початком циклу затримки в регістр f lz записується нуль. Потім запускається таймер і дозволяється робота одного з видів переривань (переривання по збігові або переривання по переповненню).

У певний момент часу буде викликана процедура обробки переривання. Ця процедура (рядка 156, 176) запише в регістр прапора (f lz) одиницю. Одиниця в регістрі f lz послужить індикатором того факту, що заданий проміжок часу закінчився. Для виявлення моменту закінчення затримки використовується цикл очікування.

У циклі очікування програма постійно перевіряє вміст регістру f lz. Поки f lz дорівнює нулю, цикл триває. Закінчується цикл у той момент, коли f lz буде дорівнює одиниці.

Для формування різних значень тривалості затримки використовуються різні види переривань. Переривання по збігові використовується для формування затримки в 48 мс. Для цього значення регістру збігу обраний таким чином, щоб уміст рахункового регістру досягся цього значення саме через 48 мс. Переривання по переповненню таймера використовується для формування інтервалу часу, рівного однієї секунді. Благо, що при коефіцієнті перерахування попереднього дільника 1/64 і тактовій частоті в 4 Мгц переповнення таймера відбудеться саме через 1 с.

Розглянемо текст підпрограми wait докладніше. Починається підпрограма з перевірки значення регістру data (рядок 141). Як уже говорилося раніше, за допомогою цього регістру в підпрограму передається код номера режиму. У цьому випадку потрібно визначити тривалість формованої затримки.

Від цього залежить, який з видів переривань буде активізований. Для активізації того або іншого виду переривань у регістр маски таймера (TIMSK) ми будемо записувати різні значення маски. У рядках 141–145 саме й вибирається це значення. Вибір зводиться до перевірки номера режиму.

Якщо вміст data рівно 1, то виконується рядок 143, де в якості маски вибирається число 0x40 (переривання по збігові). Обрана маска записується в регістр temp. Оператор безумовного переходу г jmp у рядку 144 передає керування по мітці w2 для того, щоб «перестрибнути» рядок 145, де вибирається інше значення маски.

Якщо код у регістрі data не рівний 1, то керування передається до рядка 145, де в регістр temp записується код 0x80. Маска 0x80 дозволяє переривання по переповненню. Докладніше про настроювання таймера дивитеся в главі 1. У рядку 146 обране значення маски записується в регістр TIMSK.

У рядках 147–149 виконується скидання таймера (в обидві половини рахункового регістру таймера записується нульове значення). Із цього моменту починається відлік часу затримки. У рядку 150 скидається в нуль регістр прапора затримки (flz). А в рядку 151 проводиться глобальний дозвіл переривань. На цьому всі настроювання, необхідні для роботи процедури затримки, закінчуються.

Залишається лише чекати закінчення заданого проміжку часу. Але перш, ніж починати цикл очікування, програма робить ще одну перевірку номера режиму (рядка 152, 153). Справа в тому, що для режиму номер 2 цикл очікування організовувати не потрібно. У цьому випадку цикл очікування розташовується поза підпрограмою wait, у тілі самої програми. Тому, якщо був заданий режим номер 2, то робота підпрограми в цьому місці повинна закінчуватися.

Оператор cpi у рядку 152 перевіряє вміст регістру data, де зберігається код номера режиму на рівність цифрі 2. Якщо код режиму рівний двом, то оператор умовного переходу в рядку 153 передає керування на кінець підпрограми. А якщо ні, то програма переходить до циклу очікування.

Цикл очікування займає всього два рядки (154, 155).

У рядку 154 проводиться перевірка вмісту регістру прапора (flz) на рівність одиниці. Поки лічильник перебуває в процесі рахунку й переривання ще не спрацювало, то вміст регістру flz дорівнює нулю, оператор у рядку 155 передає керування назад на рядок 154, і цикл триває. Як тільки процедура обробки переривання запише в flz одиницю, цикл завершується, і керування переходить до рядка 156. У цьому рядку відбувається глобальна заборона всіх переривань. А в рядку 157 підпрограма wait завершується.

Дві, що залишилися, ще не описані допоміжні процедури призначені для роботи з EEPROM. При записі в цей вид пам'яті й читання з неї потрібно дотримувати певної послідовності дій. Ця послідовність докладно описана в документації на мікроконтролери AVR (див. главу 1).

Там же наведені приклади процедур, рекомендовані виробником для цих цілей. Описувані нижче процедури є практично повною копією рекомендованих процедур, доповнені лише командою автоматичного збільшення адреси. Для керування пам'яттю EEPROM використовуються спеціальні регістри введення-виводу:

EEAR – регістр адреси; EEDR – регістр даних; EECR – регістр керування. Окремі розряди регістру керування також мають свої власні імена: EEWE – біт запису;

EEMWE – біт дозволу записи; EERE – біт читання. Усі назви введені фірмою-виробником і правильно розуміються транслятором, якщо ви не забули приєднати на початку програми файл описів.

Порядок запису байта в EEPROM наступний. Байт даних, призначений для запису, повинен бути поміщений у регістр EEDR, а байт адреси – у регістр в EEAR. Для того, щоб дозволити запис, необхідно встановити біт EEMWE. Потім протягом чотирьох машинних циклів ( тобто наступної ж командою) потрібно встановити біт EEWE. Відразу ж після установки біта EEWE починається процес запису. Цей процес займає досить тривалий час. Усе це час біт EEWE залишається встановленим. По закінченню процесу записи він сам скидається в нуль. Такий багатоступінчастий алгоритм придуманий для запобігання випадкового запису.

Підпрограма, що реалізує описаний вище алгоритм запису байта, називається eewr і займає рядки 158–166. Байт даних, призначений для запису, передається в процедуру за допомогою регістру data, а адреса гнізда, куди потрібно записати дані, – через регістр addre. Робота підпрограми починається із глобальної заборони всіх переривань (рядок 158).

Це обов'язкова умова роботи з EEPROM. Невчасно викликане переривання може перешкодити процесу запису. У цьому випадку заборона переривань є надлишковим заходом, тому що програма побудована таким чином, що при записі в EEPROM переривання завжди заборонені.

У рядках 159,160 розташований цикл перевірки готовності EEPROM. Якщо біт EEWE установлений, це значить, що попередня операція запису ще не кінчена. Тому в рядку 159 перевіряється значення цього біта. Поки значення біта дорівнює одиниці, виконується команда безумовного переходу в рядку 160, і перевірка виконується знову й знову.

Коли значення біта виявиться рівним нулю, рядок 160 буде пропущена (спрацює команда sbic у рядку 159), а цикл очікування перерветься. У рядку 161 відбувається запис адреси з регістру addre у регістр EEAR. У рядку 162 у регістр EEDR записується байт даних з регістру data.

У рядку 163 установлюється біт дозволу записи. У рядку 164 – біт записи. Після установки цього біта процес записи буде запушений. Запис буде йти своєю чергою, а програма може продовжувати свою роботу. Головне – не міняти вміст регістрів EEDR і EEAR, поки процес записи не закінчиться. У рядку 165 відбувається збільшення вмісту регістру addre.

І, нарешті, у рядку 166 підпрограма завершується. Команда в рядку 165 не ставиться до алгоритму запису в EEPROM. Але її застосування дозволяє використовувати підпрограму eewr для послідовного запису ланцюжка байтів, у чому ми й переконаємося далі.

Порядок читання байта набагато простіше. Досить у регістр EEAR записати адреса гнізда, уміст якої потрібно прочитати, а потім установити біт читання (EERE). Прочитаний байт автоматично міститься в регістр EEDR.

Підпрограма читання байта з EEPROM називається eerd і займає рядки 167–174. Адреса гнізда, призначеної для читання, передається в підпрограму через регістр addre. Прочитаний байт даних підпрограма повертає в регістрі data. Починається підпрограма читання, як і підпрограма запису із заборони переривань (рядок 167).

Тому що читанню може передувати запис, перш ніж змінювати значення регістру EEAR, потрібно перевірити, чи закінчився процес запису. Тому в рядках 168, 169 ми бачимо вже знайомий нам цикл очікування готовності EEPROM. У рядку 170 у регістр EEAR записується вміст регістру addre.

У рядку 171 установлюється біт читання (EERE). Як тільки цей біт буде встановлений, моментально відбувається процес читання, і прочитаний байт даних з'являється в регістрі EEDR. У рядку 172 цей байт міститься в регістр data. У рядку 173 відбувається збільшення регістру адреси addre. Зміст цього збільшення такий же, як і в попередньому випадку. Тільки тепер подібне приймання дозволяє читати з EEPROM ланцюжок байтів. У рядку 174 підпрограма eewr завершується.

Тепер перейдемо до основної частини програми. Як уже говорилося, вона займає рядки 62–119. І перше, що виконує основна програма, – цикл очікування відпускання кнопок. У циклі використовується описана вище підпрограма incod. Вона буде не тільки зчитувати код стану клавіатури, але й відразу ж робити його порівняння.

Якщо ви не забули, код стану клавіатури при повністю відпущених кнопках рівний 0x7F, 0x07. У рядках 62, 63 цей код записується в допоміжний буфер codl+codh. Цикл очікування відпускання кнопок розташовано в рядках 64, 65. У рядку 64 викликається підпрограма incod. Вона визначає код стану клавіатури й порівнює отриманий код із числом, записаним у буфері codl+codh.

Якщо код стану клавіатури дорівнює коду в буфері, то після виходу з підпрограми прапор Z буде встановлений. А якщо ні, то– скинутий. Рівність кодів означає, що кнопки відпущені. Тому оператор умовного переходу в рядку 65 перевіряє значення прапора Z. Поки коди різні, керування передається по мітці те, і цикл очікування триває. Як тільки коди виявляться рівними, цикл переривається, і керування переходить до рядка 66.

У рядку 66 починається цикл очікування натискання кнопки. Цикл займає рядки 66, 67 і виглядає майже так само, як цикл очікування відпускання. Відмінність полягає в операторові умовного переходу. Замість brne (перехід за умовою «не рівно») застосовується оператор breq (перехід за умовою «рівно»).

У буфері codl+codh як і раніше перебуває код стану клавіатури при повністю відпущених кнопках. Тому вихід з даного циклу відбудеться тоді, коли буде натиснута кожна із кнопок (SI-S10).

Як тільки натискання буде виявлено, програма переходить у наступну стадію. Отриманий код стану клавіатури повинен стати першим кодом ключової комбінації. Але перш ніж починати цикл уведення цієї комбінації, програма виконує дві дуже важливі операції: У рядках 68, 69 у регістрову пару Z записується адреса початку буфера в ОЗУ, куди буде міститися комбінація, що вводиться. Регістр Z буде зберігати поточний покажчик цього буфера.

Друга важлива операція проводиться в рядку 70. Отут стае 0 лічильник байтів, записаних у буфер. Після цього починається цикл уведення кодової комбінації. Цикл займає рядки 71–88. Починається робота циклу з формування захисної затримки. Чому починається із затримки, якщо ми тільки що одержали перше натискання кнопки?

А згідно з алгоритмом після натискання покладено формувати затримку. Для формування захисної затримки використовується підпрограма wait, що працює в режимі 1. Спочатку в рядку 72 у регістр data записується номер режиму. Потім у рядку 73 викликається підпрограма wait.

Після закінчення захисної затримки в рядку 74 знову проводиться введення коду стану. У рядках 75, 76 отриманий код записується в буфер. Для запису використовуються команди, що збільшують значення покажчика (Z). Тому після запису кожного чергового байта покажчик пересувається в наступну позицію. Потім у рядках 77, 78 збільшується значення лічильника прийнятих байтів. Тому що ми записали два байти, те й значення лічильника збільшується двічі.

У рядках 79, 80 проводиться оцінка довжини введеного коду. Якщо довжина перевищить розміри буфера, то цикл уведення коду достроково припиняється. У рядку 79 проводиться порівняння поточного значення лічильника з розміром буфера.

У рядку 80 перебуває оператор умовного переходу, який передає керування по мітці т7 у випадку, якщо довжина коду перевищить розмір буфера. У рядках 81, 82 код стану клавіатури записується в буфер codh-codl. Робиться це для того, щоб наступний уведений код стану можна було порівнювати з поточним.

Далі програма повинна очікувати чергова зміни коду стану. Але спочатку потрібно запустити таймер, щоб він почав формування захисного проміжку часу. Якщо протягом цього проміжку не буде натиснута жодна кнопка, то це повинне послужити сигналом до виходу із циклу введення ключової комбінації. Запуск таймера проводиться за допомогою підпрограми wait у режимі номер два. У рядку 83 у регістр data записується номер режиму, а в рядку 84 викликається сама підпрограма.

У рядках 85–88 організований комбінований цикл очікування. У тілі циклу відбувається відразу кілька операцій. По-перше, уводиться нове значення коду стану клавіатури (рядок 85). У процесі введення новий код рівняється зі старим, який зберігається в буфері codh-codl. Якщо коди не рівні, то оператор умовного переходу в рядку 86 передає керування по мітці m3, де відбувається формування захисної затримки, потім повторне зчитування й запис коду в буфер і так далі.

Якщо нове значення коду рівно старому, комбінований цикл триває. У рядку 87 проводиться перевірка прапора затримки flz. Якщо прапор дорівнює нулю, це значить, що захисний проміжок часу ще не закінчився. У цьому випадку оператор умовного переходу в рядку 88 передає керування по мітці m6, і комбінований цикл триває спочатку. Якщо значення прапора flz дорівнює одиниці, то цикл завершується, і керування переходить до рядка 89.

У рядках 89, 90 відбувається перевірка перемикача режимів роботи (SII). Залежно від стану цього перемикача отримана тільки що кодова комбінація або записується в ЕЕРROМ (режим «Запис»), або надходить у процедуру перевірки (режим «Робота»). Команда зЬіс у рядку 89 перевіряє значення сьомого біта регістру PINB.

Якщо біт дорівнює нулю (контакти тумблера замкнені), то рядок 90 не виконується, і керування переходить до рядка 91, де починається процедура запису в ЕЕРROМ Якщо значення розряду дорівнює одиниці (контакти тумблера не замкнені), оператор умовного переходу в рядку 90 передає керування по мітці m9 на початок процедури порівняння.

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.