Проверка нажатия, удержания и отпускания клавиш - 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.
Листинг программы
  1. {$G+}
  2. uses crt;
  3. const
  4. periodArrayValue: array [1..12] of word =
  5. (262, 277, 294,
  6. 311, 330, 349,
  7. 370, 392, 415,
  8. 440, 466, 494);
  9. var
  10. periodValue: word;
  11. begin
  12. asm
  13. jmp @main_knp
  14. @main:
  15. xor ah,1
  16. int 16h
  17. JNZ @main
  18. JMP @sound_off
  19. @main_knp:
  20. xor ah,ah
  21. int 16h
  22. cmp ah,1
  23. je @off
  24. cmp ah,1ch
  25. je @sound_off
  26. cmp ah,10h
  27. je @q
  28. cmp ah,11h
  29. je @w
  30. cmp ah,12h
  31. je @e
  32. cmp ah,13h
  33. je @r
  34. cmp ah,14h
  35. je @t
  36. cmp ah,15h
  37. je @y
  38. cmp ah,2ch
  39. je @z
  40. cmp ah,2dh
  41. je @x
  42. cmp ah,2eh
  43. je @c
  44. cmp ah,2fh
  45. je @v
  46. cmp ah,30h
  47. je @b
  48. cmp ah,31h
  49. je @n
  50. jmp @main_knp
  51. @q:
  52. mov ax,periodArrayValue[1].word
  53. jmp @sound_on
  54. @w:
  55. mov ax,periodArrayValue[3].word
  56. jmp @sound_on
  57. @e:
  58. mov ax,periodArrayValue[5].word
  59. jmp @sound_on
  60. @r:
  61. mov ax,periodArrayValue[7].word
  62. jmp @sound_on
  63. @t:
  64. mov ax,periodArrayValue[9].word
  65. jmp @sound_on
  66. @y:
  67. mov ax,periodArrayValue[11].word
  68. jmp @sound_on
  69. @z:
  70. mov ax,periodArrayValue[2].word
  71. jmp @sound_on
  72. @x:
  73. mov ax,periodArrayValue[4].word
  74. jmp @sound_on
  75. @c:
  76. mov ax,periodArrayValue[6].word
  77. jmp @sound_on
  78. @v:
  79. mov ax,periodArrayValue[8].word
  80. jmp @sound_on
  81. @b:
  82. mov ax,periodArrayValue[10].word
  83. jmp @sound_on
  84. @n:
  85. mov ax,periodArrayValue[12].word
  86. jmp @sound_on
  87. @sound_on:
  88. mov periodValue,ax
  89. mov al,0b6h
  90. out 43h,al
  91. mov al,periodValue.byte
  92. out 42h,al
  93. mov al,periodValue.byte+1
  94. out 42h,al
  95. in al,61h
  96. or al,00000011b
  97. out 61h,al
  98. jmp @main
  99. @sound_off:
  100. in al,61h
  101. and al,11111100b
  102. out 61h,al
  103. jmp @main_knp
  104. @off:
  105. end;
  106. end.

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

textual
Листинг программы
  1.         jmp @KeyChk
  2. @Clear: xor ah,ah
  3.         int 16h
  4. @KeyChk:mov ah,1
  5.         int 16h
  6.         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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы