Вход

Просмотр полной версии : Вопрос по опросу клавиатуры!



Voxel
18.07.2010, 19:29
Может я чего не догоняю...

Пишу такой кусок:

key1 ld a,#FB
in a,(#FE)
rrca
jr c,key1
call куда-то
jr key1

Опрашиваю клавишу Q. Но вот беда, как только я ее (клавишу) нажму то вызов процедуры call куда-то будет происходить не один раз а ... ну хрен знает сколько. В итоге потом все будет нормально, опрос будет ждать нажатия клавиши.

Вопрос в том почему как будто бы происходит залепание клавиши??????

Асемблер у мну sjasmplus-win32-1.07-rc7. Запуская в эмуле Unreal.

null_device
18.07.2010, 19:36
Обычно нужна задержка. Допустим, так - ожидание нажатия => ожидание отпускания => вызов процедуры. Либо аппаратная задержка, по halt или срабатыванию счетчика.

Лас
18.07.2010, 19:54
Обычно нужна задержка. Допустим, так - ожидание нажатия => ожидание отпускания => вызов процедуры.
Перед вызовом процедуры, после отпускания клавиши, неплохо бы еще антидребезговую задержку вставить, извиняюсь.
Если есть возможность, лучше использовать пзушный опрос клавиатуры, для увеличения совместимости со всякими клонами, контроллерами.

Eugen
18.07.2010, 20:02
key1 ld a,#FB
in a,(#FE)
rrca
jr c,key1
call куда-то
key2 ld a,#FB
in a,(#FE)
rrca
jr c,key2
jr key1

сорри , флаги попутал. отредактировал

Voxel
18.07.2010, 21:01
Спасибо. Помогло)))

psb
18.07.2010, 22:20
key1 ld a,#FB
in a,(#FE)
rrca
jr c,key1
call куда-то
key2 ld a,#FB
in a,(#FE)
rrca
jr c,key2
jr key1

сорри , флаги попутал. отредактировал
то ли лыжи не едут, то ли я...
как так отредактировал, если не правильно? должно быть nc в посл. случае.

Eugen
19.07.2010, 02:17
почему? пока клавишу неотпустили , мы в цикле key2

Voxel
19.07.2010, 02:21
почему? пока клавишу неотпустили , мы в цикле key2

Psb верно говорит... в этой строке jr c,key2 должно быть так jr nc,key2...

потому как мы этим циклом продолжаем опрос клавиши, НО она то залипла!!! по сему нужно болтаться в цикле пока не отлипнет...

Лас
19.07.2010, 02:25
Цирк

Eugen
19.07.2010, 02:33
согласен. в первом варианте у меня так и было:v2_blush: а потом у меня головушка бо-ьо, устала уже. сомнения одолели, исправил:v2_conf2:

---------- Post added at 01:33 ---------- Previous post was at 01:28 ----------


после отпускания клавиши, неплохо бы еще антидребезговую задержку вставить
цирк это?

psb
19.07.2010, 10:30
задержку и правда надо от дребезга. да и в таких циклах полезно хальт ставить по возможности.

Eugen
19.07.2010, 12:26
таких циклах полезно хальт ставить
спорный вопрос. во1 оно четко и так работает, во 2 есть детская игра, типа кто больше нажиманий кнопки сделает, так вот шансы попасть в хальт очень увеличиваются и результат нажатий уже будет ложный

psb
19.07.2010, 12:41
ничего спорного. хальт - обеспечивает тебе как бы антидребезг. у меня была клавиатура, которая дребезжала просто одуренно, и вот я видел такие программы, где нажимаешь кнопку 1 раз, а печатается 10-15 букаф... так что чётко чечётко...

плюс ваитовые контроллеры клав не особо поощряют частый их опрос.

Eugen
19.07.2010, 12:47
у меня была клавиатура, которая дребезжала просто одуренно
это единичный случай, просто не понятно одно - как на этой клаве другие программы работали?:v2_eek:

psb
19.07.2010, 15:23
другие - легко! через 20 мс все уже стихало:) почти;) бейсик и прочие zx-word'ы работали замечательно. грамотный опрос решит все проблемы, а неграмотно полагать, что это единичный случай.....

key-jee
21.07.2010, 05:18
есть детская игра, типа кто больше нажиманий кнопки сделает, так вот шансы попасть в хальт очень увеличиваются и результат нажатий уже будет ложный

Что-то я сомневаюсь, что кто-то нажимает кнопки с частотой быстрее, чем 50 раз в секунду :biggrin:

И да, psb прав в том, что "в таких циклах полезно хальт ставить"

