На мысль навела вот эта клавиатура. У нее 8 ног, опрос клавиш производится путем циклической подачи HIGH на каждую ногу из первой четверки и циклического же опроса каждой ноги из второй четверки внутри цикла подачи HIGH на первую четверку. Итого надо 4 пина Ардуины на выход и 4 на вход, что довольно расточительно для одной маленькой клавиатуры. Первое что пришло в голову - установить регистр 165 на выход и 595 на вход, по 3 пина на каждую, итого экономилось бы 2 пина. Уже лучше, тем более, что регистры работают наполовину, можно навесить на них что нибудь еще. Кроме того, входной регистр считывает все четыре входящие пина разом, что упрощает и ускоряет код. Второе что пришло в голову, а нельзя ли объединить каналы DATA и CLOCK для обоих регистров, ведь они работают по очереди. Достаточно оставить отдельный LATCH на каждый регистр. И ведь заработало! Единственное что смущает, пин DATA приходится передергивать то в INPUT то в OUTPUT. Раньше все мои скетчи объявляли роли пинов только вначале. Не вредны ли для платы такие переключения много раз в секунду? Пока что из соображений предосторожности поставил delay(100) между переключениями. И, наконец, третье что пришло в голову, а нельзя ли обнаглеть и объединить LATCH тоже? И ведь тоже заработало! Правда, стандартный shiftIn опять потерял один бит, наверняка можно как то его подготовить чтобы он так не делал, но было уже лень и использовал свою функцию считывания, она как то надежнее, проще и не капризничает. Итого, вместо 8 пинов для одного устройства мы занимаем 3, при этом количество каскадом подключенных подобных устройств может быть очень большим. PS: возможно, Америку не открыл, то идея собственная, не подглядывал. Может быть кому пригодится.
Поправочка, LATCH все же надо разделять, в моем случае получилось, что данные перекочевали с 165 на 595 напрямую, без контроллера, что не правильно. Итого, 4 пина при одновременной работе двух групп разнонаправленных регистров это минимум. Ну и ладно.