Я делаю так. По внешнему прерыванию от нажатия кнопки проц просыпается и считывает код нажатой клавиши, снимает внешнее прерывание и запускает таймер на 250мс и производит какие то действия по обработке реакции на однократное нажатие, по прерыванию переполнения таймера считываем код нажатой клавиши, если код тот же - то считаю вторым нажатием (чтоб пользователь не мацал клаву и не портил себе нервы) и опять заряжаем таймер на 250 мс производим соответствующие действия по обработке 2 - х кратного нажатия и т.д. - считаем все многократным нажатием. Если при очередном переполнении таймера код считанной кнопки изменился то это идет как первое нажатие другой клавиши. Если же при прерывании таймера нет нажатой клавиши, то опять производим какие то действия (засыпаем, обрабатываем что вызвалось нажатием клавиши и т.п.). Все просто. А 250 мс - это засело со времен института, вроде как оптимальное время сканирования клавиатуры. Если устройство критично к потреблению, то можно сделать чтоб проц сам себе управлял питанием. Т.е. - нажали кнопку - подали питание - по прерыванию RESET он оживился и обработал клаву как написано выше, после чего сам себе отрубил питание.. При работе с ЖКИ и клавиатурой бывает удобна идея системного таймера, когда один таймер формирует сетку частот на сканирование клавы и на вывод в ЖКИ (если использовать порт с ЖКИ только на вывод, не считывая его бит состояния).
|