2
Key8
Code_Table2: .dw Key9, Key10, Key11, Key12, Key13, Key14, Key15,
Key16
Это две таблицы, одна для клавиш с 1 по 8, другая - с 9 по 16. В ней
последовательно расположены адреса на функции, которые мы будем
выполнять в зависимости от того, какая кнопка нажата.
Для этого мы заранее загрузим адрес начала таблицы в регистровую пару Z,
и затем, вычислив, какая же по счету кнопка была нажата, прибавим это
смещение к адресу начала таблицы. Получим адрес с ячейкой, в которой
содержится адрес функции, которую нужно выполнить. Звучит немного
сложно, но на самом деле, все достаточно просто и понятно. Главно
вчитаться в предыдущее предложение.
Обратите внимание, что в таблице адреса занимают по 2 байта, а смещение у
нас будет увеличиваться на один, поэтому нам необходимо будет умножить
смещение на два. Вы увидете это в коде. Знайте, что это из за того, что адрес
занимает два байта, и нам нужно перепрыгнуть через оба.
Другая особенность:
При отсутствии нажатий с клавиатуры приходит 0b11111111. Тоесть
ненажатая кнопка - высокий уровень. К примеру нажмем кнопку 3, и к нам
придет число 0b11110111 (соответствующий бит сброшен). Поэтому выведем
алгоритм: пришедший байт мы сначала будем сравнивать с маской
0b11111110, потом с 0b11111101, затем 0b11111011 и т.д. Мы просто будем в
цикле сдвигать биты в маске влево, каждый раз сверяя ее с пришедшим
байтом и увеличивая счетчик. В тот момент, когда будет совпадение - в
счетчике будет номер нажатой кнопки. Что нам собственно и требуется.
В функции будет использоваться один байт из оперативной памяти.
1
2
3
; RAM ===========================================
.DSEG
KeyFlag
: .byte 1