Частый опрос вполне заменим на прерывание от изменения уровня. Даже на целый порт бывает такое прерывания с маской на нужные биты. Т.е. на мой взгляд, так и следует действовать - ловить изменения состояния контактов через прерывание. Но вот что делать в его обработчике, не совсем понятно. Боюсь, что принять решение там не получится, а придется на каждый контакт запускать отдельный таймер на предельную ширину дребезга, но тогда не хватит таймеров (16 штук их понадобится).