В том то и беда, что нужно быстро считывать состояние 16 пинов. digitalRead() и подобные дают ОООчень маленькую скорость, часть данных теряется. Для быстрого чтения лучше считывать данные не с пинов, а с порта целиком. Для этого есть команды PINA, PINC, PORTA, PORTC, DDRC и др. которые отлично работают на любых Ардуинах кроме DUE. Это связано с архитектурой. Но как это сделать на ДУЕ (чтение порта а не пина) - ХЗ...
На команды PINA, PINC, PORTA, PORTC, DDRC и др выдает ошибку "маст декларед". Про том что тот же самый код нормально шьется на Мегу. Мега, к сожалению, с поставленной задачей не справляется - маленькая скорость работы.