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

  
Телефон +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
Мова: 
Українська
Оцінка: 

                 }

  INT $16
end;
{///////////////////////////////////////////////////////////////////////////
           Помiстити символ  [тa скан-код] в буфер клавiатури
            якщо буфер переповнений то процедура повертає 1, iнакше  0
////////////////////////////////////////////////////////////////////////////}
function put_key(key:byte;scan:byte):byte;assembler;
asm
  MOV AX,$0500    {Встановити номер функцii 05 та пiдфункцii 00            }
  MOV CH,SCAN     {Помiстити скан-код в CH                                 }
  MOV CL,KEY      {Помiстити ASCII код в CL                                }
  INT $16
end;
{///////////////////////////////////////////////////////////////////////////
                Процедура виводу статусу клавiатури
///////////////////////////////////////////////////////////////////////////}
procedure print_key_info;
begin
  write('Натиснена клавiша: ');
  if (status and $0F)<>0
    then
      begin
       if (status and RIGHT)<>0 then write('<RightShift>');
       if (status and LEFT )<>0 then write('<LeftShift>' );
       if (status and CTRL )<>0 then write('<Ctrl>'      );
       if (status and ALT  )<>0 then write('<Alt>');
      end;
{ надрукувати символ клавiши,  якщо вiн не керуючий                       }
  if key<>0 then
    begin
      writeln('  Cкан-код ', scan_code,' Hex: ',HexToStr(Scan_Code));
    end
    else
    begin
      writeln('  Розширений ACSII код ',scan_code*255,' Hex: ',
             HexToStr(Scan_Code),HexToStr(key));
    end;
end;
{//////////////////////////////////////////////////////////////////////////
  Пiдпрограма розшифровки скан коду
//////////////////////////////////////////////////////////////////////////}
procedure Convert_Scan_key_to_key;
begin
  key:=byte(Scan_Key and  $0FF);
  scan_code:=(scan_Key Shr 8) and $0FF;
end;
 
{//////////////////////////////////////////////////////////////////////////
  Пiдпрограма демонстрацii роботи з клавiатурою через BIOS
//////////////////////////////////////////////////////////////////////////}
procedure int16_demo;
var i:integer;
begin
  writeln('Використання функцiй BIOS intl6h.');
  writeln('Чекаємо   на    натиснення    клавiшi:');
  wait_key;
  status:=get_status;
  scan_Key:=get_key;
  Convert_Scan_key_to_key;
  print_key_info;
  writeln;
  writeln('Змiна швидкостi автоповороту та часу затримки:');
  writeln('Найбiльша швидкiсть та мiнiмальна затримка.');
  writeln('Утримуйте клавiшу до 50 автоповторiв:');
  set_rate_delay(0, 0);
  for i:=0 to 50 do
    begin
      scan_Key:=get_key;
      status:=get_status;
      Convert_Scan_key_to_key;
      print_key_info;
    end;
  writeln('Почистимо буфер клавiатури.');
  delay(500);
  Key_clear_buffer;
  Writeln('Найменьша  швидкiсть  та  максимальна затримка.');
  Writeln('Утримуйте клавiшу до 20 автоповторiв:  ');
  set_rate_delay($1F, 3);
  for i:=0 to 20 do
    begin
      scan_Key:=get_key;
      status:=get_status;
      Convert_Scan_key_to_key;
      print_key_info;
    end;
  writeln('Oчистимо буфер клавiатури');
  delay(1000);
  Key_clear_buffer;
  key_default;
  writeln('Помiстимо  символ "G"  в буфер клавiатури');
  i:=put_key(ord('G'),0);
  if i=0 then writeln('Буфер переповнений')
         else
           begin
             writeln('..  та  зчитаємо  його:');
             while keypressed do
               write(readkey);
           end;
end;
{//////////////////////////////////////////////////////////////////////////
                    Демострацiя     функцiї     MS      DOS
//////////////////////////////////////////////////////////////////////////}
function input_string:string;
var p:PAstring;
    len:byte;
    i  :byte;
    t:string;
begin
{  // // вiдвести пам'ять пiд рядок //}
  t:='';
  new(P);
  (P^)[0]:=254;
{ перший байт - max можлива довжина вводу  254}
  asm
    SUB BX,BX
    MOV DX,WORD PTR P
    MOV AX,WORD PTR P+2
    PUSH DS
    MOV DS,AX
    MOV AX,$0A00
    INT 21H
    POP DS
  end;
{ довжина реально введеного рядка                }
  len:=P^[1];
  for i:=0 to Len-1 do
    t:=t+char(p^[i+2]);
  dispose(P);
  input_string:=T;
end;
{//////////////////////////////////////////////////////////////////////////
                      Демонстрацiя  функцiй  DOS.
//////////////////////////////////////////////////////////////////////////}
procedure dos_func_demo;
var T:string;
begin
  writeln('Демонстрацiя функцiй DOS ');
  writeln('Введiть рядок (до 254 символiв). Завершення  -  ENTER:');
  t:=input_string;
  writeln('Bведений рядок:',T);
end;
{//////////////////////////////////////////////////////////////////////////
                      Демонстрацiя  функцiй  BP.
//////////////////////////////////////////////////////////////////////////}
procedure BP_func_demo;
begin
  writeln('Bикористання функцiй  BP');
  writeln('Чекаємо  на натиснення клавiшi:');
  Repeat until keypressed;
  key := ord(ReadKey);
  if key=0
    then Scan_Code:= ord(ReadKey)
    else Scan_Code:= 0;
  print_key_info;
end;
{/////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////}
procedure define_machine_type;
var Ibm_type:byte absolute $F000:$FFFE;
begin
  {визначити тип PC: XT/AT                                                }
  if  ibm_type = $FC
    then machine:=AT
    else Machine:=No_At;
end;
{//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////}
begin
  { визначити тип  PC XT/AT                                               }
  define_machine_type;
  { апаратно - залежнi функцiї працюють лише на АТ!                       }
  if machine=AT
    then
      begin
        writeln('Програмування контролера клавiатури...');
        port_io_demo;
     end;
  Machine:=No_AT;
  writeln('Демонстрацiя функцiй BIOS int 16 ');
  int16_demo;
  writeln('Демонстрацiя функцiй MS DOS');
  dos_func_demo;
  writeln('Демонстрацiя функцiй BP');
  BP_func_demo;
end.
Фото Капча