Информация об изменениях

Сообщение 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:
    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:
    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