Проверка нажатия, удержания и отпускания клавиш - Assembler

Узнай цену своей работы

Формулировка задачи:

Добрый ночи! Сижу уже несколько часов туплю, не могу понять, почему часть кода с меткой @main не видит удерживаемую клавишу? Задача в том, что бы написать программу на подобие пианино. И при нажатии и удерживании клавиши должен издаваться звук. Звук издается перманентно, @main - тут должна проходить у меня проверка на зажатие клавиши, т.е. если клавиша зажата, то еще раз проверить, если клавиша не зажата, тогда отключить звук и ожидать нового нажатия в @main_knp. В данной версии кода зацикливается на @main, т.к почему-то флаг z стоит в 0 всегда. Если кто-нибудь подскажет как реализовать это, буду премного благодарен! P.S. Обдумывал вариант, что бы сравнивать scan-коды из порта 60h, но я пока не понимаю как именно это написать. P.P.S Звук на клавиши qwerty и zxcvbn, на клавишу enter отключить звук, esc выйти. P.P.P.S Эмулятор DosBox 0,74.
{$G+}
uses crt;
 
const
  periodArrayValue: array [1..12] of word =
 (262, 277, 294,
  311, 330, 349,
  370, 392, 415,
  440, 466, 494);
  
var
  periodValue: word;
 
begin
  asm
  jmp @main_knp
  @main:
           xor ah,1
           int 16h
           JNZ @main
           JMP @sound_off
         
  @main_knp:
         xor ah,ah
         int 16h
         cmp ah,1
         je @off
         cmp ah,1ch
         je @sound_off
         cmp ah,10h
         je @q
         cmp ah,11h
         je @w
         cmp ah,12h
         je @e
         cmp ah,13h
         je @r
         cmp ah,14h
         je @t
         cmp ah,15h
         je @y
         cmp ah,2ch
         je @z
         cmp ah,2dh
         je @x
         cmp ah,2eh
         je @c
         cmp ah,2fh
         je @v
         cmp ah,30h
         je @b
         cmp ah,31h
         je @n
         jmp @main_knp
 
    @q:
         mov ax,periodArrayValue[1].word
         jmp @sound_on
    @w:
         mov ax,periodArrayValue[3].word
         jmp @sound_on
    @e:
         mov ax,periodArrayValue[5].word
         jmp @sound_on
    @r:
         mov ax,periodArrayValue[7].word
         jmp @sound_on
    @t:
         mov ax,periodArrayValue[9].word
         jmp @sound_on
    @y:
         mov ax,periodArrayValue[11].word
         jmp @sound_on
    @z:
         mov ax,periodArrayValue[2].word
         jmp @sound_on
    @x:
         mov ax,periodArrayValue[4].word
         jmp @sound_on
    @c:
         mov ax,periodArrayValue[6].word
         jmp @sound_on
    @v:
         mov ax,periodArrayValue[8].word
         jmp @sound_on
    @b:
         mov ax,periodArrayValue[10].word
         jmp @sound_on
    @n:
         mov ax,periodArrayValue[12].word
         jmp @sound_on
         
    @sound_on:
        mov periodValue,ax
        mov al,0b6h
        out 43h,al
        mov al,periodValue.byte
        out 42h,al
        mov al,periodValue.byte+1
        out 42h,al
        in al,61h
        or al,00000011b
        out 61h,al
        jmp @main
     
     @sound_off:
        in al,61h
        and al,11111100b
        out 61h,al
        jmp @main_knp
     
     @off: 
    end;
end.

Решение задачи: «Проверка нажатия, удержания и отпускания клавиш»

textual
Листинг программы
        jmp @KeyChk
@Clear: xor ah,ah
        int 16h
@KeyChk:mov ah,1
        int 16h
        jnz @Clear

Объяснение кода листинга программы

  1. Переменная ah используется как регистр для хранения кода нажатой клавиши.
  2. Команда jmp @KeyChk переходит к метке KeyChk.
  3. Метка Clear используется для возврата значения регистра ah в начальное состояние.
  4. Команда xor ah,ah сбрасывает значение регистра ah в ноль.
  5. Команда int 16h вызывает прерывание, чтобы проверить нажатие клавиши.
  6. Метка KeyChk используется для проверки нажатой клавиши.
  7. Команда mov ah,1 устанавливает значение регистра ah равным 1.
  8. Команда int 16h вызывает прерывание для проверки нажатой клавиши.
  9. Команда jnz @Clear переходит к метке Clear, если нажата клавиша.
  10. Если клавиша не нажата, то программа продолжает работу с предыдущего места после команды int 16h.

Оцени полезность:

11   голосов , оценка 3.636 из 5
Похожие ответы