Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Дисплеи и индикация » 56 светодиодов на порт. Есть алгоритм?


56 светодиодов на порт. Есть алгоритм?

Сообщений 1 страница 4 из 4

1

Захотелось собрать на меге8 индикатор уровня звука для 5.1 канальной системы.
когда-то видел схемы подключения светодиодов с минимальным количеством выходов.

Нарисовал схему подключения 56 светодиодов к одному порту.
Может кто видел алгоритм выбора и зажигания нужного светодиода? Возможно есть какие то библиотеки?

Отредактировано Pasha (2009-12-13 18:50:48)

0

2

Немножко помучал комп и в теории все получилось. Светодиоды считаются по порядку сверху вниз. НА ЖЕЛЕЗЕ НЕ ПРОБОВАЛ!!!! ДА И НЕТ ПОКА ЖЕЛЕЗА в схеме нужны резисторы на все порты по 100 ом, можно наверное и по 50

Код:
$regfile = "m8def.dat"                                      ' Работаем с ATmega8
$crystal = 8000000                                          'Работаем на частоте 8 мГц
Dim Led As Byte , I As Byte , Sum_led As Byte , Vivod(3) As Byte , Vivod2_invert As Byte , Chetnost As Byte
Declare Sub Print_led                                       ' (led As Byte)

Do
' программа
Led = 16                                                    ' включает 9й светодиод
Print_led
Loop
End

Sub Print_led
'_______________________Выбор ножек на которых сидит светодиод__________________
Chetnost = Led Mod 2
Led = Led / 2
If Chetnost = 1 Then Led = Led + 1
Sum_led = 0
'Sum_led = (7 - 0) +(7 - 1) +(7 - 2) +(7 - 3) +(7 - 4) +(7 - 5) +(7 - 6) = 28
For I = 0 To 6
Sum_led = Sum_led + 7                                       'Sum_led = Sum_led +(7 - I)
Sum_led = Sum_led - I
If Led <= Sum_led Then
 Vivod(1) = I
 Vivod2_invert = Sum_led - Led
'Vivod2_invert =    13   -  9   = 4 а надо 3
'0 1 2 3 4 5 6 7
'7 6 5 4 3 2 1 0
Exit For
End If
Next
'Sum_led = 0
For I = 6 To Vivod2_invert Step -1                          ' инвертируем Vivod2_invert, превращаем числа к указанным в табличке выше (0в7, 1в6, 2в5, ...)
Incr Vivod(2)
Next
'_______________________________________________________________________________
'___________________Включение нужного светодиода________________________________
Config Portb = Input
For I = 1 To 2
Select Case Vivod(i)
Case 0 : Config Portb.0 = Output
Case 1 : Config Portb.1 = Output
Case 2 : Config Portb.2 = Output
Case 3 : Config Portb.3 = Output
Case 4 : Config Portb.4 = Output
Case 5 : Config Portb.5 = Output
Case 6 : Config Portb.6 = Output
Case 7 : Config Portb.7 = Output
End Select
Next
Reset Portb
If Chetnost = 1 Then Set Portb.vivod(1)else Set Portb.vivod(2)

'_______________________________________________________________________________
'print "Led = " ; Led                                     ' можно расскоментировать и в эмуляторе васика посмотреть какие выводы порта включаются
Print "vivod1 = " ; Vivod(1) ; "; четность = " ; Chetnost
Print "vivod2 = " ; Vivod(2)
Print Portb
Vivod(2) = 0
End Sub

