powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / ЗАдача с скан кодами
14 сообщений из 14, страница 1 из 1
ЗАдача с скан кодами
    #34208892
The_answer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может у ког ониб есть пример как вывести скан код клавиши на assemblere.А то горю с курсовым просто конкретно
...
Рейтинг: 0 / 0
ЗАдача с скан кодами
    #34209020
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_answerМожет у ког ониб есть пример как вывести скан код клавиши на assemblere.А то горю с курсовым просто конкретно

Резидент?
...
Рейтинг: 0 / 0
ЗАдача с скан кодами
    #34209043
The_answer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НУ просто я нажимаю любую клавишу, а на экране появляется ее скан-код. Наверное нужно использовать 21 прерывание , но как?
...
Рейтинг: 0 / 0
ЗАдача с скан кодами
    #34209077
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, наклепал, сложного ничего нет. Результат печатается в виде 16 разрядного числа. Младший байт соответствуют скан-коду клавиши, старший - расширенному скан-коду. Т.е., например

1C0D - соответствует клавише Enter (скан-код = 13 (0D)).

Однако, ряд клавиш, которым не назначены отображаемые символы (F1 ... F12, Home, End и т.п.) не имеют скан-кода и при нажатии в буфер засылается расширенный скан-код (обычный скан-код равен 0, => младший байт равен 0).

Код: plaintext
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.
	. 286 

code 	segment 'code'
	assume cs:code, ds:data
main	proc
	mov	ax, data
	mov	ds, ax

key_down_loop:
	mov	ah, 10h	
	int     16h		

	; Результат в ax
	cmp 	al,  27   	; Нажата клавиша ESC?
	je	exit		; Да, выходим

	; Преобразуем в текстовую форму
	mov	si, offset buff
	add	si,  3 
	call	hex2str
	
	; Выводим
	mov	ah, 09h
	mov	dx, offset buff
	int	21h		

	jmp	key_down_loop	; На ожидание нажатия
exit:
	mov	ax, 4c00h
	int	21h
main	endp

hex2str proc
	push	bx
	push	cx
	push	dx

	mov	bx, 0F000h
	mov	dx,  12 
	mov 	cx,  4 
convert_loop:
	push	ax
	push	cx
	and	ax, bx
	mov	cx, dx
	shr	ax, cl
	pop	cx
	push 	bx
	mov  	bx, offset tbl_hex
	xlat
	mov  	[si], al
	pop  	bx
	sub	dl,  4 	
	ror	bx,  4 
	inc	si
	pop	ax
	loop	convert_loop
	pop	dx
	pop	cx
	pop	bx
	ret
hex2str endp

code	ends

data 	segment
tbl_hex db '0123456789ABCDEF'
buff    db '-> '
	db  4  dup ('*')
	db  10 ,  13 , '$'
data	ends

	end main

P.S. Эх... Если б я так курсовые писал :)
...
Рейтинг: 0 / 0
ЗАдача с скан кодами
    #34211388
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_answerНУ просто я нажимаю любую клавишу, а на экране появляется ее скан-код. Наверное нужно использовать 21 прерывание , но как?21-ое? Ну разве что для вывода на экран.

Просто читай байт из 60h порта, приводи прочитаный байт в текстовый вид и выводи на экран.
...
Рейтинг: 0 / 0
ЗАдача с скан кодами
    #34211423
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl The_answerНУ просто я нажимаю любую клавишу, а на экране появляется ее скан-код. Наверное нужно использовать 21 прерывание , но как?21-ое? Ну разве что для вывода на экран.

Просто читай байт из 60h порта, приводи прочитаный байт в текстовый вид и выводи на экран.

int 21h - вызов DOS. Для вывода на экран имеется функция 09h и с работой клавиатуры (а тем более с выводом на экран) прерывание не имеет ничего общего. С помощью 21-го прерывания и соответствующей функции считывания скен-кода из буфера ввода, также можно легко решить эту задачу.

Чтение из порта - тоже вариант, однако имеет и недостаток и преимущество. Недостаток - более сложная организация программы. Необходим цикл, в котором нужно будет читать значение из порта и заботится о том, чтобы это значение не считать по новой при следующей итерации. Уж пускай BIOS об этом заботится. Преимущество - выше скорость.

