Допомога у написанні освітніх робіт...
Допоможемо швидко та з гарантією якості!

Калькулятор з динамічною індикацією

КурсоваДопомога в написанніДізнатися вартістьмоєї роботи

Редактор друкованих плат P-CAD використовується для розміщення компонентів на трасованому полі для ручного, інтерактивного або автоматичного трасування провідників. У інтерактивному режимі курсором наголошується початок і кінець сегменту провідника, який відразу ж трасується з урахуванням перепон. При цьому дотримуються всі обмеження на проведення траси, встановлені користувачем. У систему P-CAD… Читати ще >

Калькулятор з динамічною індикацією (реферат, курсова, диплом, контрольна)

МІНІСТЕРСТВО АГРАРНОЇ ПОЛІТИКИ УКРАЇНИ

ЛУГАНСЬКИЙ ПОЛІТЕХНІЧНИЙ КОЛЕДЖ

Відділення: Комп’ютерні системи Спеціальність: Обслуговування інтелектуальних інтегрованих систем

ПОЯСНЮВАЛЬНА ЗАПИСКА

до курсового проекту з дисципліни:

«ЕКСПЛУАТАЦІЯ ТЕХНІЧНИХ ЗАСОБІВ ІНТЕЛЕКТУАЛЬНИХ СИСТЕМ»

на тему: «Калькулятор з динамічною індикацією«

Студент Колозін В.В.

Група І 42−07

Зав. відділення Брудерс Е.П.

Керівник проекту Львов С.О.

г. Луганськ, 2010 г.

МІНІСТЕРСТВО АГРАРНОЇ ПОЛІТИКИ УКРАЇНИ

ЛУГАНСЬКИЙ ПОЛІТЕХНІЧНИЙ КОЛЕДЖ

ЗАВДАННЯ

на курсовий проект

Тема проекту ____________________________________________

затверджена наказом по коледжу «___» _________ 2003 г. № ______

Термін здачі курсового проекту _____________________________

Вхідні дані____________________________________________

