Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
123455.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
106.5 Кб
Скачать

3. Опис та обгрунтування проектних рішень по проектуванню пристрою, системи.

Клавіатура має мікропроцесор intel, якому сприймає кожне натискання на клавішу і видає скан - код клавіші в порт А мікросхеми інтерфейсу 8255. Скан -код - це однобайтове число, молодші 7 біт якого представляють ідентифікаційний номер, присвоєний кожній клавіші. Старший біт коду говорить про те чи була натиснута клавіша дорівнює 1, або була звільнена, біт дорівнює 0. Коли скан - код видається у порт А, викликається переривання від клавіатури (INT 9). Процесор моментально припиняє свою роботу і виконує процедуру, що аналізує скан - код. При надходженні коду від клавіші зсуву або від перемикача зміни статусу записується в пам'ять. У всіх інших випадках скан - код трансформується в код символу за умови, що він подається при натисканні клавіші (в іншому випадку код відкидається). Процедура викликається процесором визначає установку клавіш зсуву, що б правильно виводити символ ("а" чи "А"). Потім введений код поміщається в буфер клавіатури, який є областю пам'яті, здатної запам'ятати до 15 символів, що вводяться, поки програма дуже зайнята, що б обробити їх. На рисунку 1 зображено шлях котрий проходить натискання на клавішу перед тим, як потрапити на в програму.

8048

Процесор клавіатури

8255

Інтерфейс з периферією

П ереривання клавіатури

(Запису в ПЗУ)

Буфер клавіатури

