Портал освітньо-інформаційних послуг «Студентська консультація»

  
Телефон +3 8(066) 185-39-18
Телефон +3 8(093) 202-63-01
 (093) 202-63-01
 studscon@gmail.com
 facebook.com/studcons

<script>

  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){

  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),

  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)

  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

 

  ga('create', 'UA-53007750-1', 'auto');

  ga('send', 'pageview');

 

</script>

Дослідження будови та програмування клавіатури ІВМ РС AT

Тип роботи: 
Контрольна робота
К-сть сторінок: 
23
Мова: 
Українська
Оцінка: 

є портом для запису команд та даних та для читання стану клавіатури та введених кодів. Пред посиланням команди в клавіатуру BIOS тестує її статус (IN al, 64H) і переконується, що клавіші не натиснуті і внутрішній буфер не повний, тощо. Без такої перевірки є досить мала імовірність, що клавіатура не правильно сприйме код команди, тому перевірку можно пропустити 

Код видачі команди в клавіатуру буде тоді таким:
mov   al,cmd_code 
out   64H,al
Для команд, що складаються із двох байт  між посилками необхідна затримка на певний час 
mov   al,cmd_code 
out   64H,al
mov   cx,2000H  ;
delay: 
loop  delay
mov   al, data_value
 out   64H,al
 
Команди контролера клавіатури
0FFH скид клавіатури та старт внутришнього тесту 
OFEH Повторити останню передачу
OFDH-OF7H  NOP - немає операції
OF6H Скид клавіатури без самотесту та продовження сканування
OF5H Скид клавіатури без самотесту та заборона сканування
OF4H Дозвіл сканування. Клавіатура відповість спеціальним символом, що має назву 'ACK' скине внутрішній буфер та запустить сканування 
0F3H Встановити затримку автоповтору та затримку першого повтору символу. Спочатку посилається код 0F3H а потім байт даних, що вказують параметри:
 
біти 5-6 встановлюють затримку перед першим повтором:
00=250мс; 01=500мс; 10=750мс; 11=-1000мс 
Період автоповтору поданий в таблиці, де задані не всі значення, проте невказані значення можно знайти за допомогою інтерполяції
ЗначенняЧастота  автоповтору
00H30 
01H26.7 
02H24.0
04H20.0
08H15.0
0AH10.0
0DH9.2
10H7.5
14H5.0
1FH2.0
Клавіатура звичайно встановлюється на затримку в 1/2-секунди і повторює символи з швидкітью 10 символів в секунду. Звичайно це досить повільно. Число з кодом 01H встановлює затримку в 1/4- секунди   і швидкість повтору в 26 символів в секунду.
0F2H - 0EFH (NOP) 
0F2H - 0EFH  немає операції
0EEH Ехо діагностика. Клавіатура на код відповість кодом ЕЕН і продовжить роботу.
0EDH Включає/виключає світлодіоди на клавіатурі.
Спочатку посилається код 0EDH а потім байт:
 
Біти в позиціях 0-2 мають відповідати бітам 4 - 6 в змінній флагів клавіатури в області даних BIOS . Програміст сам має дотримуватись синхронізації стану клавітури, що визначений в флагах області даних BIOS, і роботою індикаторів, якщо він використовує ввід інформаціїї з клавіатури за допомогою DОS або BIOS.  Так якщо включається ввід інформації в верхньому регістрі за допомогою встановлення відповідного біта в області даних BIOS, то програміст має сам включити індикатор на клавіатурі.
Додаток 9. Демонстраційна програма для роботи з клавіатурою.
Program Kbd;
uses crt;
{ типи машин IBM PC XT/AT}
const
  NO_AT=0; AT=$10;
{ пopт клавiатури                           }
  KEYB_PORT=$60;
{ бiти ознак натиснених клавiш-модифiкаторiв}
  RIGHT=$01;
  LEFT =$02;
  CTRL =$04;
  ALT  =$08;
  Scrollock = $10;
  NumLock   = $20;
  CapsLock  = $40;
  InsertLock= $80;
  No_lites  = $8F;
  Is_lites  = $70;
{ бiт ZeroFlag В FlagsKegister мiкропроцесора}
  ZF =4;
{ змiннi для клавiшi, скан-коду та статусу клавiш-модифiкаторiв}
type TAstring=array[0..65] of byte;
     PAString=^TAstring;
var
   key:byte;
   scan_code:byte;
   scan_key:word;
   status :word;
   machine:byte;{// тип комп'ютера: XT/AT}
 
{////////////////////////////////////////////////////////////////////////////
                      Демонстрацiя прямого звернення до портiв
////////////////////////////////////////////////////////////////////////////}
function hextostr(Abyte:byte):string;
const XL:array[0..$0F] of char=
('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
begin
  hextostr:=XL[Abyte div 16]+XL[Abyte mod 16]
end;
procedure send_to_kbd(Abyte:byte);
begin
{ вивести байт в порт клавiатури }
  port[KEYB_PORT]:=Abyte;
{ затримка потрiбна через низьку швидкодiю 8042 }
   delay(10);
end;
{////////////////////////////////////////////////////////////////////////////
                  Cкид клавiатури та запуск внутрiшньої дiагностики
////////////////////////////////////////////////////////////////////////////}
procedure key_reset;
begin
 send_to_kbd($FF);
end;
{////////////////////////////////////////////////////////////////////////////
                 Встановити параметри клавiатури по замовчуванню
                          та продовжити сканування
////////////////////////////////////////////////////////////////////////////}
procedure key_default;
begin
  send_to_kbd($F6);
end;
{////////////////////////////////////////////////////////////////////////////
                    Заборонити сканування клавiатури
////////////////////////////////////////////////////////////////////////////}
procedure key_disable;
begin
  send_to_kbd($F5);
end;
{////////////////////////////////////////////////////////////////////////////
               Дозволити сканування та очистку внутрышнiй 6yфep
////////////////////////////////////////////////////////////////////////////}
procedure key_enable;
begin
  send_to_kbd($F4);
end;
{////////////////////////////////////////////////////////////////////////////
                       Включити/виключити iндикатори
////////////////////////////////////////////////////////////////////////////}
procedure  Key_Lights(Abyte:byte);
var  bios_key_flag:byte absolute $0:$417;
     Tmp:byte;
begin
{ Вiдправляемо команду про встановлення
Фото Капча