Francois Auger, Philippe Fretaud
EDN
О том, как, используя технологию чарлиплексирования, управлять максимальным числом светодиодов с помощью минимального числа линий ввода-вывода, рассказывалось во множестве статей [1, 2, 3]. Здесь мы покажем, каким образом можно управлять тремя светодиодами и сканировать три кнопки с помощью всего трех линий ввода-вывода вместо шести. Используя этот же принцип, можно также управлять четырьмя кнопками и двумя светодиодами или пятью светодиодами и одной кнопкой. Схема хорошо работает с микроконтроллерами ATmega фирмы Atmel, включая Arduino, и может представлять особый интерес для любых восьмивыводных устройств, или тогда, когда вы вышли из бюджета линий ввода/вывода.
Как это сделать, показывает схема на Рисунке 1. Принцип управления каждым из трех светодиодов одинаков, и также одинаковы способы сканирования трех кнопок. Поэтому рассмотрим только, каким образом управляется светодиод L0, и как считывается состояние кнопки B0. Для управления светодиодом L0 порты P0 и P2 должны быть сконфигурированы выходами. В порт P2 надо записать «0», а в P0 – «1», чтобы зажечь светодиод, или «0», чтобы погасить. Для того чтобы включался только один светодиод L0, порт P1 надо настроить на ввод. Диод D2 предохраняет от короткого замыкания в ситуации, когда кнопка B2 замыкается при включенном светодиоде L0.
![]() |
||
Рисунок 1. |
Для считывания состояния кнопки B0 необходимо сконфигурировать порт P1 на вывод и записать в него «0». P0 настраивается на ввод, и при этом подключается внутренний резистор подтяжки 20 кОм (входные выводы с коммутируемыми нагрузочными резисторами есть во всех микроконтроллерах ATmega и в нескольких других моделях). Благодаря этому подтягивающему резистору при разомкнутой кнопке на выводе P0 будет высокий логический уровень. При нажатой кнопке напряжение на P0 приблизительно равно
что можно считать низким логическим уровнем.
Для того чтобы выключить светодиод L0, порт P2 надо настроить на ввод (высокоимпедансное состояние). Диод D0 предохраняет от короткого замыкания в ситуации, когда светодиод L1 включается при замкнутой кнопке B0.
Листинг, который можно загрузить по ссылке в конце статьи, представляет небольшую программу для Arduino, показывающую, как можно последовательно мигать тремя светодиодами, и включать один светодиод, когда нажата соответствующая кнопка.
Разумеется, схему можно обобщить на любое количество линий. При четырех линиях ввода/вывода появится возможность управлять шестью светодиодами и шестью кнопками. При N линиях можно управлять N × (N – 1)/2 светодиодами и таким же количеством кнопок.