Для отладки использую попосовые телефонные кнопки AK-1607-N-BBW.
МК выставляет "бегущий ноль" (причём драйверы работают как open-drain) на колонки и считывает строки. Линии строк подвязаны к питанию - если там появляется нуль, значит, кнопка нажата.
Дальше выставляется высокий уровень на линию прерывания ведущего МК, он читает I2C, получет код кнопки и все рады.
Обработка нажатий самая простая - обнаруживается первая нажатая кнопка в ряду (т.е. если одновременно нажато несколько кнопок, то обработается всё равно самая первая из них, остальные будут пропущены).
Примитивный примитив, но работает!
Попутно убедился в действенности мудрого совета - если у вас два микроконтроллера соединены какими-то GPIO, то поставьте резистор (470 ом.. 1кОм, плюс-минус) в линию связи. Пригодится, если по какой-то причине оба микроконтроллера одновременно попробуют выставить активное состояние на линию, но один выставит "1", а другой "0" -- резистор ограничит ток, который в ином случае спалил бы оба пина.
Итого: для подключения клавиатуры 6*5 (в будущем, сейчас пока что 4*4) к центральному микроконтроллеру, мне надо всего лишь подключиться к I2C, которая и так уже есть, и ещё задействовать 1 линию хардварного прерывания (без него тоже можно, но тогда I2C надо опрашивать непрерывно - сие гемор).