Как правило, чтение из порта удобно применять в обработчике прерываний от клавиатуры (а прерывание, кстати, генерируется как при нажатии, так и при отпускании клавиши).
...
Рейтинг: 0 / 0
ЗАдача с скан кодами
    #34211467
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruslan.Isbarovint 21h - вызов DOS. Для вывода на экран имеется функция 09h и с работой клавиатуры (а тем более с выводом на экран) прерывание не имеет ничего общего. С помощью 21-го прерывания и соответствующей функции считывания скен-кода из буфера ввода, также можно легко решить эту задачу.ээээ... я не понял, ты с чем споришь? :)

Ruslan.IsbarovЧтение из порта - тоже вариант, однако имеет и недостаток и преимущество. Недостаток - более сложная организация программы. Необходим цикл, в котором нужно будет читать значение из порта и заботится о том, чтобы это значение не считать по новой при следующей итерации. Уж пускай BIOS об этом заботится. Преимущество - выше скорость. Ну не так уж это и сложно. А в плюсах, самый главный, полный контроль всех клавиш, а не только тех которые имеют ASCII эквивалент :)
...
Рейтинг: 0 / 0
ЗАдача с скан кодами
    #34211476
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl21-ое? Ну разве что для вывода на экран.

Вот с этим и спорю. легко решить эту же задачу с помощью 21-го прерывания.

White OwlА в плюсах, самый главный, полный контроль всех клавиш, а не только тех которые имеют ASCII эквивалент

Не читаешь предыдущие посты. Про клавиши, не имеющие ASCII эквивалента я писал выше.
...
Рейтинг: 0 / 0
ЗАдача с скан кодами
    #34211500
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruslan.Isbarov White Owl21-ое? Ну разве что для вывода на экран.
Вот с этим и спорю. легко решить эту же задачу с помощью 21-го прерывания.Легко, но только в области ASCII клавиш. Большинство расширеных оно уже не возмет.

Ruslan.Isbarov White OwlА в плюсах, самый главный, полный контроль всех клавиш, а не только тех которые имеют ASCII эквивалент
Не читаешь предыдущие посты. Про клавиши, не имеющие ASCII эквивалента я писал выше.Это про Int 16h? Неее... оно как раз расширеные клавиши отбрасывает на старых БИОСах и показывает на новых. А работа со смещенными-расширеными вообще зависит от версии БИОСа. В общем использовать это можно на одной машине и нельзя на другой. Из порта читать проще - там идут унифицированые данные напрямую с клавиатуры.
...
Рейтинг: 0 / 0
ЗАдача с скан кодами
    #34211509
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlоно как раз расширеные клавиши отбрасывает на старых БИОСах и показывает на новых

На старых - это каких? Есть пример времен 80286. Работает
...
Рейтинг: 0 / 0
ЗАдача с скан кодами
    #34211518
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p.s. точнее работал в те времена
...
Рейтинг: 0 / 0
ЗАдача с скан кодами
    #34211546
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ладно, не будем спорить, думаю имеют место оба способа. Пускай автор выбирает на свое усмотрение.
...
Рейтинг: 0 / 0
ЗАдача с скан кодами
    #34211679
The_answer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, выручили офигено, спасибо огромное. Просто взял выше приведенный пример.
...
Рейтинг: 0 / 0
ЗАдача с скан кодами
    #34211739
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruslan.Isbarov White Owlоно как раз расширеные клавиши отбрасывает на старых БИОСах и показывает на новыхНа старых - это каких? Есть пример времен 80286. Работаетээээ.... хм.... Да, действительно... Чувствую себя недовымершим динозавром :) Тех компов на которых приведеный пример не заработает уже пожалуй и не осталось. Впрочем, в институтах еще возможно есть где-нибудь первые XT-шки :)
С другой стороны, на современном компе уже никто кроме студентов на ассемблере и не пишет а работать с портами для них все равно полезней чем учить прерывания BIOS'а. Порты и на других платформах есть, а биосы там собственные.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / ЗАдача с скан кодами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]