В этом проекте рассмотрим подключение декодера/мультиплексора 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);
}





