mov dptr,#table ;адрес таблицы кодов для индикации
mov p3,#0 ;вначале все погасим
main_loop: ;основной цикл сканирования и индикации
mov r2,#4 ;число линий сканирования
mov r3,#1 ;код для выбора линии сканирования
mov r4,#0 ;скан-код - индекс в таблице кодов для индикации
scan_loop: ;цикл проверки линии сканирования
mov p1, r3 ;задаем линию сканирования в p1.0-p1.3
mov a, p1 ;читаем результат из p1.4-p1.6
swap a ;перенесем биты 4-6 в 0-2 (для удобства анализа)
mov r5,#3 ;число выходных линий
line_loop: ;цикл анализа полученных бит
rrc a ;сдвинем аккумулятор на 1 бит вправо, младший бит в С
jnc key_found ;если С = мл.бит = 0, то было нажатие!
inc r4 ;код следующей кнопки
djnz r5, line_loop ;по всем битам линии
;линия ничего не дала - переходим на следующую
mov a, r3 ;сдвинем код выбора линии сканирования на 1 влево
rl a ; (это можно делать только в аккумуляторе)
mov r3, a
djnz r2, scan_loop ;по всем линиям сканирования
;увы, ничего не было нажато
jmp main_loop ;идем на повтор сканирования,
;ни индикаторе ничего не меняем
key_found: ;есть нажатие!
mov a, r4 ;скан-код клавиши (0-11)
movc a,@a+dptr ;читаем код для индикации
mov p3, a ;выводим
jmp main_loop ;и на повтор сканирования
table: ;таблица для задания кодов для индикации
db 00010000b, 00100000b, 00110000b ;1,2,3
db 01000000b, 01010000b, 01100000b ;4,5,6
db 01110000b, 10000000b, 10010000b ;7,8,9
db 10110000b, 00000000b, 10100000b ;*,0,#
end
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.