Как альтернативу второму сдвиговому регистру, можно применить дешифратор 4-16 (74HC154, 1533ИД3). Только необходимо учитывать, что активным уровнем на выходе дешифратора всегда является логический ноль.
Подключая индикатор по такой схеме появляетсятся возможность, используя всего две микросхемы, подключить к микроконтроллеру аж 16-и разрядный индикатор. Число ног микроконтроллера затраченных на подключение составляет всего 7. Как видно на схеме, половина ножек выхода дешифратора осталась свободных.
Код в Bascom-AVR для работы с индикатором по приведенной схеме:
$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)
'начинаем выводить на индикатор
Portd = &B00001110 'выставляем ноль в старшем разряде индикатора
R = Lookup(n1 , Numbers) 'берем из массива значение для первой цифры
Gosub Registr 'подпрограмма отправки данных в регистр
Portd = &B00001100
R = Lookup(n2 , Numbers)
Gosub Registr
Portd = &B00001010
R = Lookup(n3 , Numbers)
Gosub Registr
Portd = &B00001000
R = Lookup(n4 , Numbers)
Gosub Registr
Portd = &B00000110
R = Lookup(n5 , Numbers)
Gosub Registr
Portd = &B00000100
R = Lookup(n6 , Numbers)
Gosub Registr
Portd = &B00000010
R = Lookup(n7 , Numbers)
Gosub Registr
Portd = &B00000000
R = Lookup(n8 , Numbers)
Gosub Registr
Loop
End 'конец программы
'массив с кодами для семисегментника
Numbers:
Data &B10111111 '0
Data &B10000110 '1
Data &B11011011 '2
Data &B11001111 '3
Data &B11100110 '4
Data &B11101101 '5
Data &B11111101 '6
Data &B10000111 '7
Data &B11111111 '8
Data &B11101111 '9
'подпрограмма отправки данных в регистр
Registr:
Shiftout Portd.5 , Portd.6 , R , 1 'задвигаем данные
Pulseout Portd , 7 , 10 'защелкиваем регистр
Waitms 5
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)
'начинаем выводить на индикатор
Portd = &B00001110 'выставляем ноль в старшем разряде индикатора
R = Lookup(n1 , Numbers) 'берем из массива значение для первой цифры
Gosub Registr 'подпрограмма отправки данных в регистр
Portd = &B00001100
R = Lookup(n2 , Numbers)
Gosub Registr
Portd = &B00001010
R = Lookup(n3 , Numbers)
Gosub Registr
Portd = &B00001000
R = Lookup(n4 , Numbers)
Gosub Registr
Portd = &B00000110
R = Lookup(n5 , Numbers)
Gosub Registr
Portd = &B00000100
R = Lookup(n6 , Numbers)
Gosub Registr
Portd = &B00000010
R = Lookup(n7 , Numbers)
Gosub Registr
Portd = &B00000000
R = Lookup(n8 , Numbers)
Gosub Registr
Loop
End 'конец программы
'массив с кодами для семисегментника
Numbers:
Data &B10111111 '0
Data &B10000110 '1
Data &B11011011 '2
Data &B11001111 '3
Data &B11100110 '4
Data &B11101101 '5
Data &B11111101 '6
Data &B10000111 '7
Data &B11111111 '8
Data &B11101111 '9
'подпрограмма отправки данных в регистр
Registr:
Shiftout Portd.5 , Portd.6 , R , 1 'задвигаем данные
Pulseout Portd , 7 , 10 'защелкиваем регистр
Waitms 5
Return
Скачать файлы для этого примера
Теперь если возникнет необходимость в подключении к микроконтроллеру очень большого числа семисегментных индикаторов это не должно вызвать больших трудностей. Удачи!