Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
7 / 7 / 1
Регистрация: 20.10.2009
Сообщений: 112

Опрос клавиатуры (несколько нажатых кнопок сразу)

28.10.2013, 18:13. Показов 2767. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите как лучше сделать опрос клавиатуры, чтобы можно было отслеживать несколько одновременно нажатых клавиш.

Пробовал по int 16h, пробовал по in al,60h
но работает не так как надо (или я что-то не так делаю)

Делаю что-то типа игры, надо одновременно и стрелки жать, и пробел при этом проверять.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.10.2013, 18:13
Ответы с готовыми решениями:

Отслеживание нажатых кнопок
Здравствуйте! Помогите пожалуйста разобраться : на форме есть несколько кнопок, как сделать, чтобы в поле выводилась информация о нажатой...

Запись нажатых кнопок!
Здрасте! Мне нужно записать в файл клавишу, которая нажимается и фокус на webBrowser - е. Т.е. записываем то, что введено на сайте....

Как посчитать общее количество нажатых кнопок на форме?
Как можно сосчитать общее количество нажатых кнопок на форме?

8
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
29.10.2013, 09:48
Скорей всего нужно вешать свой обработчик на int 9. Для клавиш, которые должны нажиматься одновременно, в программе завести отдельные переменные. При срабатывани int 9, если старший бит сканкода клавиатуры = 0, то соответствующая клавиша нажата - установить соответствующую переменную, а если старший бит сканкода клавиатуры = 1, то клавиша отжата - сбросить соответствующую переменную.

Добавлено через 6 минут
З.Ы. Или вместо int 9 использовать https://www.cyberforum.ru/asse... ost5252590
0
7 / 7 / 1
Регистрация: 20.10.2009
Сообщений: 112
19.11.2013, 18:31  [ТС]
А можно как-то по другому? Как-нибудь попроще?
у меня крутится основной цикл программы, там опрос кнопок
без обработчиков можно обойтись?
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
20.11.2013, 15:54
Чтобы чтение из 60h порта прокатывало, надо отрубить прерывания, а иначе обрабатывать нажатия будет системный обработчик. Правда, если планируется использование ввода с клавиатуры, то с отрубанием прерываний получится много гемора. Проще сделать обработчик, в общем
0
7 / 7 / 1
Регистрация: 20.10.2009
Сообщений: 112
20.11.2013, 15:56  [ТС]
Цитата Сообщение от sh2ezo Посмотреть сообщение
Чтобы чтение из 60h порта прокатывало, надо отрубить прерывания, а иначе обрабатывать нажатия будет системный обработчик. Правда, если планируется использование ввода с клавиатуры, то с отрубанием прерываний получится много гемора. Проще сделать обработчик, в общем
Пример можно посмотреть где-нибудь?
0
539 / 399 / 99
Регистрация: 18.08.2012
Сообщений: 1,024
20.11.2013, 16:38
Контроллер клавиатуры генерирует код последней из нажатых клавиш. Обработчик не имеет к этому никакого отношения. Если, например, сначала нажали клавишу [A], то начинает вырабатываться код 1Eh. Если затем, не отпуская эту клавишу, нажать, скажем [S], то контроллер прекратит вырабатывать код 1Eh и начнет вырабатывать код 1Fh.
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
20.11.2013, 21:03
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
;DOS, TASM, COM-файл
;tasm.exe /m filename.asm
;tlink.exe /t /x filename.obj
;
.model tiny
.code
.386
ORG 100h
START:
    xor ax,ax
    int 16h
    test al,al
    jnz short exit
 
    cmp ah,48h  ;48h - стрелка вверх
            ;50h - вниз
            ;4Bh - влево
            ;4Dh - вправо
    jnz short exit
 
    xor ax,ax
    int 16h
    cmp al,20h
    jnz short exit
 
    mov ah,9
    lea dx,str
    int 21h
 
    xor ax,ax
    int 16h