Вміст поясненої записки (перерахування розділів, які належить розробити ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Об'єм графічного материалу ______________________________ ______________________________________________________________________________________________________________________________________________________________________________________________________

Студент ___________________________________

Керівник проекту ________________________

Дата видачі завдання «___» ____________ 2010 г.

РЕФЕРАТ

Курсовий проект містить пояснювальну записку на 35 аркушах формату А4, яка включає 2 малюнки, 8літературних джерел, 1 додаток, 3 листи графічної частини.

Ключові слова:

МІКРОКОНТЛРОЛЕР, СЕРЕДОВИЩЕ РОЗРОБКИ, ПРОГРАМ, КЕРУЮЧА ПРОГРАМА, СИГНАЛЬНИЙ ШАР, ДОПОМІЖНИЙ ШАР, ДИНАМІЧНА ІНДИКАЦІЯ, КНОПКИ, КВАРЦОВИЙ РЕЗОНАТОР, СИСТЕМА СКИДАННЯ, ДРУКОВАНА ПЛАТА.

Метою курсової роботи є розробка калькулятора з використанням динамічної індикації. Для керування калькулятором повинно застосовуватися шістнадцять кнопок: «Кнопки вводу цифр від 0 до 9», «Кнопки додавання, віднімання, множення, ділення та дорівнює», «Кнопка збросу». Виконання розробки пристрою виконувалося за допомогою програм автоматизованого проектування: P-CAD, Keil µVision і Компас.

ЗМІСТ

калькулятор динамічна індикаця

  • РЕФЕРАТ
  • ВСТУП
  • 1 РОЗРОБКА ПРИНЦИПОВОЇ СХЕМИ ПРИСТРОЮ
  • 2 РОЗДІЛЕННЯ ПРОЕКТНОГО ПРИСТРОЮ НА ОКРЕМІ МОДУЛІ
  • 3 РОЗРОБКА ДРУКОВАНИХ ПЛАТ МОДУЛІВ ПРОЕКТОВАНОГО ПРИТРОЮ
  • 4 РОЗРОБКА ПРОГРАМИ КЕРУВАННЯ
  • 5 РОЗРОБКА КОНСТРУКТИВУ
  • ВИСНОВОК
  • ЛІТЕРАТУРА
  • ДОДАТОК

ВСТУП

Останні роки відмічені масовим наповненням ринку всілякою автоматизованою апаратурою самого різного призначення і самої різної складності від пластикової платіжної картки до холодильника, автомобіля і складних установок. Це стало можливим завдяки мікроконтролерам. Мікроконтролери входять у всі сфери життєдіяльності людини, їх насиченість в нашому оточенні росте з року в рік. Те, що здавалося 10 років тому недосяжним зараз цілком можливо завдяки стрімкому розвитку технології виробництва електронних компонентів.

Кожна фірма, що виробляє мікроконтролери ATMEL, INTEL, MICROCHIP, має більше 100 видів різних за призначенням мікроконтролерів, а кожен мікроконтролер не менше 200 сторінок технічних описів і характеристик.

Поява першого мікропроцесора, змінило підхід до проектування і реалізації цифрових систем, зажадавши використання нових архітектурних і структурних рішень. Це стало можливим завдяки розвитку мікропроцесорної техніки, створенню технологічної бази для виробництва новихтипів процесорів. Прогресом мікроелектроніки є розвиток вбудованих мікроконтролерів, сфера застосування яких опинилася у багато разів ширше, ніж мікропроцесорів. Всі ці роки не припинялося гостре суперництво провідних електронних фірм за лідерство в цій високоперспективній області. Результатом суперництва є розробка все нових сімейств і типів мікропроцесорів, розширення їх функціональних можливостей, швидке зростання продуктивності і зниження вартості, також сучасні мікро контролери можна перепрограмувати до декількох тисяч разів .

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

1 РОЗРОБКА ПРИНЦИПОВОЇ СХЕМИ ПРИСТРОЮ

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

Умовні графічні позначення мають просту форму по зображенню. У них по можливості включені найбільш характерні особливості кожного елементу, що полегшує запам’ятовування цих елементів. Вони не відображають величну елементів, що позначаються, а тільки визначають їх тип. Один і той же знак позначає і маленький по величині і параметрам елемент, і великий. Тому схеми не можуть розміри виробу.

Принципові схеми дозволяють прослідкувати проходження струму в кожному ланцюзі, розуміти роботу окремих апаратів, пов’язану з проходженням струму в тих або інших ланцюгах. Вони дозволяють встановити кількість елементів, що входять в їх склад.

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

У умовних буквено-цифрових позначеннях застосовують прописні букви латинського і російського алфавітів і арабські цифри однакової висоти. Прийняті наступні позначення елементів: конденсатори — С, резистори — R, кнопки — К і т.п.

При виконанні електричних схем застосовують наступні лінії:

— суцільну основну товщиною s=0,2…0,6 мм залежно від форматів схеми і розмірів графічних позначень для зображення ліній електричного зв’язку (дріт, кабель, шина), всіх видів обмоток, резисторів, конденсаторів і др.;

— суцільну потовщену лінію завтовшки 2s (практично рівну 0,6.0,8мм) для позначення сердечників і з'єднань з корпусом;

— штрихову лінію товщиною s для зображення сіток електронних приладів;

— штрихову лінію завтовшки s/2, але не менш 0,2 мм для зображення ліній механічного зв’язку в електричних схемах, ліній екранування.

Порядкові номери елементам в позиційних позначеннях привласнюють, враховуючи їх розташування на схемі, зазвичай зліва направо і зверху вниз.

Перший етап побудови принципової схеми в P-CAD пов’язаний з розробкою власної бібліотеки стандартних «кубиків», з яких створюватимуться електричні схеми.

Графічний редактор P-CAD Schematic призначений для введення принципових схем виробів. Легко дозволяє створювати складні багато листові схеми, зокрема з ієрархічною структурою. Володіє засобами перевірки схем. Дозволяє створювати і поміщати в бібліотеки символи нових компонентів і редагувати що існують.

Принципова схема створюваного пристрою, складається з декількох модулів або блоків. Центральною частиною пристрою є мікроконтролер фірми ATMEL AT89S8252, який управляє роботою всього пристрою. Виведення даних на динамічну індикацію здійснюється через порт Р1, який має блок обмеження струму. Блок індикації складається з восьми розрядів сегментних індикаторів.

Модуль схеми кварцового резонатора на основі конденсаторів С2, С3 і кварцового резонатора ZQ1 забезпечує вироблення тактової частоти 24MHz, для роботи мікроконтролера.

На принциповій схемі зображені такі основні модулі: модуль індикації, модуль клавіатури та модуль мікропроцесорного блоку.

Для роботи мікроконтролера тільки з внутрішньою пам’яттю, ігноруючи зовнішню пам’ять, на вихід EA поданий позитивний рівень сигналу.

Схема на основі конденсатора С1 і резистора R2, який має опір 1,5К забезпечує запуск мікроконтролера при включенні живлення.

Робота мікроконтролера базується на коді внутрішньої програми, яка записана в FLASH пам’яті і керує всіма процесами, що відбуваються в даній схемі.

2 РОЗДІЛЕННЯ ПРОЕКТНОГО ПРИСТРОЮ НА ОКРЕМІ МОДУЛІ

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

Враховуючи конструктивні особливості створюваного пристрою, дану принципову схему можна умовно розділити на два основні блоки: процесорний блок — це блок обробки інформації і модуль індикації.

За завданням в своєму складі пристрій повинен мати шістнадцять кнопок, що дозволяють виконувати управління пристроєм, що розробляється. У якості кнопки можна використовувати звичайну мікро кнопку, або плівкову. Такі плівкові кнопки на сьогоднішній день доступні, досить прості і зручні у використанні. Ця кнопка має спеціальний, гнучкий шлейф для її підключення. У разі використання такої кнопки, на процесорній платі необхідно передбачати спеціальний роз'єм для її підключення. Гнучка плівкова кнопка це завжди багатошаровий збірний виріб. Верхній шар або видима частина з друком прозорими вікнами, кнопками вдає із себе ніщо інше, як лицьову декоративну приладову панель. Єдина відмінність полягає в тому, що під кнопками плівкової клавіатури розташовується струмопровідні площадки. Їх може і не бути, але тоді під кнопками розташовуються металеві мембрани. Використання таких кнопок дуже зручно, але ж ціна на них вище ніж на звичайні мікро кнопки. Необхідно відзначити, що використання плівкової кнопки веде ще і до додаткових витрат. У зв’язку з цим свій вибір необхідно зупинити на звичайних мікрококах.

У випадку звичайної мікро кнопки на друкованій платі необхідно передбачити спеціальні контактні площадки для їх підключення за допомогою проводів.

3 РОЗРОБКА ДРУКОВАНИХ ПЛАТ МОДУЛІВ ПРОЕКТОВАНОГО ПРИТРОЮ

Редактор друкованих плат P-CAD використовується для розміщення компонентів на трасованому полі для ручного, інтерактивного або автоматичного трасування провідників. У інтерактивному режимі курсором наголошується початок і кінець сегменту провідника, який відразу ж трасується з урахуванням перепон. При цьому дотримуються всі обмеження на проведення траси, встановлені користувачем. У систему P-CAD входить чотири програми автоматичного трасування — Quick Route, PRO Route 2/4, PRO Route і P-CAD Shape-Based Router. Для вибору потрібної програми використовується команда Route/Autorouters з редактора P-CAD PCB. Автотрасувальник Quick Route використовується для трасування нескладних плат, що містять невелике число компонентів. Quick Route дозволяє вибрати переважну орієнтацію провідників на кожному шарі трасування. Для двосторонніх плат зазвичай вибирається горизонтальна орієнтація провідників на верхньому шарі і вертикальна на нижньому. Проте ця угода перешкоджає трасування компонентів з планарними виводами, орієнтованими по горизонталі на верхній стороні плати або по вертикалі на нижній.

Після закінчення розробки принципової схеми здійснюється розробка друкованих плат. Для того щоб була можливість перейти від символьних уявлень компонентів до корпусних необхідно створити список з'єднань Netlist. Для цього за допомогою команди закладки Utils>Generate Netlist. Створюється файл списку електричних з'єднань, який потім завантажується в редактор P-CAD PCB і на поле друкованої плати переносяться зображення корпусів компонентів з вказівкою ліній електричних зв’язків між їх виводами

Ця операція називається упаковка схеми на друковану плату.

Для завантаження в редактор друкованих плат списку ланцюгів і компонентів виконуються наступні дії:

— у головному меню редактора PCB активізуємо команду Utils>Load Netlist;

— на панелі Load Netlist натискаємо кнопку Netlist Filename і стандартним для Windows способом знаходимо і вибираємо підготовлений для системи P-CAD файл списку з'єднань.

Оскільки в системі P-CAD можливі різні варіанти завантажування списку ланцюгів, то обираємо необхідний.

На друкованій платі ми здійснюємо логічну розстановку її елементів, для оптимізації параметрів початкової друкованої плати. Розташування елементів здійснюється так, щоб елементи були розташовані як можна компактніше і розділені по логічних блоках пристрою. При розмішені компонентів поворот їх на кут 90 за годинниковою стрілкою здійснюється натисненням на клавішу R, а перенесення на протилежну сторону друкованої плати — натисненням клавіші F. «Павутина» ліній, що зображують зв’язку, вирішити або заборонити їх відображення і т.п. Для цих цілей служить команда Edit Nets. При розмішені компонентів часто потрібно змінити їх властивості, зокрема зафіксувати компонент, змінити тип посадочного місця і т. п. Для цілей служить команда Edit>Properties.

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

На основній друкованій платі виділяються наступні логічні блоки: модуль плати на основі конденсаторів С2, С3 і кварцового резонатора QZ1, з частотою 24 MHz; блок живлення на основі конденсатора С1 і резистора R2 які забезпечують запуск мікроконтролера при включенні живлення.

Блок сегментних індикаторів, які відображують вивід на індикатор потрібної інформації.

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

4 РОЗРОБКА ПРОГРАМИ КЕРУВАННЯ

У цьому розділі проводиться аналіз проектованого пристрою з погляду програмного забезпечення. Розглянуті принципи побудови основних блоків програми, принцип їх функціонування і приводяться блок — схеми до основних процедур програми управління.

Розробка програми управління до проектованого пристрою проводилася в середовищі програмування програмі Keil uVision 6.10 на мові програмування Сі. Це середовище програмування призначене для розробки програм управління для мікроконтролерів сімейства MCS — 51 різних фірм виробників. Ця програма дозволяє проводити розробку програм на мовах Сі і асемблера, а також дозволяє виконувати від ладку розробленого програмного забезпечення в покроковому режимі, що є не маловажним при розробці програми управління.

Інструментальні засоби Keil Software включають C, EC (Embedded C) і C++ компілятори, асемблери, відгадчики і стимулятори, інтегровані середовища розробки, операційні системи розрахунків, а також оцінні плати і емулятори. Keil Software розробляє і проводить засоби розробки у тому числі і для сімейства мікроконтролерів 8051. Крос-компілятор мови ANSI Ci Keil C51 підтримує всі класичні і розширені варіанти сімейства 8051 з об'ємом пам’яті до 16Mb. Keil C51 дозволяє створювати програми на мові С, зберігаючи ефективність і швидкість оптимізації асемблера, тобто стискання при обмеженому об'ємі вбудованою в мікроконтролер Flesh пам’яті. Лістинг програми приводиться в додатку 1.

Програма складається з окремих процедур. Всі процедури програми управління ми умовно розділимо на три групи: процедура ініціалізації мікро контролера, процедури обробки переривань і допоміжні процедури.

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

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

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

5 РОЗРОБКА КОНСТРУКТИВУ

Система КОМПАС дозволяє автоматизувати процес розробки виробів шляхом параметричного моделювання, яке управляє взаємним розташуванням елементів конструкції і автоматично оновлює моделі і креслення в процесі внесення в них змін. Маючи такі могутні можливості, система дозволяє підвищити продуктивність проектування у декілька разів.

У новій версії КОМПАС значно спрощена процедура створення тривимірних твердоті лих моделей з двовимірними. Повна орієнтація на інтерфейс Windows багато в чому спростила роботу користувачів. З’явилася можливість створювати реалістичні тривимірні моделі. Остання версія системи КОМПАС зі всіма своїми удосконалення обігнала всі аналоги САПР середнього рівня, що існували зараз.

Параметрична технологія системи дозволяє швидко отримувати моделі типових виробів на основі одного разу спроектованого прототипу.

Ключовою особливістю КОМПАС є використання власного математичного ядра і параметричних технологій, розроблених фахівцями АСКОН.

Основні завдання, що вирішуються системою:

— моделювання виробів з метою створення конструкторської і технологічної документації, необхідно для їх випуску (складальних креслень, специфікацій, деталювань і т.д.);

— моделювання виробів з метою розрахунку їх геометричних і массо-центрових характеристик;

— моделювання виробів для передачі геометрії в розрахункові пакети;

— Моделювання деталей для геометрії в пакет розробки програм, що управляють, для устаткування з ЧПУ;

— Створення ізометричних зображень виробів (наприклад, для складання каталогів, створення ілюстрацій до технічної документації і т.д.).

Розроблений конструктив для проектованого пристрою має зручний доступ до органів управління, хорошу видимість елементів індикації. Конструктив складається з двох частин — верхньою, зображеною на мал. 1, і нижній — зображеною на мал.2. На верхній частині конструктиву розташовані елементи для кріплення плати індикації, а також є виріз для розташування сегментних індикаторів.

ВИСНОВОК

В результаті виконання курсового проекту був розробленій калькулятор з динамічною індикацією. Розроблена принципова схема та друкована плата, а також управляюча програма для мікроконтролера. За допомогою системи КОМПАС була виконана трьохвимірна модель конструктива пристрою.

Побудова пристрою на базі мікроконтролера AT89S8252 фірми ATMEL дозволила зменшити габаритні розміри і вартість пристрою, реалізувати програмний код налагодження процесу керування схемою. Даний код програми можливо вдосконалити та доповнити для подальшого модернізування. Розроблений пристрій є простим з погляду схемотехніки.

ЛІТЕРАТУРА

В. Д. Разевиг. Система проектирования печатных плат ACCEL EDA 15 (P-CAD 2000). — Г.: «Солон-Р», 2001.

В. Б. Бородин, И. И. Шагулин. Микроконтроллеры. Архитектура, программирование, интерфейс. — Г.: Изд-во ЭКОМ, 1999. — 400 с.: ил.

Встраиваемый микроконтроллер 8XC251SB. Руководство пользователя. — К., «Квазар-Микро», 1995.

Микроконтроллеры. (электронное пособие).

Программирование на С++: Учебное пособие/В. П. Аверкин, А. И. Бобровский, В. В. Веснич, В. Ф. Радушинский, А. Д. Хомоненко; Под ред. проф. А. Д. Хомоненко. — Спб.: КОРОНА принт, 1999. — 256 с.: ил.

А. Э. Потемкин. Инженерная графика. Просто и доступно. (Книга в электронном формате).

ГОСТ 2.105.-95. ЕСКД. Общие требования к текстовым документам. — К.: Госстандарты Украины, 1996.

ГОСТ 2.109.-73. ЕСКД. Основные требования к чертежам. — М.: Стандарт, 1973.

ДОДАТОК

#include

//Определение значения старшей части счетного регистра

#define Th0 0xF8 //1млс

//Определение значения младшей части счетного регистра

#define Tl0 0x2F

//Первый операнд

long Number1;

//Второй операнд

long Number2;

//Результат вычислений

long Res;

//Массив для отображения индицируемых значений

char Numb[13] = {0x3f, 0×06,0x5b, 0x4f, 0×66,0x6d, 0x7d, 0×07,0x7f, 0x6f, 0×39,0×50,0x5C};

char KeyBoard[4][4]; //Массив состояний клавиатуры

char EnterKey[8]; //Массив введенных значений

char IndVal[9]; //Индицируемые значения

unsigned char TimeKey; //Счетчик для опроса клавиатуры

unsigned char TimeInd; //Счетчик для индикации

unsigned char Key = 0; //Счетчик введенных кнопок

unsigned char Ind = 1; //Счетчик разрядов индикатора

unsigned char Op = 0; //Признак выполняемой операции

bit Rav = 0; //Признак нажатой кнопки «=»

bit EntNum1 = 1; //Признак ввода первого операнда

//Процедура формирования введенного числа

long FormingNumber ()

{

unsigned long Number = 0; //Введенное число

unsigned long K = 1; //Множитель

char i; //Счетчик

//Организация цикла для формирование введенного числа

for (i=Key-1; i<0 ;i—)

{

Number = Number + EnterKey[i]*K; //Расчет введенного числа

K = K * 10; //Пересчет множителя

}

return Number;

}

//Процедура определения номера вводимого числа

void OpredNum ()

{

//Определение номера вводимого числа

if ((Op ≠ 0) & EntNum1) EntNum1 = 0;

if (Rav) Rav = 0;

}

//Процедура чтения нажатых кнопок

void ReadKey ()

{

char i; //Счетчик

//Проверка нажатия кнопки «0»

if (KeyBoard[0][0] == 0)

{

//Определение номера вводимого числа

OpredNum ();

//Проверка возможности ввода

if (Key < 8)

{

//Занесения значения нажатой кнопки в массив ввода

EnterKey[Key] = 0;

//Увеличение счетчика нажатых кнопок

Key++;

}

//Устранение эффекта дребезга контакта

while (!KeyBoard[0][0]);

}

//Проверка нажатия кнопки «1»

if (KeyBoard[1][0] == 0)

{

//Определение номера вводимого числа

OpredNum ();

//Проверка возможности ввода

if (Key < 8)

{

//Занесения значения нажатой кнопки в массив ввода

EnterKey[Key] = 1;

//Увеличение счетчика нажатых кнопок

Key++;

}

//Устранение эффекта дребезга контакта

while (!KeyBoard[1][0]);

}

//Проверка нажатия кнопки «2»

if (KeyBoard[2][0] == 0)

{

//Определение номера вводимого числа

OpredNum ();

//Проверка возможности ввода

if (Key < 8)

{

//Занесения значения нажатой кнопки в массив ввода

EnterKey[Key] = 2;

//Увеличение счетчика нажатых кнопок

Key++;

}

//Устранение эффекта дребезга контакта

while (!KeyBoard[2][0]);

}

//Проверка нажатия кнопки «3»

if (KeyBoard[3][0] == 0)

{

//Определение номера вводимого числа

OpredNum ();

//Проверка возможности ввода

if (Key < 8)

{

//Занесения значения нажатой кнопки в массив ввода

EnterKey[Key] = 3;

//Увеличение счетчика нажатых кнопок

Key++;

}

//Устранение эффекта дребезга контакта

while (!KeyBoard[3][0]);

}

//Проверка нажатия кнопки «4»

if (KeyBoard[0][1] == 0)

{

//Определение номера вводимого числа

OpredNum ();

//Проверка возможности ввода

if (Key < 8)

{

//Занесения значения нажатой кнопки в массив ввода

EnterKey[Key] = 4;

//Увеличение счетчика нажатых кнопок

Key++;

}

//Устранение эффекта дребезга контакта

while (!KeyBoard[0][1]);

}

//Проверка нажатия кнопки «5»

if (KeyBoard[1][1] == 0)

{

//Определение номера вводимого числа

OpredNum ();

//Проверка возможности ввода

if (Key < 8)

{

//Занесения значения нажатой кнопки в массив ввода

EnterKey[Key] = 5;

//Увеличение счетчика нажатых кнопок

Key++;

}

//Устранение эффекта дребезга контакта

while (!KeyBoard[1][1]);

}

//Проверка нажатия кнопки «6»

if (KeyBoard[2][1] == 0)

{

//Определение номера вводимого числа

OpredNum ();

//Проверка возможности ввода

if (Key < 8)

{

//Занесения значения нажатой кнопки в массив ввода

EnterKey[Key] = 6;

//Увеличение счетчика нажатых кнопок

Key++;

}

//Устранение эффекта дребезга контакта

while (!KeyBoard[2][1]);

}

//Проверка нажатия кнопки «7»

if (KeyBoard[3][1] == 0)

{

//Определение номера вводимого числа

OpredNum ();

//Проверка возможности ввода

if (Key < 8)

{

//Занесения значения нажатой кнопки в массив ввода

EnterKey[Key] = 7;

//Увеличение счетчика нажатых кнопок

Key++;

}

//Устранение эффекта дребезга контакта

while (!KeyBoard[3][1]);

}

//Проверка нажатия кнопки «8»

if (KeyBoard[0][2] == 0)

{

//Определение номера вводимого числа

OpredNum ();

//Проверка возможности ввода

if (Key < 8)

{

//Занесения значения нажатой кнопки в массив ввода

EnterKey[Key] = 8;

//Увеличение счетчика нажатых кнопок

Key++;

}

//Устранение эффекта дребезга контакта

while (!KeyBoard[0][2]);

}

//Проверка нажатия кнопки «9»

if (KeyBoard[1][2] == 0)

{

//Определение номера вводимого числа

OpredNum ();

//Проверка возможности ввода

if (Key < 8)

{

//Занесения значения нажатой кнопки в массив ввода

EnterKey[Key] = 9;

//Увеличение счетчика нажатых кнопок

Key++;

}

//Устранение эффекта дребезга контакта

while (!KeyBoard[1][2]);

}

//Проверка нажатия кнопки «+»

if (KeyBoard[2][2] == 0)

{

//Проверка возможности выбора операции

if (!Op & Key)

{

//Признак операции сложения

Op = 1;

//Формирование первого операнда

Number1 = FormingNumber ();

//Сброс счетчика нажатых кнопок

Key = 0;

}

//Устранение эффекта дребезга контакта

while (!KeyBoard[2][2]);

}

//Проверка нажатия кнопки «-»

if (KeyBoard[0][3] == 0)

{

//Проверка возможности выбора операции

if (!Op & Key)

{

//Признак операции вычитания

Op = 2;

//Формирование первого операнда

Number1 = FormingNumber ();

//Сброс счетчика нажатых кнопок

Key = 0;

}

//Устранение эффекта дребезга контакта

while (!KeyBoard[0][3]);

}

//Проверка нажатия кнопки «*»

if (KeyBoard[1][3] == 0)

{

//Проверка возможности выбора операции

if (!Op & Key)

{

//Признак операции умножения

Op = 3;

//Формирование первого операнда

Number1 = FormingNumber ();

//Сброс счетчика нажатых кнопок

Key = 0;

}

//Устранение эффекта дребезга контакта

while (!KeyBoard[1][3]);

}

//Проверка нажатия кнопки «/»

if (KeyBoard[2][3] == 0)

{

//Проверка возможности выбора операции

if (!Op & Key)

{

//Признак операции деления

Op = 4;

//Формирование первого операнда

Number1 = FormingNumber ();

//Сброс счетчика нажатых кнопок

Key = 0;

}

//Устранение эффекта дребезга контакта

while (!KeyBoard[2][3]);

}

//Проверка нажатия кнопки «=»

if (KeyBoard[3][2] == 0)

{

//Проверка возможности выполнения арифметических действий

//над введенными числами

if (Op & Key)

{

//Формирование второго операнда

Number2 = FormingNumber ();

//Если была вызвана операция сложения

if (Op == 1)

{

//Сложение введенных чисел

Res = Number1 + Number2;

//Проверка на переполнение

if (Res > 99 999 999) Res = -1;

}

//Если была вызвана операция вычитания

if (Op == 2)

(Res>99 999 999)) Res = -1;

//Если была вызвана операция умножения

if (Op == 3)

{

//Умножение введенных чисел

Res = Number1 * Number2;

//Проверка переполнения

if (Res > 99 999 999) Res = -1;

}

//Если была вызвана операция деления

if (Op == 4)

{

//Проверка возможности выполнения операции деления

if (Number2 ≠ 0)

{

//Деление введенных чисел

Res = Number1 / Number2;

//Проверка переполнеия

if (Res > 99 999 999) Res = -1;

}

else Res = -1;

}

//Сброс операции

Op = 0;

//Сброс счетчика нажатых кнопок

Key = 0;

//Возведения признака кнопки «=»

Rav = 1;

//Возведение флага ввода первого операнда

EntNum1 = 1;

}

//Устранение эффекта дребезга контакта

while (!KeyBoard[3][2]);

}

//Проверка нажатия кнопки «C»

if (KeyBoard[3][3] == 0)

{

//Обнуление массива ввода

for (i=0; i<8; i++) EnterKey[i] = 0;

//Обнуление рабочих переменных

Number1 = 0;

Number2 = 0;

Res = 0;

//Сброс флага операции

Op = 0;

//Сброс флага кнопки «=»

Rav = 0;

//Возведение флага ввода первого операнда

EntNum1 = 1;

//Устранение эффекта дребезга контакта

while (!KeyBoard[3][3]);

}

}

