Второй пример, посвященный подключению семисегментных индикаторов к микроконтроллеру через сдвиговые регистры 74HC595. В примере рассмотрен индикатор с общими анодами. Здесь аноды индикатора подключены к микроконтроллеру, в отличие от первого примера, тоже через сдвиговый регистр. И для того чтобы организовать динамическое переключение разрядов мы должны отправлять в этот регистр соответствующие данные, которые будут выставлять на определенном выходе регистра единичку. Затем мы должны отправить в регистр, который отвечает за работу сегментов, данные соответствующие "зажиганию" нужной цифры.
Для подключения индикатора по такому методу потребуется 6 ножек микроконтроллера, вне зависимости от количества разрядов индикатора. Использовав два регистра, можно подключить максимум 8-и разрядный индикатор (как на схеме). Если нужно еще больше, тогда добавляем третий регистр и получаем возможность подключить 16-и разрядный индикатор.
Код для работы с индикатором по такой схеме представлен ниже. Тут выводится на индикатор значение переменной А (число «12345678»). В коде есть задержка между переключениями сегментов равная 5 мс, увеличьте ее и сможете в замедленном режиме посмотреть как происходит зажигание каждой цифры.
$regfile = "m8def.dat"
$crystal = 8000000
Config Portd = Output
'значение этой переменной должны будем вывести на индикатор
Dim A As Long
'переменные для преобразования исходного числа
Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte
Dim N5 As Byte
Dim N6 As Byte
Dim N7 As Byte
Dim N8 As Byte
Dim M1 As Long
Dim M2 As Long
Dim M3 As Long
Dim M4 As Long
Dim M5 As Long
Dim M6 As Long
Dim M7 As Long
Dim M8 As Long
'для значений отправляемых в регистр
Dim R As Byte
Do
A = 12345678 'значение переменной для вывода на индикатор
'раскладываем число на составляющие
M1 = A
M2 = M1
M3 = M1
M4 = M1
M5 = M1
M6 = M1
M7 = M1
M8 = M1
M1 = M1 / 10000000
N1 = Abs(m1)
M2 = M2 Mod 10000000
M2 = M2 / 1000000
N2 = Abs(m2)
M3 = M3 Mod 1000000
M3 = M3 / 100000
N3 = Abs(m3)
M4 = M4 Mod 100000
M4 = M4 / 10000
N4 = Abs(m4)
M5 = M5 Mod 10000
M5 = M5 / 1000
N5 = Abs(m5)
M6 = M6 Mod 1000
M6 = M6 / 100
N6 = Abs(m6)
M7 = M7 Mod 100
M7 = M7 / 10
N7 = Abs(m7)
M8 = M8 Mod 10
N8 = Abs(m8)
'начинаем задвигать данные в регистр
R = &b10000000
Gosub Anod
R = Lookup(n1 , Numbers) 'начинаем с левого разряда
Gosub Registr 'подпрограмма отправки данных в регистр
R = &B01000000
Gosub Anod
R = Lookup(n2 , Numbers)
Gosub Registr
R = &B00100000
Gosub Anod
R = Lookup(n3 , Numbers)
Gosub Registr
R = &B00010000
Gosub Anod
R = Lookup(n4 , Numbers)
Gosub Registr
R = &B00001000
Gosub Anod
R = Lookup(n5 , Numbers)
Gosub Registr
R = &B00000100
Gosub Anod
R = Lookup(n6 , Numbers)
Gosub Registr
R = &B00000010
Gosub Anod
R = Lookup(n7 , Numbers)
Gosub Registr
R = &B00000001
Gosub Anod
R = Lookup(n8 , Numbers)
Gosub Registr
Loop
End 'конец программы
'массив с кодами для семисегментника
Numbers:
Data &B11000000 '0
Data &B11111001 '1
Data &B10100100 '2
Data &B10110000 '3
Data &B10011001 '4
Data &B10010010 '5
Data &B10000010 '6
Data &B11111000 '7
Data &B10000000 '8
Data &B10010000 '9
'подпрограмма отправки данных в регистр
Registr:
Shiftout Portd.5 , Portd.6 , R , 1 'задвигаем данные
Pulseout Portd , 7 , 10 'защелкиваем регистр
Waitms 5 'время, в течении которого горит один разряд
Return
'подпрограмма работы с регистром переключающим аноды
Anod:
Shiftout Portd.3 , Portd.4 , R , 3
Pulseout Portd , 2 , 10
Return
$crystal = 8000000
Config Portd = Output
'значение этой переменной должны будем вывести на индикатор
Dim A As Long
'переменные для преобразования исходного числа
Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte
Dim N5 As Byte
Dim N6 As Byte
Dim N7 As Byte
Dim N8 As Byte
Dim M1 As Long
Dim M2 As Long
Dim M3 As Long
Dim M4 As Long
Dim M5 As Long
Dim M6 As Long
Dim M7 As Long
Dim M8 As Long
'для значений отправляемых в регистр
Dim R As Byte
Do
A = 12345678 'значение переменной для вывода на индикатор
'раскладываем число на составляющие
M1 = A
M2 = M1
M3 = M1
M4 = M1
M5 = M1
M6 = M1
M7 = M1
M8 = M1
M1 = M1 / 10000000
N1 = Abs(m1)
M2 = M2 Mod 10000000
M2 = M2 / 1000000
N2 = Abs(m2)
M3 = M3 Mod 1000000
M3 = M3 / 100000
N3 = Abs(m3)
M4 = M4 Mod 100000
M4 = M4 / 10000
N4 = Abs(m4)
M5 = M5 Mod 10000
M5 = M5 / 1000
N5 = Abs(m5)
M6 = M6 Mod 1000
M6 = M6 / 100
N6 = Abs(m6)
M7 = M7 Mod 100
M7 = M7 / 10
N7 = Abs(m7)
M8 = M8 Mod 10
N8 = Abs(m8)
'начинаем задвигать данные в регистр
R = &b10000000
Gosub Anod
R = Lookup(n1 , Numbers) 'начинаем с левого разряда
Gosub Registr 'подпрограмма отправки данных в регистр
R = &B01000000
Gosub Anod
R = Lookup(n2 , Numbers)
Gosub Registr
R = &B00100000
Gosub Anod
R = Lookup(n3 , Numbers)
Gosub Registr
R = &B00010000
Gosub Anod
R = Lookup(n4 , Numbers)
Gosub Registr
R = &B00001000
Gosub Anod
R = Lookup(n5 , Numbers)
Gosub Registr
R = &B00000100
Gosub Anod
R = Lookup(n6 , Numbers)
Gosub Registr
R = &B00000010
Gosub Anod
R = Lookup(n7 , Numbers)
Gosub Registr
R = &B00000001
Gosub Anod
R = Lookup(n8 , Numbers)
Gosub Registr
Loop
End 'конец программы
'массив с кодами для семисегментника
Numbers:
Data &B11000000 '0
Data &B11111001 '1
Data &B10100100 '2
Data &B10110000 '3
Data &B10011001 '4
Data &B10010010 '5
Data &B10000010 '6
Data &B11111000 '7
Data &B10000000 '8
Data &B10010000 '9
'подпрограмма отправки данных в регистр
Registr:
Shiftout Portd.5 , Portd.6 , R , 1 'задвигаем данные
Pulseout Portd , 7 , 10 'защелкиваем регистр
Waitms 5 'время, в течении которого горит один разряд
Return
'подпрограмма работы с регистром переключающим аноды
Anod:
Shiftout Portd.3 , Portd.4 , R , 3
Pulseout Portd , 2 , 10
Return
Метод хорошо использовать в проектах, в которых нужно выводить информацию на семисегментные (или любые другие) индикаторы с большим количеством разрядов, например на информационные табло и т.п.
Скачать файлы проекта