Просмотр полной версии : Вопрос по опросу клавиатуры!
Может я чего не догоняю...
Пишу такой кусок:
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 или срабатыванию счетчика.
Обычно нужна задержка. Допустим, так - ожидание нажатия => ожидание отпускания => вызов процедуры.
Перед вызовом процедуры, после отпускания клавиши, неплохо бы еще антидребезговую задержку вставить, извиняюсь.
Если есть возможность, лучше использовать пзушный опрос клавиатуры, для увеличения совместимости со всякими клонами, контроллерами.
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
сорри , флаги попутал. отредактировал
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 в посл. случае.
почему? пока клавишу неотпустили , мы в цикле key2
почему? пока клавишу неотпустили , мы в цикле key2
Psb верно говорит... в этой строке jr c,key2 должно быть так jr nc,key2...
потому как мы этим циклом продолжаем опрос клавиши, НО она то залипла!!! по сему нужно болтаться в цикле пока не отлипнет...
согласен. в первом варианте у меня так и было:v2_blush: а потом у меня головушка бо-ьо, устала уже. сомнения одолели, исправил:v2_conf2:
---------- Post added at 01:33 ---------- Previous post was at 01:28 ----------
после отпускания клавиши, неплохо бы еще антидребезговую задержку вставить
цирк это?
задержку и правда надо от дребезга. да и в таких циклах полезно хальт ставить по возможности.
таких циклах полезно хальт ставить
спорный вопрос. во1 оно четко и так работает, во 2 есть детская игра, типа кто больше нажиманий кнопки сделает, так вот шансы попасть в хальт очень увеличиваются и результат нажатий уже будет ложный
ничего спорного. хальт - обеспечивает тебе как бы антидребезг. у меня была клавиатура, которая дребезжала просто одуренно, и вот я видел такие программы, где нажимаешь кнопку 1 раз, а печатается 10-15 букаф... так что чётко чечётко...
плюс ваитовые контроллеры клав не особо поощряют частый их опрос.
у меня была клавиатура, которая дребезжала просто одуренно
это единичный случай, просто не понятно одно - как на этой клаве другие программы работали?:v2_eek:
другие - легко! через 20 мс все уже стихало:) почти;) бейсик и прочие zx-word'ы работали замечательно. грамотный опрос решит все проблемы, а неграмотно полагать, что это единичный случай.....
есть детская игра, типа кто больше нажиманий кнопки сделает, так вот шансы попасть в хальт очень увеличиваются и результат нажатий уже будет ложный
Что-то я сомневаюсь, что кто-то нажимает кнопки с частотой быстрее, чем 50 раз в секунду :biggrin:
И да, psb прав в том, что "в таких циклах полезно хальт ставить"
Опрос клавиатуры обычно делается на прерываниях, поэтому получается тот самый halt между опросом. Пользуйтесь возможностью ПЗУ и используйте стандартные scan-коды, генерируемые ПЗУ. Если нет возможности делать прерывание/ждать его/использовать ПЗУ - то воспользуйтесь способом, указанным выше (т.е. ожидайте отжатия кнопки). Если же нет возможности ждать отпускания (например - если надо опрашивать много кнопок) - делайте программную паузу счётчиком типа:
ld bc,<pause>
dec bc
ld a,b
or c
jr nz,$-3
Чтоб не плодить темы спрошу тут еще кое что....
Как значение в аккумуляторе разделить на 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
на 2:
and a
rra
на 4:
and a
rra
and a
rra
на 8:
rrca
rrca
rrca
and %00011111
Огромедное спасибо) С 99 не брался за асм... ух и тяжко)))
---------- Post added at 15:09 ---------- Previous post was at 15:03 ----------
А за одно можно код генератора случайных чисел с возможностью задания пределов???
я использую такой рандомизатор:
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
если в совсем любых пределах, то без умножения не получится.
на 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
Может я в асме ничо не соображаю, но вроде команду 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 тактов
надо делить на 4 так: rrca:rrca:and %00111111 - 4 байта, 11 тактов при безваите
rrca:rrca:and %00111111 - таки 15 тактов, а не 11
(хотя всё равно выгоднее чем "srl a:srl a" или "and a:rra:and a:rra" - и то и другое по 16 тактов).
АААААА! вот это меня плющит:)))))
первоначально хотел написать 7 тактов:)))
и ведь точно знаю, и считал ведь именно так: 4+4+7, но получилось 11... :)))))
;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
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot