На собеседовании мне задали такой вопрос: учитывая 8 выходных контактов и 8 входных контактов на микроконтроллере, возможно ли прочитать матрицу переключателей 10 на 10 без использования чипов мультиплексора и демультиплексора? Я не уверен, что это возможно...
Я бы сделал что-то вроде этого:
смоделируйте эту схему - схема, созданная с помощью CircuitLab
Я использую 7 выходов и 8 входов, чтобы создать матрицу из 56 точек коммутации, и я устанавливаю по два переключателя в каждую точку коммутации, всего 112 переключателей. 8-й выход используется для управления набором подтягивающих/подтягивающих резисторов для входов.
Просканируйте массив дважды. В первый раз установите для Out7 низкий уровень и подайте импульсы на другие выходы высоким уровнем по одному. Ищите любые входы, идущие высоко. Это говорит вам, замкнут ли нижний переключатель в каждой точке пересечения.
Во второй раз установите для Out7 высокий уровень и поочередно подавайте низкий уровень на другие выходы. Ищите любые входы, идущие вниз. Это говорит вам, замкнут ли верхний переключатель в каждой точке пересечения.
С 8 выходными и 8 входными контактами вы можете создать матрицу из 64 пересечений с переключателем на каждом пересечении. У вас могут возникнуть некоторые проблемы, когда несколько переключателей могут быть замкнуты одновременно, поэтому вы можете использовать диод на каждом переключателе. И не забудьте про подтягивания для входов. Это то, что можно сделать прямолинейно, и я чувствую, что именно это хотел услышать интервьюер.
Если нет необходимости правильно определять замыкания нескольких переключателей, вы можете использовать диодную матрицу, чтобы каждый переключатель мог поместить свой уникальный код на 8 входов. Выходы не нужны, можно обнаружить до 255 переключателей (одно состояние входа зарезервировано для «выключатель не замкнут».)
Вы можете обмануть, используя микросхемы вместо мультиплексоров/демультиплексоров, таких как сдвиговые регистры, расширители ввода-вывода или даже микроконтроллеры. Это научит вашего собеседника точнее формулировать вопрос :)
Если контакты имеют как цифровые, так и аналоговые возможности, вы можете проявить еще больше творчества. Однажды я спроектировал (но так и не построил) систему, которая могла считывать матрицу NxN с двумя GPIO/аналоговыми контактами и кучей резисторов и диодов. Максимальное значение N было ограничено падением напряжения на диоде, точностью резистора и битами аналого-цифрового преобразователя. (Нет возможности многократного нажатия.) Вероятно, непрактично, но приятно пофантазировать.
Недд опубликовал и удалил предложение Чарлиплексирования, для которого требуются контакты, которые могут быть как входными, так и выходными. Кажется, ваш вопрос исключен, но если вы используете несколько контактов для создания шины SPI или I2C и подключаете 16-контактный удлинитель GPIO в стиле MCP23017...
пользователь_1818839
Дэйв Твид