2 / 2 / 1
Регистрация: 20.10.2015
Сообщений: 244
1

Установить состояние регистров клавиатуры

24.05.2016, 15:31. Показов 1432. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Установить такое состояние регистров клавиатуры: NUM LOCK - выключен, CAPS LOCK - включен, SCROLL LOCK – выключен.
Есть код который выводит состояние этих кнопок, но не знаю как сделать что бы программа сама их включала выключала и выводила их состояние.
Так же буду благодарен за комментарии к коду
Код:
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
masm 
model small 
.STACK 100h
.DATA
mes1 db 'Num Lock on',0dh,0ah,'$'
mes2 db 'Caps Lock on',0dh,0ah,'$'
mes3 db 'Scroll Lock on',0dh,0ah,'$'
mes4 db 'Insert on',0dh,0ah,'$'
mes5 db 'All keys are off',0dh,0ah,'$'
.CODE
main PROC 
        mov ax, @DATA
        mov ds, ax
        xor ax, ax
        
        mov es, ax      
        mov cl, byte ptr es:[0417h]     
        shr cl, 04h
        cmp cl, 00h
        jnz m00
        lea dx, mes5
        mov ah, 09h
        int 21h
        jmp m07
m00:        shr cl, 01h
        jnc m01
        lea dx, mes3
        mov ah, 09h
        int 21h
m01:        shr cl, 01h
        jnc m02
        lea dx, mes1
        mov ah, 09h
        int 21h
m02:        shr cl, 01h
        jnc m03
        lea dx, mes2
        mov ah, 09h
        int 21h
m03:        cmp cl, 00h
        jz m07
        lea dx, mes4
        mov ah, 09h
        int 21h
m07:        mov ah, 07h
            int 21h     
exit:       mov ax, 4c00h 
        int 21h 
main ENDP 
END main
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.05.2016, 15:31
Ответы с готовыми решениями:

Изначальное состояние регистров
Доброго времени суток. Интересует следующий вопрос. Всегда ли в ДОСовском ассемблере регистры AX,...

FASM printf изменяет состояние регистров
Доброго времени суток ув форумчане, поиск юзал, нужного не нашел вот и прошу вас добрые люди...

Как посмотреть состояние регистров msc-51 название чего надо установить?
Составить программу на языке ассемблера для микроконтроллера семейства MCS-51 фирмы Intel,...

Вывод на экран двоичного содержимого двух регистров (ввести значения этих регистров требуется с клавиатуры)
требуется разработать программу вывода на экран двоичного содержимого двух регистров так, чтобы...

7
3405 / 1824 / 489
Регистрация: 28.02.2015
Сообщений: 3,697
24.05.2016, 17:58 2
Смотрите в сторону программирование портов клавиатуры.
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
24.05.2016, 18:56 3
Max00766, на http://www.cs.cmu.edu/afs/cs/u... rupt-list/ лежит inter61d.zip, а в нём PORTS.A, в котором, если поискать P0060006F, то можно найти описание команд клавы.
1
Модератор
Эксперт по электронике
8340 / 4234 / 1605
Регистрация: 01.02.2015
Сообщений: 13,186
Записей в блоге: 5
24.05.2016, 18:58 4
Проверить уже не могу, но смутные воспоминания, что достаточно изменить те же самые биты в 417h. Или была готовая функция bios int16h.
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
24.05.2016, 19:16 5
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
достаточно изменить те же самые биты в 417h. Или была готовая функция bios int16h.
Нет, иначе я бы этим обязательно воспользовался. Биты в 417h менять надо самому, чтобы они достоверно отражали состояние LED'ов клавы.
0
Эксперт Hardware
Эксперт Hardware
5512 / 2051 / 369
Регистрация: 29.07.2014
Сообщений: 2,945
Записей в блоге: 4
24.05.2016, 19:18 6
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Или была готовая функция bios int16h.
12h
1
Модератор
Эксперт по электронике
8340 / 4234 / 1605
Регистрация: 01.02.2015
Сообщений: 13,186
Записей в блоге: 5
24.05.2016, 21:00 7
Ну нет возможности проверить http://www.tdoc.ru/c/programmi... page8.html
Ощущение, что это из Жордейна:
Прерывание клавиатуры проверяет состояние статусных битов перед тем, как интерпретировать нажатые клавиши, поэтому когда программа меняет один из этих битов, то эффект такой же, как при физическом нажатии соответствующей клавиши. Вы можете захотеть установить состояние клавиш NumLock и CapsLock, чтобы быть уверенным, что ввод будет требуемого вида. Наоборот, Ваша программа может нуждаться в чтении статуса этих клавиш, например для того, чтобы вывести текущий статус на экран. Отметим, что клавиатура AT правильно устанавливает световые индикаторы состояния клавиш, даже если переключены программно.
Правда, я подозреваю, что для переключения ламп потребуется обращение к прерыванию клавиатуры.
1
Эксперт Hardware
Эксперт Hardware
5512 / 2051 / 369
Регистрация: 29.07.2014
Сообщений: 2,945
Записей в блоге: 4
24.05.2016, 21:15 8
Взято с assembler.ru:

