Ldi R24,0b00000000
out 02,R20 настройка линий E0-3 на ввод, а E4-7 – на вывод;
out 0x11,R23 установить режим вывода для порта D;
out 0x12, R23 погасить все светодиоды;
loop1: стартовая метка цикла опроса;
out 03,R18 обнулить бит E4 для опроса клавиш 1-го столбца;
nop установить задержку в один такт;
in R16,01 считать данные из регистра PINE в R16;
out 03,R19 обнулить бит E5 для опроса клавиш 2-го столбца;
nop установить задержку в один такт;
in R17,01 считать данные из регистра PINE в R16;
or R16,R20 установить в 1 биты старшей тетрады R16;
or R17,R20 установить в 1 биты старшей тетрады R17;
swap R17 поменять местами старшую и младшую тетрады в R17;
and R17,R16 объединить информацию о нажатии клавиш в R17;
out 0x12,R17 вывести данные о номерах нажатых клавиш в порт D;
in R26,0 считать данные из регистра ввода порта F;
and R26,R22 обнулить все биты регистра R26, кроме 7-го.
cpi R26,0 сравнить значение в регистре R26 с нулем.
brne loop1 если клавиша не нажата – то выполнить переход для повторения опроса, иначе –
out 0x12,r24выполнить команду включить все светодиоды;
#endasm завершение кода ассемблерной вставки;
} завершающая операторная скобка программы.
Для установки и обнуления битов регистров ввода/вывода можно использовать команды sbi и cbi соответственно. Однако эти команды необходимо будет использовать попарно, что ухудшает наглядность исходного кода программы.
Рисунок 2.7 – Алгоритм программы считывания данных с клавиатуры
Таблица 2.1 – Варианты индивидуальных заданий