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 – Варианты индивидуальных заданий