(системна пам'ять)

Переривання виводу на екран

Код програми

Відео буфер

Вивід на екран

Рисунок 1 - зображено шлях котрий проходить натискання на клавішу перед тим, як потрапити на в програму

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

Буфер клавіатури може накопичувати до 15 натискань на клавішу. Незалежно чи є код натиснутою клавіші одно байтові ASCII або багатобайтових розширеним кодом. Таким чином буфер клавіатури повинен відвести два байти в пам'яті для кожного натиснення на клавішу. Для однобайтових кодів перший байт містить код ASCII, а другий - скан код клавіші. Для розширених кодів перший байт містить ASCII 0, а другий номер розширеного коду. Цей код зазвичай збігається зі скан - кодом клавіші, але не завжди, оскільки деякі клавіші можна комбінувати з клавішами зсуву для генерації різних кодів.

Буфер влаштований, як циклічна черга, яку називають також буфером FIFO (перший увійшов - перший пішов). Він займає безперервну область адрес пам'яті. Однак певної комірки пам'яті, яка зберігає "початок рядка" в буфері, немає. Замість цього два покажчика зберігають позиції голови і хвоста рядки символів, що знаходиться в буфері зараз. Нові натиснення клавіш зберігаються в позиціях, наступних за хвостом (в більш старших адресах пам'яті), і відповідно оновлюється покажчик хвоста буфера. Після того як використано всі адресні пристрої для буфера, нові символи продовжують вставлятися, починаючи з самого початку буферної області; тому можливі ситуації, коли голова рядка в буфері має більшу адресу, ніж хвіст. Коли буфер заповнений, новими символами, що вводяться ігноруються, при цьому переривання клавіатури видає гудок через динамік. В той час коли показник на голову встановлений на первинний введений символ, вказівник на хвості встановлюється на позицію за останнім введеним символом. Коли обидва вказівники рівні, буфер пустий. Покажчики на голову і хвіст розташовані за адресами 0040:001 А і 0040:001 С відповідно. Хоча під покажчики відведено два байти, використовується тільки молодший байт. Значення покажчиків змінюються від 30 до 60, що відповідно позиціями в області даних BIOS. Для очищення буфера треба просто встановити значення комірки 0040:001 А дорівнює значенню комірки за адресою 0040:001 С.

Коли мікропроцесор клавіатури поміщає скан - код в порт A мікросхеми 8255 (адреса порту 60H), то при цьому викликається переривання 9. Завдання цього переривання - перетворити скан - код символу, ґрунтуючись на стані клавіш-перемикачів, і помістити його в буфер клавіатури. (Якщо скан - код відповідає клавіші-перемикачу, то в буфер клавіатури не пишеться нічого, за винятком випадку клавіші <Ins>, а замість цього переривання змінює байти статусу, розташовані в області даних BIOS). Переривання "введення з клавіатури" DOS і BIOS насправді всього лише переривання "введення з буфера клавіатури". Hа Насправді вони не розпізнають натискання клавіш. Точніше, вони читають інтерпретацію введених клавіш, яку забезпечило переривання 9.

 Потрібно дуже незвичайне застосування, щоб мало сенс перепрограмувати це переривання, особливо враховуючи, що MS DOS дозволяє Вам перепрограмувати яку клавішу клавіатури. В перериванні клавіатури можна виділити три основні кроки:

1. Прочитати скан - код і послати клавіатурі підтверджуючий сигнал.

2. Перетворити скан - код в номер коду або в установку регістра статусу клавіш-перемикачів.

3. Помістити код клавіші в буфер клавіатури.

У момент виклику переривання скан - код буде знаходитися в порту A. Тому спочатку треба цей код прочитати і зберегти на стеку. Потім використовується порт B (адрес 61H), щоб швидко послати сигнал підтвердження мікропроцесору клавіатури. Треба просто установить біт 7 в 1, а потім відразу змінити його назад в 0. Зауважимо, що біт 6 порту B управляє сигналом годин клавіатури. Він завжди повинен бути встановлений в 1, інакше клавіатура буде вимкнена. Ці адреси портів застосовні і до AT, хоча він і не має мікросхеми інтерфейсу з периферією 8255.

Після того як введений символ ідентифікований, процедура введення з клавіатури повинна знайти відповідний йому код ASCII або розширений код. Наведений приклад занадто короткий, щоб розглянути всі випадки. У загальному випадку скан-коди зіставляються елементів таблиці даних, яка аналізується інструкцією XLAT. XLAT приймає в AL число від 0 до 255, а повертає в AL 1-байтного значення з 256-байтной таблиці, на яку вказує DS: BX.

 Таблиця може перебувати в сегменті даних. Якщо в AL знаходився скан-код 30, то туди буде поміщений з таблиці байт номер 30 (31-й байт, так як відлік починається з нуля). Цей байт в таблиці повинен бути встановлений рівним 97 таблиця, до якої звернення буде відбуватися, якщо статус зсуву вуст, даючи код ASCII для "a". Kонечно для отримання заголовної A потрібна інша ановлен. Або заголовні букви можуть зберігатися в іншій частині тієї ж таблиці, але в цьому випадку до скан-коду треба буде додавати зсув, обумовлений статусом клавіш-перемикачів.

 Нарешті, номери кодів повинні бути поміщені в буфер клавіатури. Процедура повинна спочатку перевірити, чи є в буфері місце для наступного символу.

 Тільки монохромний адаптер не може виводити символи виду, заданого самим програмістом. Кольоровий адаптер підтримує 128 символів, який визначаються користувачем, PCjr - 256, а EGA-1024, з яких одночасно доступні 512. Для кольорового адаптера ROM-BIOS містить дані для розмальовування тільки перших 128 символів набору ASCII (з номерами від 0 до 127). Наступні 128 символів недоступні, поки їх не запрограмувати. Програміст сам може створити символ який він хоче бачити на екрані. Для кожного з адапторів символ має свої розміри. В даному випадку використовується символ розміром 16 байт, тобто кожен символ має розмір 8х16 пікселів, якщо біт дорівнює 1, значить цей піксель виводиться на екран, інакше немає. Так записується кожен символ перед тим як запрограмувати його.

На рисунку 2 зображено приклад букви "Ї", який використовується в цій програмі.

Х

Х

Х

Х

Х

Х

Х

Х

Х

Х

Х

Х

Х

Х

Х

Х

Х

Х

Х

Х

Х

Х


Рисунок 2 - зображено приклад букви "Ї", який використовується в цій програмі.