Frojd00, Начнем тогда с того, как работает сканирование клавиатуры. Любая клавиатура есть матрица N*M кнопок, в которой N строк и M столбцов. Кнопки расположены на пересечении строк и столбцов. Для того, чтобы узнать, какая кнопка нажата, последовательно циклически выставляют, например, низкий уровень на каждую из N строк по очереди. Это называется сканированием строк клавиатуры. При каждом сканировании опрашиваются, уже параллельно, все M столбцов входами, подтянутыми к высокому уровню. Если при сканировании k-ой строки обнаруживается низкий уровнь на m столбце, то значит клавиша, находящаяся на пересечении строки k и столбца m нажата. Распознавание более двух одновременно нажатых нескольких клавиш мы пока опустим. Это отдельный вопрос для обсуждения. Но следует не забывать, что чем больше строк относительно количества столбцов - тем меньше вероятность конфлитов нескольких одновременно нажатых клавиш.
Отсюда получается, что при сканировании строк матрицы в каждый конкретный момент времени нам нужно выставить низкий уровень только на одной из N строк. Остальные могут оставаться в высоком уровне.
Сначала рассмотрим упрощенную задачу. Пусть у нас 8 строк и 16 столбцов. Со столбцами все понятно - нам нужно 16 пинов на вход. А вот со строками все не так однозначно. Решая задачу в лоб, мы можем использовать 8 пинов на вывод и последовательно только на одном из них выставлять низкий уровень сканирования строки, устанавливая остальные 7 пинов в высокий уровень.
Но можно решать задачу на в лоб, а воспользоваться дешифратором. В нашем случе 74HC138.

В нашем простейшем случае вход CS1 мы подключим к питанию (желательно, через резистор), а входы CS2 и CS3 - к земле. То бишь, в таблице истинности нас теперь интересуют только строки, начинающиеся с H L L (H - высокий уровень, L - низкий). Теперь смотрим на зависимость выходов Y0..Y7 от входов A0..A2. Как мы видим, перебирая все 8 возможных комбинаций уровней A0..A2 мы получаем нужное нам сканирование 8 строк. Ведь как раз только на одном из выходов Y0..Y7 устанавливается низкий уровень.
А значит, вместо 8 пинов на вывод для сканирования строк нам нужно только три! То бишь, пять пинов мы так сэкономили.
Усложним задачу. Пусть у нас 16 строк и 8 столбцов. На самом деле мы взяли ту же самую матрицу, просто для себя поменяли местами строки и столбцы

Со столбцами у нас опять все понятно - нужно 8 пинов на вход. А со строками мы поступим подобным образом, но уже с двумя дешифраторами 74HC138.
Обратите внимание, что если на входах CS1..CS3 любая комбинация, кроме H L L, то все 8 выходов Y0..Y7 имеют высокий уровень.
Поэтому мы возьмем один пин МК и подключим его к первой 74HC138 ко входу CS1 (CS2 и CS3 у нее оставим на земле) и, одновременно, ко входу CS2 второй 74HC138 (CS1 оставим на питании, CS3 - на земле). Тогда, если на этом пине будет высокий уровень, то выбрана будет первая 74HC138, а если низкий - вторая.
Теперь возьмем три пина на выход МК и подключим к обоим дешифраторам. Первый пин к A0 обоих, второй - к A1, третий - к А2.
Теперь перебирая уже 16 возможных комбинаций на 4 задействованных пинах мы можем последовательно сканировать все 16 строк! Так мы сэкономили уже 12(!) пинов МК. То есть, с двумя дешифраторами 74HC138 для сканирования матрицы 16*8 (128 кнопок) нам нужно всего лишь 12 (4+8) пинов.