В этом проекте рассмотрим подключение декодера/мультиплексора 74HC238 к плате Ардуино. Микросхема может обеспечить логическую единицу только на одном из восьми выходов, в зависимости какие уровни установлены на адресных контактах А0, А1 и А2.
Таблица истинности для микросхемы 74HC238 (L – низкий уровень (0), H – высокий уровень (1), X – любое состояние):
Контакты активации выходов E1, E2 и E3 – контакты, которые позволяют включать или отключать выходы микросхемы.
Включение происходит когда на E1 и E2 установлен логический 0 (контакты подтянуты к земле), а на E3 – логическая единица 1 (подтянут к +5V).
Контакты А0, А1 и А2 – адресные контакты, которые определяют на какой из выходов будет подана логическая единица.
Таким образом получается, если E1 и E2 – LOW (0), E3 – HIGH (1), а A0, A1 и A2 – LOW (000) – то будет включен выход Y0 (4-я строка таблицы).
Подобно тому, если A0 – HIGH (высокий), A1 – LOW (низкий), а A2 – HIGH (высокий), это равняется значению 101, которое в десятичном формате равно 5. В результате когда на адресных контактах установлено 101, будет включен выход Y5.
Наши устройства вывода будут светодиоды. Поскольку на микросхеме 74HC238 имеется 8 выходов (Y0…Y7), мы подсоединим к ней 8 светодиодов.
Один выход будет иметь светодиод вместе с резистором для ограничения избыточного тока. E1 и E2 подтянем физически к GND (на этих контактах всегда будет низкий уровень). Вход E3 подключим к ардуино, чтобы иметь возможность отключать все светодиоды. В программе будем переключать выходы от Y0 до Y7 и обратно.
И, собственно, сам скетч:
/* Еще одни бегущие огни */ const long int _delay = 100; // Задержка между сменной светодиодов const uint8_t pins_A[3] = {2,3,4}; // Адресные контакты const uint8_t pins_E[1] = {5}; // Контакт для вкл/выкл void setup() { /* Настроим выхода */ for(uint8_t k = 0; k < 3; k++) { pinMode(pins_A[k], OUTPUT); } pinMode(pins_E[0], OUTPUT); } void loop() { /* Установим высокий уровень на E3 */ digitalWrite(pins_E[0], HIGH); /* Переберем поочередно числа от 0 до 7 */ for(uint8_t n = 0; n < 8; n++) { setLed(n); // Установить число n на адресных контактах delay(_delay); } /* Обратный порядок */ for(uint8_t n = 0; n < 8; n++) { setLed(7 - n); // Установить число n на адресных контактах delay(_delay); } } /* Выставляет необходимые уровни на выводах А0, А1 и А2 согласно переданному числу */ void setLed(uint8_t num) { for(uint8_t i = 0; i < 3; i++) { // Выставим число в двоичной системе на выводах А0, А1 и А2 uint8_t val = bitRead(num, i); // Считаем i-ый бит digitalWrite(pins_A[i], val); // Установим на выводе А[i] } } void OFF() { digitalWrite(pins_E[0], LOW); } void ON() { digitalWrite(pins_E[0], HIGH); }