0195c - Diody LED na klawiaturze PC

Często trzeba urozmaicić wizualnie swój program. Niestety trudno jest wpaść na dobry pomysł. Rysowanie w Pascalu kółeczek, kwadracików i linii w grafice BGI lub układanie muzyczek z wykorzystaniem instrukcji Sound stało się już nieciekawe.

Większość użytkowników PC-ta zapomina, że na ich klawiaturze (chodzi tu o klawiaturę 101- lub 102-klawiszową) znajdują się diody opisane jako Num Lock, Caps Lock i Scroll Lock; czasami występuje też dioda nazwana On Line, ale ona - z punktu widzenia programisty - nie jest interesująca. Za zapalenie lub zgaszenie diody odpowiada rozkaz EDh.Bajt, który definiuje stan diod i jest przesyłany przez port (adres) 60h. Gdy zna się ten adres, pozostaje tylko wysyłanie do niego bajtów o odpowiednich wartościach :

  • 00h - zgaszenie wszystkich diod
  • 01h - zapalenie diody Scroll Lock
  • 02h - zapalenie diody Num Lock
  • 03h - zapalenie diod Num Lock i Scroll Lock
  • 04h - zapalenie diody Caps Lock
  • 05h - zapalenie diod Caps Lock i Scroll Lock
  • 06h - zapalenie diod Num Lock i Caps Lock
  • 07h - zapalenie wszystkich diod

Uwaga, w tym programie wartości podawane są dziesiętnie (bez litery h).

Wydaje mi się, że wykorzystanie tej ciekawej możliwości obsługi klawiatury PC będzie już proste. Przy okazji informuję zainteresowanych, że podobnie można obsłużyc diody dysku twardego i stacji dysków. Zapewniam przy okazji, że pokazanie takiego "efektu" znajomym wywoła u nich zachwyt.

Zainteresowanych "grzebaniem" w Assemblerze i nie tylko proszę o kontakt i zachęcam do współpracy.

 {**************************************}
 {********Autor:Paweł Zakrzewski********}
 {**************Wałbrzych***************}

 program diody;
 uses crt;
 var x,ilosc,wartosc : byte;

 procedure LED;
 begin
   asm
     mov al,0edh
     out 60h,al
     in al,64h
     mov al,x
   end;
 end;
 
 procedure wpisz;
 begin
   asm
     mov al,wartosc
     out 60h,al
   end;
   delay(200);
 end;

 begin
   ilosc := 0;
   repeat
     ilosc := ilosc + 1;
     led;
     wartosc := 02;
     wpisz;
     wartosc := 04;
     led;
     wpisz;
     led;
     wartosc := 01;
     wpisz;
     wartosc := 00;
     led;
     wpisz;
   until ilosc = 200;
 end.

Paweł Zakrzewski 
PC Kurier, Styczeń 1995