Для кнопки надо выбраную ножку 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<<BTN1H
	mov	flagb,temp	; установили флаг удержания
	rjmp	T0L3		; дальше...
T0L2:	sbrs	flagb,BTN1P	; кнопка не нажата
	rjmp	T0L5
	ldi	temp,64		; ~0.5 сек
	cp	TIKB,temp	; тики достигли порога срабатывания?
	brlo	T0L5		; нет, на очистку
	mov	temp,flagb	; да, ставим флаг
	cbi	temp,1<<BTN1R
	mov	flagb,temp	; установили флаг отпускания
T0L5:	clr	TIKB		; очистим тики кнопок
	mov	temp,flagb
	cbi	temp,1<<BTN1P
	mov	flagb,temp	; сбросили флаг нажатия
	rjmp	T0L3		; дальше...
T0L4:	sbi	temp,1<<BTN1P
	mov	flagb,temp	; установили флаг нажатия
	; *** закончили обратоку кнопки ***
T0L3:

===============================================
каждый раз -- всё с начала, нихера не помню, нихера не выходит...

ещё раз:

предположим, опрос кнопки идёт в таймере с периодичнойстью 1-10 мс.
пороги -- антидребезг = 50 мс, срабатывания = 100 мс, длинное нажатие =
500 мс, удержание = 2 с.

опрос кнопок:
  кнопка нажата (
     флага нет (
	счётчик достиг порога антидребезга (
	  ставим флага нажатия
	  очищаем счётчик	// можно не делать.
	) не достиг (
	  увеличиваем счётчик
	)
     ) флаг есть (
	счётчик меньше времени удержания (
	    увеличивает счётчик
	)
     )
  ) кнопка не нажата (
     флаг есть (
	сбросить флаг
	счётчик меньше времени срабатывания (
	    очистить
	)
     ) флага нет (
	 очистить счётчик
     )
  )
// 10 проверок, 7(6) действий


обработка кнопок:
  тут просто проверяем время нажатия/удержания.
  сначала двойные комбинации, потом одиночные.
  непонятно как обрабатывать удержание, если должна быть реакция и на
  нажатие...

кроме того -- ещё нужен обратный счётчик.
после фиксации факта срабатывания или отпцскания -- заводим счётчик паузы,
и ока он не дотикает до 0 -- кнопку не обрабатываем.
