Сообщение Re[23]: Что наиболее быстро развивается? Замедлились ли теле от 28.02.2024 23:38
Изменено 28.02.2024 23:49 vdimas
Re[23]: Что наиболее быстро развивается? Замедлились ли теле
Здравствуйте, Shmj, Вы писали:
V>>Алгоритм опроса клавы сидел на аппаратном прерывании, обыгрывал дребезжание и если "понимал", что кнопка надёжно нажата или отпущена, генерировал программное прерывание.
S>Какая кнопка? Там же много кнопок — как вы все одновременно будете проверять?
Почему одновременно?
Поочерёдным сканированием.
Всего 40 кнопок.
8 линий сканирования по 5 разрядов в каждой.
Сбрасываешь в 0 один из старших битов адреса порта (младший всегда FE), читаешь байт из порта, в нём интересуют разряды с 0-го по 4-й.
Если в разряде 0 — кнопка на текущей скан-линии нажата.
Программно это выглядит как примерно такая последовательность:
По окончании в KbScanArray будет 8 скан-кодов.
Вдогонку.
В реальности это всё расписывалось на макро-ассемблере и выглядело более читабельно:
V>>Алгоритм опроса клавы сидел на аппаратном прерывании, обыгрывал дребезжание и если "понимал", что кнопка надёжно нажата или отпущена, генерировал программное прерывание.
S>Какая кнопка? Там же много кнопок — как вы все одновременно будете проверять?
Почему одновременно?
Поочерёдным сканированием.
Всего 40 кнопок.
8 линий сканирования по 5 разрядов в каждой.
Сбрасываешь в 0 один из старших битов адреса порта (младший всегда FE), читаешь байт из порта, в нём интересуют разряды с 0-го по 4-й.
Если в разряде 0 — кнопка на текущей скан-линии нажата.
Программно это выглядит как примерно такая последовательность:
KbScanArray:
ds 8
...
KbScanProc:
ld hl, KbScanArray
ld a, F7h
in a, FEh
ld (hl), a
inc hl
ld a, FBh
in a, FEh
ld (hl), a
inc hl
...
ld a, 7Fh
in a, FEh
ld (hl), a
По окончании в KbScanArray будет 8 скан-кодов.
Вдогонку.
В реальности это всё расписывалось на макро-ассемблере и выглядело более читабельно:
KbScanArray:
ds 8
...
.macro ScanLine %L
ld a, %L
in a, FEh
ld (hl), a
.endm
.macro ScanLineInc %L
ScanLine %L
inc hl
.endm
KbScanProc:
ld hl, KbScanArray
ScanLineInc F7h
ScanLineInc FBh
ScanLineInc FDh
ScanLineInc FEh
ScanLineInc EFh
ScanLineInc DFh
ScanLineInc BFh
ScanLine FEh
Re[23]: Что наиболее быстро развивается? Замедлились ли теле
Здравствуйте, Shmj, Вы писали:
V>>Алгоритм опроса клавы сидел на аппаратном прерывании, обыгрывал дребезжание и если "понимал", что кнопка надёжно нажата или отпущена, генерировал программное прерывание.
S>Какая кнопка? Там же много кнопок — как вы все одновременно будете проверять?
Почему одновременно?
Поочерёдным сканированием.
Всего 40 кнопок.
8 линий сканирования по 5 разрядов в каждой.
Сбрасываешь в 0 один из старших битов адреса порта (младший всегда FE), читаешь байт из порта, в нём интересуют разряды с 0-го по 4-й.
Если в разряде 0 — кнопка на текущей скан-линии нажата.
Программно это выглядит как примерно такая последовательность:
По окончании в KbScanArray будет 8 скан-кодов.
Вдогонку.
В реальности это всё расписывалось на макро-ассемблере и выглядело более читабельно:
V>>Алгоритм опроса клавы сидел на аппаратном прерывании, обыгрывал дребезжание и если "понимал", что кнопка надёжно нажата или отпущена, генерировал программное прерывание.
S>Какая кнопка? Там же много кнопок — как вы все одновременно будете проверять?
Почему одновременно?
Поочерёдным сканированием.
Всего 40 кнопок.
8 линий сканирования по 5 разрядов в каждой.
Сбрасываешь в 0 один из старших битов адреса порта (младший всегда FE), читаешь байт из порта, в нём интересуют разряды с 0-го по 4-й.
Если в разряде 0 — кнопка на текущей скан-линии нажата.
Программно это выглядит как примерно такая последовательность:
KbScanArray:
ds 8
...
KbScanProc:
ld hl, KbScanArray
ld a, F7h
in a, FEh
ld (hl), a
inc hl
ld a, FBh
in a, FEh
ld (hl), a
inc hl
...
ld a, 7Fh
in a, FEh
ld (hl), a
По окончании в KbScanArray будет 8 скан-кодов.
Вдогонку.
В реальности это всё расписывалось на макро-ассемблере и выглядело более читабельно:
KbScanArray:
ds 8
...
.macro ScanLine %L
ld a, %L
in a, FEh
ld (hl), a
.endm
.macro ScanLineInc %L
ScanLine %L
inc hl
.endm
KbScanProc:
ld hl, KbScanArray
ScanLineInc F7h
ScanLineInc FBh
ScanLineInc FDh
ScanLineInc FEh
ScanLineInc EFh
ScanLineInc DFh
ScanLineInc BFh
ScanLine 7Fh