Пока_без_кота, приветствую! Спасибо за картинку с дисплеем.
Рад, что все заработало у вас! По поводу подтяжки Р0, вы правы, а я перепутал с режимом работы обычного ввода-вывода.
По поводу оптимизации сканирования матричной клавиатуры. Думаю можно еще короче написать.
В подпрограмме не учитываю защиту от дребезга, нажатий сразу двух клавиш и звук. Это вы и сами допишите,
если надо будет. Для примера возьмем "телефонную" клавиатуру:
Спойлер
Код: Выделить всё
klaviatura:
mov DPTR, #0 ;
mov R7, #4 ;счетчик строк
mov R6, #1 ;маска сканирования строк
klav1:
mov R4, #4 ;счетчик столбцов
mov R5, #1 ;маска на результат сканирования
mov A, R6
rr A ;сдвиг вправо единицы из старшего в младший разряд
mov R6, A ;сохранить
cpl A ;для вывода сканирующего нуля инверсия
mov P1, A ;вывод сканирующего нуля в порт
klav2:
mov A, P1 ;считать результат
anl A, R5 ;накладываем маску
jz klav3 ;если был 0, то кнопка нажата
mov A, R5 ;иначе сдвигаем маску влево для чтения
rl A ;следующего бита
mov R5, A
inc DPTR ;увеличиваем, указатель таблицы кнопок
djnz R4, klav2 ;перебор всех столбцов
djnz R7, klav1 ;перебор всех строк
mov A, #16 ; признак не нажатых кнопок, можно просто: setb F0 , затем проверять флаг
ret ;
klav3:
mov A, DPL ;результат сканирования от 0 до 15
mov DPTR, #Tab_klav
movc A, @A+DPTR ;
ret ;
;
Tab_klav: ;для наглядности построчно
DB 0 ;1
DB 1 ;2
DB 2 ;3
DB 3 ;A
DB 4 ;4
DB 5 ;5
DB 6 ;6
DB 7 ;B
DB 8 ;7
DB 9 ;8
DB 10 ;9
DB 11 ;C
DB 12 ;*
DB 13 ;0
DB 14 ;#
DB 15 ;D
В результате, после сканирования можно получать сразу код символа из таблицы для вывода,
например, на дисплей или в уарт. Конечно, надо будет заполнить таблицу соответствующим образом.
Вместо чисел от 0 до 15 надо вписать нужные коды. Можно вообще, без таблицы, тогда на выходе будем
получать число от 0 до 15 и оно будет соответствовать нажатой клавише. Можно подключить матрицу не 4Х4,
а любую, меньшей размерности, логика работы и результаты не меняются.
Если подумать над программой, то может и можно будет ее еще сократить-оптимизировать.
Схема подключения клавиатуры:
---1-----2-----3-----A---- P1.7
---4-----5-----6-----B---- P1.6
---7-----8-----9-----C---- P1.5
---*-----0-----#-----D--- P1.4
P1.0...P1.1..P1.2..P1.3