//Процедура сканирования клавиатуры

void ScanKeyBoard ()

{

unsigned char MaskSt = 0×30; //Маска столбцов

unsigned char i, j; //Счетчики

unsigned char Rab; //Промежуточная переменная

P0 = P0 & 0xEF; //Подготовка Р0 к считыванию 1-ой строки клавиш

//Считывание состояния всех клавиш

for (i=0;i<4;i++) //Перебор столбцов

{

for (j=0;j<4;j++) //Перебор строк

{

//Сохранения значения в массив состояния клавиатуры

Rab = P0 >> j+1; //Перенос в бит CY значения считываемой кнопки

KeyBoard[i][j] = !CY;

}

P0 = P0 ^ MaskSt;//Подготовка Р0 для считывания следующей строки клавиш

MaskSt = MaskSt << 1; //Пересчет маски

}

}

//Процедура подготовки индицируемых значений

void Razlog (long Value)

{

char i; //Счетчик

//Проверка на ошибку или переполнение

if (Value ≠ -1)

{

//Разложение числа

for (i=7; i<0; i—)

{

//Выделение остактка от деления на 10

IndVal[i] = Value % 10;

//Пересчет значения

Value = Value / 10;

}

//Количество не нулевых значений равно 8

IndVal[8] = 8;

//Подсчет количества не нулевых значений

for (i=0; i<8; i++)

{

//Если появился не нулевой элемент прервать цикл

if (IndVal[i] ≠ 0) break;

//Уменьшение количества не нулевых значений

IndVal[8]—;

}

}

else

{

//Занесение в массив индикации значения Error

IndVal[7] = IndVal[5] = IndVal[4] = 12; //Буква r

IndVal[6] = 11; //Буква o

IndVal[3] = 10; //Буква E

}

}

