ЗНАЕТЕ ЛИ ВЫ?

Програмування контролера 8048 блоку клавіатури.



Все, що було сказане з приводу програмування контролера 8048 системного блоку відноситься і до контролеру блоку клавіатури. Псевдокоманди контролера передаються по ланцюжку: вхідний буфер 8042 системного блоку (порт 60h), передача внутрішнім ПЗ в вихідний порт Р2, передача по інтерфейсу, введення через вхід T1 в 8048 блок клавіатури, розшифровка внутрішнім ПЗ і виконання.

Нижче приводиться перелік команд контролера 8048 блоку клавіатури. Всі команди як однобайтні, так і двохбайтні, передаються тільки через 60h порт і пересилаються контролером 8042 системного блоку по зазначеному вище ланцюжку як нерозпізнані байти даних власних команд.

Перед посилкою кожного байта команди необхідна перевірка на 0 першого біта порта 64h.

В одно- і двохбайтних командах контролер клавіатури після отримання і розшифровки кожного байта вертає в 60h порт код підтвердження FAh.

EDh - керування світлодіодами клавіатури. Для ввімкнення або вимикання світлодіодів після коду команди (EDh) через 60h порт посилається байт даних, біти якого мають наступне призначення:

0: 1 - включити ScrollLock;

1: 1 - включити NumLock;

2: 1 - включити CapsLock;

3-7: - не використовуються.

EEh - луна (для діагностики). Просто вертає ЕЕh;

EFh - холоста команда, вертається код FEh;

F0h - альтернативний режим, наступний байт даних задає режим роботи клавіатури (1, 2 або 3). Якщо послати нульовий байт даних, то вертається поточний режим;

F1h - холоста команда;

F2h - ідентифікатор розширеної клавіатури (вертає FAh і 2 байта ідентифікатора 83АВh розширеної клавіатури іі використовується POST для настройки системи);

F3h - задати затримку і швидкість введення символів. Спочатку клавіатура починає повторювати натиснути клавішу через 0.5 сек. зі швидкістю 10 повторень в секунду. Для зміни цих параметрів, посилається байт даних, біти якого мають наступне призначення:

0-4: кількість повторень в секунду;

5-6: початкова затримка до генерації автоповтора в мсек: 00=250, 01=500, 10=750, 11=1000;

7: повинен бути рівний 0.

F4h - скинути буфер клавіатури і почати сканування;

F5h - привести клавіатуру в початковий стан і заборонити сканування;

F6h - привести клавіатуру в початковий стан і продовжити сканування;

F7h, F8h, F9h, FAh - встановити всі клавіші. Використовуються тільки в режимі три і задають режими роботи всіх клавіш:

F7h - тільки автоповтор;

F8h - натискання/відпускання;

F9h - тільки натискання;

FAh - автоповтор/натискання/відпускання.

FBh, FCh, FDh - встановити окремі клавіші. Команди двохбайтні, байт даних - скан-коди клавіші, якій передвизначена команда. Використовуються тільки в режимі три і задають режими:

FBh - тільки автоповтор;

FCh - натискання/відпускання;

FDh - тільки натискання;

FEh - повторити останню передачу;

FFh - скидання клавіатури і запуск внутрішнього тесту.

 

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

Буфер клавіатури є класичним прикладом кільцевого буферу. Щоправда, назви часом обманливі, і в дійсності він зовсім не зігнутий в кільце і знаходиться не в клавіатурі, а в ОЗП на системній платі. Свою назву кільцевий буфер отримав через засіб реалізації. Буфер клавіатури складається з 32 послідовно (тобто лінійно, а не по кільцю) розташованих байтів, що знаходяться в області даних BIOS. Цей буфер зарезервований програмами BIOS INT 09h і INT 16h в якості зв’язую чого ланок для зберігання і передачі даних клавіатури. INT 09h одержує дані від клавіатури і запам’ятовує їх в буфері і передає їхній прикладній програмі або INT 16h. Оскільки буфер клавіатури є кільцевим буфером, те поточне положення "голови" і "кінця" постійно змінюється.

Буфер клавіатури розміщений по адресам 0040: 001Eh - 0040: 003Ch оперативної пам'яті і дозволяє накопичувати дані (ASCII і скан-коди) про 15 натискань клавіш (на місці, передуючому початку рядку символів в буфері зберігаються ASCII код повернення каретки (ASCII 13) і скан-код клавіші "Enter").

В осередку 0040: 001Ah (покажчик початку) зберігається адреса першого введеного символу, а в осередку 0040: 001Ch (покажчик кінця) - адреса першого вільного осередку після останнього введеного символу. Адреси зберігаються в вигляді байта зміщення (другий байт осередку не використовується). Якщо буфер пустий, то вміст покажчика початку співпадає з вмістом покажчика кінця.

Запис в буфер здійснюється за адресою покажчика кінця, при цьому вміст покажчика збільшується на 2. Читання з буферу виконується за адресою покажчика початку, при цьому вміст покажчика також збільшується на 2 (якщо покажчик містить адресу останнього осередку буферу - 3Ch, то замість збільшення на 2 в нього необхідно записати адресу початку буферу - 1Eh). Коли "кінець" досягне кінця буферу (крайнього верхнього осередку, рис. 6.3 - 0040: 003Ch) то він перейде на початок буферу в нижній частині (рис. 5-0040: 001Еh). Цей перенос (циркуляція) і породив термін "кільцевий буфер". В останній осередок дані не будуть занесені. Замість цього роздасться сигнал з динаміка, що вказує на переповнення буферу клавіатури. Це відбудеться тому, що покажчик "кінця" обмине буфер по колу і досягне логічної "голови" буферу.

 

Рис.6.3 – Буфер клавіатури

 

Якщо INT 09h заповнить цей осередок, то "кінець" зсунеться вперед і займе ту ж позицію, що і "голова". Однак треба пам'ятати, що якщо покажчик "голови" рівний покажчику "кінця", то вважається, що буфер пустий, тому останній осередок ніколи не заповнюється.

Таким чином, в буфері клавіатури обсягом 16 слів може зберігатися не більш 15 кодів натиснутих клавіш. Очевидно, що можна перевірити, чи було введення з клавіатури. Треба просто порівняти покажчики "голови" і "кінця" (тобто вміст осередків пам'яті 0040: 001Ah і 0040: 001Ch).

 





Последнее изменение этой страницы: 2016-06-23; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.237.66.86 (0.009 с.)