Для кнопки надо выбраную ножку I/O подключить через кнопку на землю. Сам же вывод надо сконфигурировать как вход с подтяжкой (DDRxy=0 PORTxy=1). Тогда, когда кнопка не нажата, через подтягивающий резистор, на входе будет высокий уровень напряжения, а из бит PINху будет при чтении отдавать 1. Если кнопку нажать, то вход будет положен на землю, а напряжение на нем упадет до нуля, а значит из PINxy будет читаться 0. По нулям в битах регистра PINх мы узнаем что кнопки нажаты. Пунктиром показан дополнительный подтягивающий резистор. Несмотря на то, что внутри AVR на порт можно подключить подтяжку, она слабоватая — 100кОм. А значит ее легко придавить к земле помехой или наводкой, что вызовет ложное срабатывание. А еще эти внутренние подтягивающие резисторы очень любят гореть от наводок. У меня уже с десяток микроконтроллеров с убитыми PullUp резисторами. Все работает, но только нет подтяжки — сгорела. Вешаешь снаружи резистор и работает как ни в чем ни бывало. Поэтому, для ответственных схем я настоятельно рекомендую добавить внешнюю подтяжку на 10кОм — даже если внутреннюю накроет, внешняя послужит. В процессе обучения на это можно забить. =============================================================================== если кнопка нажата и флага1 нет - ставим флаг и выход. если кнопка нажата и есть флаг1 - увеличиваем счётчик. если счётчик переполнился - фиксируем удержание. если есть флаг удержания, счётчик не переполнен но достиг порога - можно фикисровать срабатывани атовповтора (при необходимости) если кнопка отпущена но есть флаг1 и при этом счётчик >= порога и нет флага удержания - фиксируем нажатие. сьросим флаг1, счётчик времени. флаги 2 и 3 сбросят п/п обработки кнопка нажата флаг1 есть? нет: установим и дальше да: считаем время нажатия переполнилось время нажатия? да: удержание. ставим флаг3, кнопка отпущена время нажатия >= 0.5сек? да: есть флаг 3? нет: ставим флаг2 сбросим флаг1, сбросим время нажатия ; *** начало бработки кнопки *** sbic ButPort,BTN1 ; кнопка 1 нажата? rjmp T0L2 ; нет, на обработку ненажатой кнопки sbrs flagb,BTN1P ; была нажата раньше? rjmp T0L4 ; нет, вкл флаг и дальше... inc TIKB ; да, увеличим счётчик brne T0L3 ; переполнения нет - на выход mov temp,flagb ; переполнение... sbi temp,1<= BTN_Treshold) { // счётчик достиг антидребезга? SetBit(BTN[i].flg,PRESSED); // да. ставим флаг } else { BTN[i].Count ++; // не достиг. увеличим счётчик } } else { // флаг уже есть -- антидребезг отработали if (BTN[i].Count < BTN_Holded) { // счётчик меньше времени удержания? BTN[i].Count ++; // увеличиваем счётчик } } } else { // кнопка не нажата if (bit_is_set(BTN[i].flg,PRESSED)) { // флаг есть ResBit(BTN[i].flg,PRESSED); // и сбросим флаг if (BTN[i].Count < BTN_Pressed) { // счётчик BTN[i].Count = 0; // очистим счётчик } } else { BTN[i].Count = 0; // очистим счётчик } } } else { // на паузе. уменьшаем счётчик BTN[i].Pause --; } в обработчике кнопка обрабатывается если есть флаг и счётчик, сбрасывается счётчик кнопки и устанавливается счётчик паузы.