GriV
21.07.2010, 22:35
Опрос клавиатуры обычно делается на прерываниях, поэтому получается тот самый halt между опросом. Пользуйтесь возможностью ПЗУ и используйте стандартные scan-коды, генерируемые ПЗУ. Если нет возможности делать прерывание/ждать его/использовать ПЗУ - то воспользуйтесь способом, указанным выше (т.е. ожидайте отжатия кнопки). Если же нет возможности ждать отпускания (например - если надо опрашивать много кнопок) - делайте программную паузу счётчиком типа:
ld bc,<pause>
dec bc
ld a,b
or c
jr nz,$-3

Voxel
22.07.2010, 14:54
Чтоб не плодить темы спрошу тут еще кое что....

Как значение в аккумуляторе разделить на 2 или 4 или 8 ??? не прибегая к процедуре деления типо этой:


DIV LD B,16
LD HL,0
LD A,H
DV1 RL E
RL D
RLA
SUB C
JR NC,DV2
ADD A,C
DV2 CCF
RL L
RL H
DJNZ DV1
RET

Sinus
22.07.2010, 15:00
на 2:


and a
rra


на 4:


and a
rra
and a
rra


на 8:


rrca
rrca
rrca
and %00011111

Voxel
22.07.2010, 15:09
Огромедное спасибо) С 99 не брался за асм... ух и тяжко)))

---------- Post added at 15:09 ---------- Previous post was at 15:03 ----------

А за одно можно код генератора случайных чисел с возможностью задания пределов???

Sinus
22.07.2010, 15:35
я использую такой рандомизатор:



rnd: ld a,(rnd_data_e - 1)
ld hl,rnd_data

dup rnd_data_e - rnd_data - 1
add a,(hl)
ld (hl),a
inc hl
edup

add a,(hl)
ld (hl),a
ret

rnd_data: db "HBF^db"
rnd_data_e:


от длины и "рандомности" строки в rnd_data зависит рандомность генератора.
чем длинее строка - тем рандомнее числа, но тем медленней работает.
4-8 символов обычно хватает для любых случаев.

чтоб в заданных пределах, то это уже сложней.
если надо от N до N+(2^x)-1, то можно так:

например если надо от 30 до 61, то пойдёт такой метод:

and 31
add a,30

если в совсем любых пределах, то без умножения не получится.

savelij
22.07.2010, 15:45
на 2:


and a
rra


на 4:


and a
rra
and a
rra


на 8:


rrca
rrca
rrca
and %00011111


Может я в асме ничо не соображаю, но вроде команду SRL никто в проце не отменял

SRL A ;делим на 2
SRL A ;на 4
SRL A ;на 8

Sinus
22.07.2010, 16:09
Может я в асме ничо не соображаю, но вроде команду SRL никто в проце не отменял

SRL A ;делим на 2
SRL A ;на 4
SRL A ;на 8

хороший вопрос.
дело в том, что разницы никакой (только srl флаг C не трогает):

and a: rra - 2 байта, 8 тактов
srl a - 2 байта, 8 тактов

более того:

srl a: srl a: srl a - 6 байт, 24 такта
rrca: rrca: rrca: and %00011111 - 5 байт, 19 тактов

psb
22.07.2010, 20:50
надо делить на 4 так: rrca:rrca:and %00111111 - 4 байта, 11 тактов при безваите

Sinus
22.07.2010, 21:22
rrca:rrca:and %00111111 - таки 15 тактов, а не 11
(хотя всё равно выгоднее чем "srl a:srl a" или "and a:rra:and a:rra" - и то и другое по 16 тактов).

psb
22.07.2010, 21:42
АААААА! вот это меня плющит:)))))
первоначально хотел написать 7 тактов:)))
и ведь точно знаю, и считал ведь именно так: 4+4+7, но получилось 11... :)))))

ace210
23.07.2010, 10:12
;A=range - число будет в границах от 0 до range-1
Random
push af
call rand_
pop af
ld c,a
ld b,0
ex de,hl
call mod
ld a,l
ret

rand_
LD D,0
LD BC,(rnd)
LD H,C
LD L,#FD
LD A,B
OR A
SBC HL,BC
SBC A,D
SBC HL,BC
SBC A,D
LD E,A
SBC HL,DE
JR NC,r1
INC HL
r1 LD (rnd),HL
RET
rnd DW 0

mod LD A,16
LD HL,0
m0 RL E
RL D
RL L
RL H
SBC HL,BC
JR NC,m1
ADD HL,BC
m1 CCF
DEC A
JR NZ,m0
RET