Возможно, извлечете что-то полезное из моей процедуры опроса клавиатуры (для ATtiny2313):
PHP код:
|
...
.def Beep = R27 ;длительность звукового сигнала (мс) ("0" - выкл.) .def Kbd = R28 ;состояние клавиатуры, счетчик задержки "длинного нажатия" .def Command = R29 ;команды и события, биты: 0-сигнал на входе, 1-длинное нажатие, 2-короткое нажатие, 3-...
...
start: ... ldi Kbd,0xFF ldi Command,0 ldi Beep,0
...
//----------Опрос клавиатуры get_kbd: cpi kbd,0xFF breq get_kbd_1 cpi kbd,0 breq get_kbd_4 sbis PIND,6 rjmp get_kbd_3 ldi kbd, 0xFF sbr Command, 4 ret get_kbd_4: sbic PIND,6 ldi kbd, 0xFF ret get_kbd_3: dec kbd brne get_kbd_2 ldi beep, 0xFF sbr Command, 2 get_kbd_2: ret get_kbd_1: sbic PIND,6 ret ldi beep, 0x80 ldi kbd, 0x14 ret
|
Процедура вызывается из обработчика прерывания таймера Т1 (обеспечивает счет реального времени) 10 раз в секунду (т.е. автоматическая защита от дребезга). В момент нажатия генерится короткий звуковой сигнал (это делает обработчик таймера Т0, отвечающий за звук. В регистре Beep хранится время в мс, оставшееся до окончания генерации звука). При отпускании кнопки ("короткое нажатие") или окончании задержки "длинного нажатия" (кстати, кнопка одна, висит на линии 6 порта D) в регистр Command заносится код команды (биты 1 и 2). Дальнейшая его обработка - асинхронная в теле программы. Кроме того, если нажатие было длительным, при окончании задержки генерится длинный звуковой сигнал. Автоповтора нет (т.е. нажали, держим, через секунду сработало "длинное нажатие", дальше можно держать сколько угодно - ничего не будет). Для работы требуется один регистр (kbd) в монопольное пользование. Как видно, здесь нет циклов и задержек, поэтому опрос клавиатуры существенно не влияет на %