В качестве примера работы с клавиатурой напрямую рассмотрим простую программу, выполняющую переключение светодиодов.
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
; mig.asm
; циклически переключает светодиоды клавиатуры
 
        .model     tiny
        .code
        org        100h                 ; СОМ-программа
start   proc       near
        mov        ah,2                 ; функция 02 прерывания 1Ah
        int        1Ah                  ; получить текущее время
        mov        ch,dh                ; сохранить текущую секунду в СН
        mov        cl,0100b             ; CL = состояние светодиодов клавиатуры
main_loop:
        call       change_LEDs          ; установить светодиоды в соответствии с CL
        shl        cl,1                 ; следующий светодиод,
        test       cl,1000b             ; если единица вышла в бит 3,
        jz         continue
        mov        cl,0001b             ; вернуть ее в бит 0,
continue:
        mov        ah,1                 ; проверить, не была ли нажата клавиша,
        int        16h
        jnz        exit_loop            ; если да - выйти из программы
        push       cx
        mov        ah,2                 ; функция 02 прерывания 1Ah
        int        1Ah                  ; получить текущее время
        pop        сх
        cmp        ch,dh                ; сравнить текущую секунду в DH с СН,
        mov        ch,dh                ; скопировать ее в любом случае,
        je         continue             ; если это была та же самая секунда - не
                                        ; переключать светодиоды,
        jmp        short main_loop      ; иначе - переключить светодиоды
exit_loop:
        mov        ah,0                 ; выход из цикла - была нажата клавиша,
        int        16h                  ; считать ее
        ret                             ; и завершить программу
start   endp
 
; процедура change_LEDs
; устанавливает состояние светодиодов клавиатуры в соответствии с числом в CL
change_LEDs        proc    near
        call       wait_KBin            ; ожидание возможности посылки команды
        mov        al,0EDh
        out        60h,al               ; команда клавиатуры EDh
        call       wait_KBin            ; ожидание возможности посылки команды
        mov        al,cl
        out        60h,al               ; новое состояние светодиодов
        ret
change_LEDs        endp
 
; процедура wait_KBin
; ожидание возможности ввода команды для клавиатуры
wait_KBin          proc    near
        in         al,64h               ; прочитать слово состояния
        test       al,0010b             ; бит 1 равен 1?
        jnz        wait_KBin            ; если нет - ждать,
        ret                             ; если да - выйти
wait_KBin          endp
        end        start
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2016, 21:15
Помогаю со студенческими работами здесь

Как изменится состояние регистров после выполнения PUSH AX и POP DX
Учусь на заочке и тут по архитектуре аппаратных средств прилетает практическая работа, а в ней...

Вычисление смещения дескрипторов по таблице состояние основных регистров процессора при выполнении задачи в Protect Mode
Начал изучать ассемблер, застрял на таком задании В приведенной ниже таблице показано состояние...

Установить состояние массива
Нужно понять - в данный момент есть ли что-то в массиве? делал так if massiv <> empty then но...

Программно установить Русскую раскладку клавиатуры (именно установить, не активировать)
Прошу помощи. Необходимо Программно установить Русскую раскладку клавиатуры в английскую версию...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru