Когда не хватает ног. Часть 1. Дешифратор 4-16.

 Когда нужно подключить большое количество светодиодов, а тратить драгоценные пины микроконтроллера совсем не хочется (или чаще всего такого количества ног просто напросто нет), на помощь могут придти микросхемы-дешифраторы. Например дешифратор 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


Категория: AVR
Метки:

Написать коментарий

*
= 3 + 3

Добавить изображение

Последние статьи