Вопросик можно как то обойти select case?
Гораздо удобнее было бы написать к примеру
Config Portb.i = Output, но компилятор почему то не понимает такую запись(((

На рисунке ниже точками обозначенны светодиодные пары. Номера идут по порядку, по граффику, начиная с 1..28
вертикальные части граффика соответствуют лапам порта 0,1,2..8 горизонтальная сетка тоже. На пересечение этих двух прямых указанна точкой светодиодная пара.  Так 8ая светодиодная пара подключенна к лапкам порта х=1 y=2 соответственно portb.1 и portb.2. Программа вычисляет по номеру светодиода к каким лапам он подключен и подает на них в зависимости от того четный светодиод или нет +,- или -,+

Отредактировано Pasha (2010-01-03 00:32:44)

0

3

Подправил код на железе. Все работает. Можно подключать до 56 светодиодов на порт, незабываем вешать резисторы по 100 ом на каждую ножку.

Код:
$regfile = "m8def.dat"                                      ' Работаем с ATmega8
$crystal = 8000000                                          'Работаем на частоте 8 мГц
Dim Ledsub As Byte , Led As Byte , I As Byte , Sum_led As Byte , Vivod(2) As Byte , Vivod2_invert As Byte , Chetnost As Byte
Declare Sub Print_led

Do
' программа
Incr Led                                                    ' включает поочереди все светодиоды
If Led = 57 Then Led = 1
Print_led
Waitms 200
Loop
End

Sub Print_led
'_______________________Выбор ножек на которых сидит светодиод__________________
Chetnost = Led Mod 2
Ledsub = Led / 2
If Chetnost = 1 Then Ledsub = Ledsub + 1
Sum_led = 0
'Sum_led = (7 - 0) +(7 - 1) +(7 - 2) +(7 - 3) +(7 - 4) +(7 - 5) +(7 - 6) = 28
For I = 0 To 6
Sum_led = Sum_led + 7                                       'Sum_led = Sum_led +(7 - I)
Sum_led = Sum_led - I
If Ledsub <= Sum_led Then
 Vivod(1) = I
 Vivod2_invert = Sum_led - Ledsub
'Vivod2_invert =    13   -  9   = 4 а надо 3
'0 1 2 3 4 5 6 7
'7 6 5 4 3 2 1 0
Exit For
End If
Next
'Sum_led = 0
For I = 6 To Vivod2_invert Step -1                          ' инвертируем Vivod2_invert, превращаем числа к указанным в табличке выше (0в7, 1в6, 2в5, ...)
Incr Vivod(2)
Next
'_______________________________________________________________________________
'___________________Включение нужного светодиода________________________________
Config Portc = Input

For I = 1 To 2
Select Case Vivod(i)
Case 0 : Config Portc.0 = Output
Case 1 : Config Portc.1 = Output
Case 2 : Config Portc.2 = Output
Case 3 : Config Portc.3 = Output
Case 4 : Config Portc.4 = Output
Case 5 : Config Portc.5 = Output
Case 6 : Config Portc.6 = Output
Case 7 : Config Portc.7 = Output
End Select
Next
Portc = 0
If Chetnost = 1 Then
 Set Portc.vivod(1)
 Reset Portc.vivod(2)
 Else
 Set Portc.vivod(2)
 Reset Portc.vivod(1)
 End If
Vivod(2) = 0
'_______________________________________________________________________________
'print "Led = " ; Led                                     ' можно расскоментировать и в эмуляторе васика посмотреть какие выводы порта включаются
'Print "vivod1 = " ; Vivod(1) ; "; четность = " ; Chetnost
'Print "vivod2 = " ; Vivod(2)
'Print Portb

End Sub

0

4

В теории можно

Код:
'___________________Включение нужного светодиода________________________________
Config Portc = Input

For I = 1 To 2
Select Case Vivod(i)
Case 0 : Config Portc.0 = Output
Case 1 : Config Portc.1 = Output
Case 2 : Config Portc.2 = Output
Case 3 : Config Portc.3 = Output
Case 4 : Config Portc.4 = Output
Case 5 : Config Portc.5 = Output
Case 6 : Config Portc.6 = Output
Case 7 : Config Portc.7 = Output
End Select
Next

заменить на

Код:
Portc = 0
Ddrc = Bits(vivod(1) , Vivod(2))

0


Вы здесь » Программирование ATMEL в BASCOM. » Дисплеи и индикация » 56 светодиодов на порт. Есть алгоритм?