Когда нужно подключить большое количество светодиодов, а тратить драгоценные пины микроконтроллера совсем не хочется (или чаще всего такого количества ног просто напросто нет), на помощь могут придти микросхемы-дешифраторы. Например дешифратор 74HC154 (наш аналог К1533ИД3), который выставляет определенный выход в активное состояние в зависимости от 4х битного числа на входе. Таблица истинности описывающа логику работы приведена ниже. L-низкий уровень Н-высокий уровень Х-низкий или высокий, без разницы
Если посидеть и повтыкать с минуту, то можно понять что ничего сложного тут нет =) Стоит отметить, что активный уровень на выходе – низкий (low). Помимо входов-выходов присутствуют два разрешающих вывода enable, включенных по логической И. Дешифратор будет выполнять свою функцию только тогда, когда обе эти ноги сидят на земле. Имхо, недостатком является только то, что в любой момент времени только на одном из выходов может быть активный уровень. Поэтому, если потребуется одновременное включение нескольких выходов, придется приделывать динамическое управление. Вот простой пример программы для ATTiny13, здесь поочереди выставляются пины выхода дешифратора в активное состояние, а-ля бегущий огонек:
$regfile = “attiny13.dat”
$crystal = 1000000
Config Portb = Output
Do
Portb = &B00001111
Waitms 100
Portb = &B00001110
Waitms 100
Portb = &B00001101
Waitms 100
Portb = &B00001100
Waitms 100
Portb = &B00001011
Waitms 100
Portb = &B00001010
Waitms 100
Portb = &B00001001
Waitms 100
Portb = &B00001000
Waitms 100
Portb = &B00000111
Waitms 100
Portb = &B00000110
Waitms 100
Portb = &B00000101
Waitms 100
Portb = &B00000100
Waitms 100
Portb = &B00000011
Waitms 100
Portb = &B00000010
Waitms 100
Portb = &B00000001
Waitms 100
Portb = &B00000000
waitms 100
Loop
End
Вот что получится в итоге:
Еще на основе дешифратора можно построить расширитель для клавиатуры, и таким образом получить в распоряжение 16 кнопок занимающих 5 пинов микроконтроллера. Например вот простой пример для attiny2313:
В основном цикле выполняется какая-нибудь программа, например мигание светодиода. По переполнению таймера происходит прерывание, в обработчике прерывания происходит сканирование клавиатуры и если была нажата кнопка, на ноге PortB.7 появится низкий уровень. Узнав в какой момент было нажатие, можно узнать номер нажатой кнопки. Этот номер отправим по UART:
$regfile = “attiny2313.dat”
$crystal = 1000000
$baud = 1200
Dim M As Byte
Dim N As Byte
Config Portb = Output
Config Portb.7 = Input
Config Portd.2 = Output
Config Timer1 = Timer , Prescale = 8 ‘переполнение таймера каждые 0,5 сек
On Timer1 Keyboard:
Enable Interrupts
Enable Timer1
Do ‘***выполняем основную программу***
Portd.2 = 1
Wait 1
Portd.2 = 0
Wait 1
Loop
End
Keyboard:
For M = 0 To 15 Step 1
Portb = M
If Pinb.7 = 0 Then ‘если была нажата кнопка
N = M ‘смотрим в какой момент она была нажата
M = 0
Print N ‘печатаем номер кнопки
Return ‘и выходим из цикла
End If ‘если нажатия небыло, продолжим сканирование до конца
Waitms 10
Next M
Return ‘возвращаемся в основной цикл программы
Документация на микросхему 74HC154Взято с: avrproject.ru
Последние статьи
- Лучшая практика проектирования при размещении компонентов печатной платы
- Android 6.0 на lancer X
- Простой усилитель мощности класса АВ своими руками.
- Двухтактный ультралинейный ламповый УНЧ на EL84 (6П14П).
- Люксметр на ATmega8 и цифровом датчике BH1750
- Контроллер для светодиодной ленты с ИК управлением
- Самодельный LED светильник на основе ИК датчика HC-SR501
- Простой усилитель низкой частоты на TDA7377 и NE5532
- Простейший звонок с двумя мелодиями
- LED Cube 8x8x8 на Arduino с RTC