exit:
    ret ;выход из программы
 
str db 13,10,'Strelka$'
 
    end start
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
21.11.2013, 09:16
RimoBlack, вектор прерывания 9 перехвати, это не сложно.
Писал давно модуль для себя, сейчас перепечатаю, всё равно пылится бестолку.

Такой костылик для перехвата векторов:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
;
; [InterLIB.asm] - 1.0.0
;
 
VectorsPOINTS  Dd  160    Dup(0)
VectorsIN_USE  Db  160    Dup(0)
 
;     \                                  \
; 1.  /     Смена вектора прерывания     /
;     \                                  \
;        Di - номер вектора, который надо поменять
;        Bx - сегмент новой процедуры
;        Cx - смещение новой процедуры
;
 
ReplaceVECTOR  Proc Far
 Push es
 Push ax
 Push bx
 Push dx
 Push di
   Xor ax, ax
   Mov al, cs:VectorsIN_USE[di]
   Or al, al
   Jnz SkipREPLACE
  Mov ax, 1
  Mov cs:VectorsIN_USE[di], al
   CLI
  Xor ax, ax
  Mov es, ax
  Shl di, 2
  Mov dx, es:[di]
  Mov Word Ptr cs:VectorsPOINTS[di], dx
  Mov dx, es:[di+2]
  Mov Word Ptr cs:VectorsPOINTS[di+2], dx
  Mov es:[di], cx
  Mov es:[di+2], bx
   STI
 SkipREPLACE:
 Pop di
 Pop dx
 Pop bx
 Pop ax
 Pop es
Ret
ReplaceVECTOR  EndP
 
;     \                                  \
; 2.  /     Возврат старого вектора      /
;     \                                  \
;        Di - номер возвращаемого вектора
;
 
RecoverVECTOR  Proc Far
 Push es
 Push ax
 Push bx
 Push di
   Xor ax, ax
   Mov al, cs:VectorsIN_USE[di]
   Or al, al
   Jz SkipRecover
  Xor ax, ax
  Mov cs:VectorsIN_USE[di], al
   CLI
  Xor ax, ax
  Mov es, ax
  Shl di, 2
  Mov bx, Word Ptr cs:VectorsPOINTS[di]
  Mov es:[di], bx
  Mov bx, Word Ptr cs:VectorsPOINTS[di+2]
  Mov es:[di+2], bx
   STI
 SkipRecover:
 Pop di
 Pop bx
 Pop ax
 Pop es
Ret
RecoverVECTOR  EndP

Такой костылик для работы с клавиатурой:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
;
; [KeyLIB.Asm] - 1.0.0
;
 
KLAVISHI Db 128  Dup(0)
NowKEY   Db(0)
 
;     \                       \
; 1.  /     Инициализация     /
;     \                       \
 
;   Обработчик
Key_Handler   Proc Far
  Pushf
  Push ax
  Push bx
  Push es
  Push dx
  Push di
    Mov dx, 96
    In  al, dx
    Mov bl, al
    Shr al, 7
    And bx, 127
    Mov di, SEG KLAVISHI
    Mov es:[di+bx], al
  Pop di
  Pop dx
  Pop es
  Pop bx
    Mov al, 20h
    Out 20h, al
  Pop ax
  Popf
  Iret
Key_Handler   EndP
 
;   Иниц. программу обработки INT_9
KeyBoard_INIT   Proc Far
  Pusha
    Mov di, 9
    Mov bx, SEG Key_Handler
    Mov cx, OFFSET Key_Handler
    CALL ReplaceVECTOR
  Popa
  Ret
KeyBoard_INIT   EndP
 
;     \                        \
; 2.  /     Утилизация IRQ     /
;     \                        \
 
KeyBoard_CLOSE   Proc Far
  Push di
  Mov di, 9
    CALL RecoverVECTOR
  Pop di
  Ret