//Процедура индикации

void Indication ()

{

//Вывод на 1-й индикатор

if (Ind == 1)

{

//Проверка количества не нулевых элементов

if (IndVal[8] > 7) P3 = Numb[ IndVal[0] ];

else P3 = 0;

//Разрешение индицирования

P1 = 0×01;

}

//Вывод на 2-й индикатор

if (Ind == 2)

{

//Проверка количества не нулевых элементов

if (IndVal[8] > 6) P3 = Numb[ IndVal[1] ];

else P3 = 0;

//Разрешение индицирования

P1 = P1 << 1;

}

//Вывод на 3-й индикатор

if (Ind == 3)

{

//Проверка количества не нулевых элементов

if (IndVal[8] > 5) P3 = Numb[ IndVal[2] ];

else P3 = 0;

//Разрешение индицирования

P1 = P1 << 1;

}

//Вывод на 4-й индикатор

if (Ind == 4)

{

//Проверка количества не нулевых элементов

if (IndVal[8] > 4) P3 = Numb[ IndVal[3] ];

else P3 = 0;

//Разрешение индицирования

P1 = P1 << 1;

}

//Вывод на 5-й индикатор

if (Ind == 5)

{

//Проверка количества не нулевых элементов

if (IndVal[8] > 3) P3 = Numb[ IndVal[4] ];

else P3 = 0;

//Разрешение индицирования

P1 = P1 << 1;

}

//Вывод на 6-й индикатор

if (Ind == 6)

{

//Проверка количества не нулевых элементов

if (IndVal[8] > 2) P3 = Numb[ IndVal[5] ];

else P3 = 0;

//Разрешение индицирования

P1 = P1 << 1;

}

//Вывод на 7-й индикатор

if (Ind == 7)

{

//Проверка количества не нулевых элементов

if (IndVal[8] > 1) P3 = Numb[ IndVal[6] ];

else P3 = 0;

//Разрешение индицирования

P1 = P1 << 1;

}

//Вывод на 8-й индикатор

if (Ind == 8)

{

//Вывод индицируемого значения

P3 = Numb[ IndVal[7] ];

//Разрешение индицирования

P1 = P1 << 1;

}

//Изменение счетчиков индикатора

if (Ind ≠ 8) Ind++;

else Ind = 1;

}

//Процедура обработки прерывания от таймера 0

void IntTimer0() interrupt 1

{

//Останов таймера 0

TR0 = 0;

//Перегрузка счетных регистров таймера 0

TH0 = Th0;

TL0 = Tl0;

//Заруск таймера 0 на счет

TR0 = 1;

//Организация выдержки интервала времени в 20млс

if (TimeKey ≠ 19) TimeKey++;

else

{

//Обнуление счетчика

TimeKey = 0;

//Вызов процедуры сканирования клавиатуры

ScanKeyBoard ();

}

//Организация выдержки интервала времени в 3млс

if (TimeInd ≠ 2) TimeInd++;

else

{

//Обнуление счетчика

TimeInd = 0;

//Подготавливаем к индикации первый операнд

if (EntNum1 & !Rav) Razlog (FormingNumber ());

//Подготавливаем к индикации второй операнд

if (!EntNum1 & (Op ≠ 0)) Razlog (FormingNumber ());

//Подготавливаем к индикации вычисленный результат

if (Rav) Razlog (Res);

//Вызов процедуры индикации

Indication ();

}

}

/*Инициализация устройств микроконтроллера*/

void Init ()

{

//Инициализация таймера 0

TMOD = 0×01;

//Инициализация счетных регистров таймера 0

TH0 = Th0;

TL0 = Tl0;

//Разрешение прерываний от таймера 0

IE = 0×82;

//Запуск таймера 0 на счет

TR0 = 1;

}

/*Точка входа в программу*/

void main (void)

{

//Вызов процедуры инициализации

Init ();

//Организация вечного цикла

while (1)

{

//Вызов процедуры чтения нажатых кнопок

ReadKey ();

}

}

Показати весь текст
Заповнити форму поточною роботою