KeyBoard_CLOSE   EndP
 
 
;     \                                  \
; 3.  /     Проверка статуса клавиши     /
;     \                                  \
   ;  Входные данные  :  bx - Номер клавиши(скан кода) (0..127)
   ;  Выходные данные :  в переменной NowKEY статус кнопки
 
KeyStatus   Proc Far
  Push es
  Push di
  Push ax
    Mov di, SEG KLAVISHI
    Mov es, di
    Mov di, OFFSET KLAVISHI
    Mov al, Byte Ptr es:[di+bx]
    Mov NowKEY, al
  Pop ax
  Pop di
  Pop es
  Ret
KeyStatus   EndP

Юзать примерно так:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
.386
  ;  Стек
SSegMem SEGMENT STACK
   ReqMem   Dw 256  Dup(0)
SSegMem EndS
  ;  Данные
DtAREA SEGMENT
DtAREA EndS
  ;  Процедуры
PrAREA SEGMENT USE16
ASSUME CS:PrAREA, DS:DtAREA
   Include InterLIB.asm
   Include KeyLIB.asm
PrAREA EndS
  ;  Код
CsegAREA SEGMENT USE16
ASSUME CS:CsegAREA, DS:DtAREA, FS:PrAREA
 
     START:
   Push ds
   Push fs
   Push es
   Pushad
      ;  Моя паранойя на чистоту старт регистров
   Xor eax, eax
   Xor ebx, ebx
   Xor ecx, ecx
   Xor edx, edx
   Xor esi, esi
   Xor edi, edi
   Push cs
   Pop ds
   Mov ax, PrAREA
   Mov fs, ax
 
     ;  бла бла бла  иниты иниты иниты
 
   Call KeyBoard_INIT
   
   ReTryKbd:
 
     ;   бла бла бла [> цикл прожки <]
 
     Mov bx, 1     ;  ESCAPE
     Call KeyStatus
     Mov al, NowKEY
     Cmp al, 0
   Je ReTryKbd
 
   Call KeyBoard_CLOSE
 
TerminationPRG:
Popad
Pop es
Pop fs
Pop ds
Mov ah, 4Ch
Int 21h
 
CsegAREA EndS
     End START

Работоспособность не гарантирую, печатал руками без проверки, компиль MASM 5.1
которого у меня сейчас нету, проверил бы и отладил с радостью, но некогда, да и завязал
с DOS'ом...Правьте, отлаживайте, ежели чего - турбо дебаг в зубы и почесали...
0
7 / 7 / 1
Регистрация: 20.10.2009
Сообщений: 112
21.11.2013, 09:24  [ТС]
Всем спасибо за помощь, попробую с этим всем разобраться.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.11.2013, 09:24
Помогаю со студенческими работами здесь

PIC16С84/F84. Индикация логического произведения кода нажатых кнопок и 0Ch
Будьте так любезны помочь с задачей на ассемблере: Обеспечить выдачу на светодиоды инверсного значения логического произведения кода...

опрос 96 кнопок
Добрый день! Не могу определиться с реализацией задачи: Необходимо опрашивать 96 кнопок, которые рассредоточены по помещению. расстояние...

Опрос кнопок и индикация.
Помогите пожайлуста. Пишу на Си. Пытаюсь на порт (не важно какой) повесить кнопку и динамическую индикацию. Делаю так включаю порт на ввод,...

Опрос кнопок (PIC16F877)
Здравствуйте, недавно начал заниматься программированием платы PIC16F877. Написал программу по выбору одной из двух кнопок, одна - включает...

Периодический опрос кнопок на MCS-51
Если ДД1=1 и ДД2=1, то ДСИ=0 и ДСИ2=0, если ДД1=0 и ДД2=0, то ДСИ1=1, ДСИ2=1, если ДД1 ≠ДД2, то ДСИ1=1, ДСИ2=0;организовать периодический...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3, Box2D, FreeType и SDL3_ttf из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru