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

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

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

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


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


Произвольное подключение семисегментника

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

1

Иногда бывает что схематическое подключение семисегментника будет проще к двум, а иногда и ктрем разным портам(задействуя только некоторые их выводы)
Посидел, навоял програмулину, в которой в начале нужно задать выводы, к которым и подключен семисегментник.

вот код который зажигает 8 цифр семисегментника.  Код занимает 13 процентов памяти меги 8. Проверенно на железе!

Код:
$regfile = "m8def.dat"                                      ' говорим компилятору что у нас микропроцессор Atmega 8
$crystal = 8000000                                          ' говорим компилятору что процессор тактируется от генератора с частотой 8, 000 000 мегагерц

Config Portd = Output , Portb = Output , Portc = Output     ' конфигурируем порты на выход к которым подключен семисегментник
A Alias Portd.7 : B Alias Portd.3 : C Alias Portb.3 : D Alias Portb.6 : E Alias Portd.5 : F Alias Portd.1 : G Alias Portc.1 : Dp Alias Portb.1       'Тут вписываем порты к которым подключены сегменты индикатора
Dig1 Alias Portd.0 : Dig2 Alias Portd.2 : Dig3 Alias Portd.4 : Dig4 Alias Portb.5 : Dig5 Alias Portb.7 : Dig6 Alias Portd.6 : Dig7 Alias Portb.0 : Dig8 Alias Portb.2 : Dig9 Alias Portc.2       ' тут вписываем порт к которым подключены общие провода каждой цифры

Dim W As Byte , Z As Byte , Y As Byte , I As Byte , Chislo(8) As Long , Viv_peremennaya As Long , Temp_print As Long       ' задаем переменные
Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse :    ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Enable Interrupts : Enable Timer0                           ' разрешаем прерывания и таймер 0

Do                                                          ' начало бесконечного цикла, в котором чето делаем
Incr Viv_peremennaya                                        ' переменная, которая будет отображатся на семисегментнике. Тут мы ее увеличиваем на единичку
Delay                                                       ' небольшая задержка
Loop

Pulse:
Stop Timer0                                                 ' останавливаем таймер 0
Temp_print = Viv_peremennaya
For I = 1 To 8                                              ' цикл в котором разбивается переменная на отдельные числа от 0 до 9
Chislo(i) = Temp_print Mod 10                               ' заносим в масив последнюю цифру от числа Temp_print(12345678 mod 10 = 8)
Temp_print = Temp_print / 10                                ' отсекаем последнюю цифру от числа Temp_print (12345678/10=1234567)
Next
Set Dig1 : Set Dig2 : Set Dig3 : Set Dig4 : Set Dig5 : Set Dig6 : Set Dig7 : Set Dig8 : Set Dig9       ' выключаем все общие провода семисегментника. Для семисигментника с общим минусом
'Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4 : Reset Dig5 : Reset Dig6 : Reset Dig7 : Reset Dig8 : Reset Dig9  Для семисигментника с общим плюсом
Incr W : If W > 8 Then W = 1                                ' выбираем какую цифру сейчас включать
Y = 0
Gosub Look : A = Z                                          ' переходим к подпрограмме Look, которая определяет нужно ли сейчас загорется сегменту А
Gosub Look : B = Z
Gosub Look : C = Z
Gosub Look : D = Z
Gosub Look : E = Z
Gosub Look : F = Z
Gosub Look : G = Z
Select Case W                                               ' включаем цифру которую выбрали (w). Подаем минус на общий провод конкретной цифры
 Case 1 : Reset Dig1
 Case 2 : Reset Dig2
 Case 3 : Reset Dig3
 Case 4 : Reset Dig4
 Case 5 : Reset Dig5
 Case 6 : Reset Dig6
 Case 7 : Reset Dig7
 Case 8 : Reset Dig8
End Select
Start Timer0                                                ' запускаем таймер0
Return                                                      ' возвращаемся к выполнению основной программы

Look:                                                       ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
Z = Chislo(w) * 7 : Z = Y + Z                               ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 0..1..2..3.......9, Y это номер сегмента (A=0 B=1 C=2...)
Z = Lookup(z , Cifri)                                       ' выбираем из таблици включить или выключить нужный сегмент
Incr Y                                                      'Y это номер сегмента (A=0 B=1 C=2...)
Return                                                      'возвращаемся на место откуда сюда прислали

' таблица сегментов для семисегментников с общим минусом
Cifri:
Data 1 , 1 , 1 , 1 , 1 , 1 , 0                              '0
Data 0 , 1 , 1 , 0 , 0 , 0 , 0                              '1
Data 1 , 1 , 0 , 1 , 1 , 0 , 1                              '2
Data 1 , 1 , 1 , 1 , 0 , 0 , 1                              '3
Data 0 , 1 , 1 , 0 , 0 , 1 , 1                              '4
Data 1 , 0 , 1 , 1 , 0 , 1 , 1                              '5
Data 1 , 0 , 1 , 1 , 1 , 1 , 1                              '6
Data 1 , 1 , 1 , 0 , 0 , 0 , 0                              '7
Data 1 , 1 , 1 , 1 , 1 , 1 , 1                              '8
Data 1 , 1 , 1 , 1 , 0 , 1 , 1                              '9
' таблица сегментов для семисегментников с общим плюсом
'Data 0 , 0 , 0 , 0 , 0 , 0 , 1                              '0
'Data 1 , 0 , 0 , 1 , 1 , 1 , 1                              '1
'Data 0 , 0 , 1 , 0 , 0 , 1 , 0                              '2
'Data 0 , 0 , 0 , 0 , 1 , 1 , 0                              '3
'Data 1 , 0 , 0 , 1 , 1 , 0 , 0                              '4
'Data 0 , 1 , 0 , 0 , 1 , 0 , 0                              '5
'Data 0 , 1 , 0 , 0 , 0 , 0 , 0                              '6
'Data 0 , 0 , 0 , 1 , 1 , 1 , 1                              '7
'Data 0 , 0 , 0 , 0 , 0 , 0 , 0                              '8
'Data 0 , 0 , 0 , 0 , 1 , 0 , 0                              '9

Отредактировано Pasha (2010-01-21 19:04:26)

0

2

на attiny2313 не работает :(
переделал на 4 цифры, разводка правильная, все сегменты подключены(МОГУТ светиться), при числе в переменной 8888, на индикаторе: ----
фьюзы вроде правильные, тактовая 8, делитель отключен..
что еще можно проверить?

0

3

Переименовал все выводы как по схеме спаял?

Код:
A Alias Portd.7 : B Alias Portd.3 : C Alias Portb.3 : D Alias Portb.6 : E Alias Portd.5 : F Alias Portd.1 : G Alias Portc.1 : Dp Alias Portb.1       'Тут вписываем порты к которым подключены сегменты индикатора
Dig1 Alias Portd.0 : Dig2 Alias Portd.2 : Dig3 Alias Portd.4 : Dig4 Alias Portb.5 : Dig5 Alias Portb.7 : Dig6 Alias Portd.6 : Dig7 Alias Portb.0 : Dig8 Alias Portb.2 : Dig9 Alias Portc.2       ' тут вписываем порты к которым подключены общие провода каждой цифры

тут выбрал подключение для своего типа индикатора?

Код:
Set Dig1 : Set Dig2 : Set Dig3 : Set Dig4 : Set Dig5 : Set Dig6 : Set Dig7 : Set Dig8 : Set Dig9       ' выключаем все общие провода семисегментника. Для семисигментника с общим минусом
'Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4 : Reset Dig5 : Reset Dig6 : Reset Dig7 : Reset Dig8 : Reset Dig9  Для семисигментника с общим плюсом
' таблица сегментов для семисегментников с общим минусом
Cifri:
Data 1 , 1 , 1 , 1 , 1 , 1 , 0                              '0
Data 0 , 1 , 1 , 0 , 0 , 0 , 0                              '1
Data 1 , 1 , 0 , 1 , 1 , 0 , 1                              '2
Data 1 , 1 , 1 , 1 , 0 , 0 , 1                              '3
Data 0 , 1 , 1 , 0 , 0 , 1 , 1                              '4
Data 1 , 0 , 1 , 1 , 0 , 1 , 1                              '5
Data 1 , 0 , 1 , 1 , 1 , 1 , 1                              '6
Data 1 , 1 , 1 , 0 , 0 , 0 , 0                              '7
Data 1 , 1 , 1 , 1 , 1 , 1 , 1                              '8
Data 1 , 1 , 1 , 1 , 0 , 1 , 1                              '9
' таблица сегментов для семисегментников с общим плюсом
'Data 0 , 0 , 0 , 0 , 0 , 0 , 1                              '0
'Data 1 , 0 , 0 , 1 , 1 , 1 , 1                              '1
'Data 0 , 0 , 1 , 0 , 0 , 1 , 0                              '2
'Data 0 , 0 , 0 , 0 , 1 , 1 , 0                              '3
'Data 1 , 0 , 0 , 1 , 1 , 0 , 0                              '4
'Data 0 , 1 , 0 , 0 , 1 , 0 , 0                              '5
'Data 0 , 1 , 0 , 0 , 0 , 0 , 0                              '6
'Data 0 , 0 , 0 , 1 , 1 , 1 , 1                              '7
'Data 0 , 0 , 0 , 0 , 0 , 0 , 0                              '8
'Data 0 , 0 , 0 , 0 , 1 , 0 , 0                              '9

если с общим плюсом, то не отрицаю, мог я гдето и накосячить, возможно прийдется табличку править, хотя должно работать.

Схему в студию, и то как подправил код

0

4

Код:
$regfile = "attiny2313.dat"
$crystal = 8000000

Config Portd = Output , Portb = Output , Porta = Output

'Config Portd.6 = Input
'Config Portd.7 = Input

A Alias Portd.3
B Alias Portd.0
C Alias Portb.3
D Alias Portd.6
E Alias Portb.2
F Alias Portd.2
G Alias Portb.1
Dp Alias Portb.0                                            'Тут вписываем порты к которым подключены сегменты индикатора

Dig1 Alias Porta.1
Dig2 Alias Portd.1
Dig3 Alias Porta.0
Dig4 Alias Portb.4


Dim W As Byte , Z As Byte , Y As Byte , I As Byte , Chislo(8) As Long , Viv_peremennaya As Long , Temp_print As Long       ' задаем переменные
Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse :    ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Enable Interrupts : Enable Timer0                           ' разрешаем прерывания и таймер 0

Do
Viv_peremennaya = 0000                                      ' начало бесконечного цикла, в котором чето делаем
Incr Viv_peremennaya                                        ' переменная, которая будет отображатся на семисегментнике. Тут мы ее увеличиваем на единичку
'Waitms 1                                                    ' небольшая задержка
Loop

Pulse:
Stop Timer0                                                 ' останавливаем таймер 0
Temp_print = Viv_peremennaya
For I = 1 To 8                                              ' цикл в котором разбивается переменная на отдельные числа от 0 до 9
Chislo(i) = Temp_print Mod 10                               ' заносим в масив последнюю цифру от числа Temp_print(12345678 mod 10 = 8)
Temp_print = Temp_print / 10                                ' отсекаем последнюю цифру от числа Temp_print (12345678/10=1234567)
Next
Set Dig1 : Set Dig2 : Set Dig3 : Set Dig4                   ' выключаем все общие провода семисегментника. Для семисигментника с общим минусом
'Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4           'Для семисигментника с общим плюсом
Incr W : If W > 8 Then W = 1                                ' выбираем какую цифру сейчас включать
Y = 0
Gosub Look : A = Z                                          ' переходим к подпрограмме Look, которая определяет нужно ли сейчас загорется сегменту А
Gosub Look : B = Z
Gosub Look : C = Z
Gosub Look : D = Z
Gosub Look : E = Z
Gosub Look : F = Z
Gosub Look : G = Z
Select Case W                                               ' включаем цифру которую выбрали (w). Подаем минус на общий провод конкретной цифры
 Case 1 : Reset Dig1
 Case 2 : Reset Dig2
 Case 3 : Reset Dig3
 Case 4 : Reset Dig4
End Select
Start Timer0                                                ' запускаем таймер0
Return                                                      ' возвращаемся к выполнению основной программы

Look:                                                       ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
Z = Chislo(w) * 7 : Z = Y + Z                               ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 0..1..2..3.......9, Y это номер сегмента (A=0 B=1 C=2...)
Z = Lookup(z , Cifri)                                       ' выбираем из таблици включить или выключить нужный сегмент
Incr Y                                                      'Y это номер сегмента (A=0 B=1 C=2...)
Return                                                      'возвращаемся на место откуда сюда прислали

' таблица сегментов для семисегментников с общим минусом
Cifri:
Data 1 , 1 , 1 , 1 , 1 , 1 , 0                              '0
Data 0 , 1 , 1 , 0 , 0 , 0 , 0                              '1
Data 1 , 1 , 0 , 1 , 1 , 0 , 1                              '2
Data 1 , 1 , 1 , 1 , 0 , 0 , 1                              '3
Data 0 , 1 , 1 , 0 , 0 , 1 , 1                              '4
Data 1 , 0 , 1 , 1 , 0 , 1 , 1                              '5
Data 1 , 0 , 1 , 1 , 1 , 1 , 1                              '6
Data 1 , 1 , 1 , 0 , 0 , 0 , 0                              '7
Data 1 , 1 , 1 , 1 , 1 , 1 , 1                              '8
Data 1 , 1 , 1 , 1 , 0 , 1 , 1                              '9
' таблица сегментов для семисегментников с общим плюсом
'Data 0 , 0 , 0 , 0 , 0 , 0 , 1                              '0
'Data 1 , 0 , 0 , 1 , 1 , 1 , 1                              '1
'Data 0 , 0 , 1 , 0 , 0 , 1 , 0                              '2
'Data 0 , 0 , 0 , 0 , 1 , 1 , 0                              '3
'Data 1 , 0 , 0 , 1 , 1 , 0 , 0                              '4
'Data 0 , 1 , 0 , 0 , 1 , 0 , 0                              '5
'Data 0 , 1 , 0 , 0 , 0 , 0 , 0                              '6
'Data 0 , 0 , 0 , 1 , 1 , 1 , 1                              '7
'Data 0 , 0 , 0 , 0 , 0 , 0 , 0                              '8
'Data 0 , 0 , 0 , 0 , 1 , 0 , 0                              '9

0

5

http://slil.ru/28617122
даташит и схема

0

6

так есть ошибки или нету? :)

0

7

пробуй
1й вариант

Код:
    $regfile = "attiny2313.dat"
$crystal = 8000000

Config Portd = Output , Portb = Output , Porta = Output


A Alias Portd.3
B Alias Portd.0
C Alias Portb.3
D Alias Portd.6
E Alias Portb.2
F Alias Portd.2
G Alias Portb.1
Dp Alias Portb.0                                            'Тут вписываем порты к которым подключены сегменты индикатора

Dig1 Alias Porta.1
Dig2 Alias Portd.1
Dig3 Alias Porta.0
Dig4 Alias Portb.4


Dim W As Byte , Z As Byte , Y As Byte , I As Byte , Chislo(8) As Long , Viv_peremennaya As Long , Temp_print As Long       ' задаем переменные
Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse :    ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Enable Interrupts : Enable Timer0                           ' разрешаем прерывания и таймер 0

Do
Temp_print = 1234                                           ' начало бесконечного цикла, в котором чето делаем
Loop

Pulse:
Stop Timer0                                                 ' останавливаем таймер 0
For I = 1 To 4                                              ' цикл в котором разбивается переменная на отдельные числа от 0 до 9
Chislo(i) = Temp_print Mod 10                               ' заносим в масив последнюю цифру от числа Temp_print(12345678 mod 10 = 8)
Temp_print = Temp_print / 10                                ' отсекаем последнюю цифру от числа Temp_print (12345678/10=1234567)
Next

Set Dig1 : Set Dig2 : Set Dig3 : Set Dig4
Incr W : If W > 4 Then W = 1                                ' выбираем какую цифру сейчас включать
Y = 0
Gosub Look : A = Z                                          ' переходим к подпрограмме Look, которая определяет нужно ли сейчас загорется сегменту А
Gosub Look : B = Z
Gosub Look : C = Z
Gosub Look : D = Z
Gosub Look : E = Z
Gosub Look : F = Z
Gosub Look : G = Z

Select Case W                                               ' включаем цифру которую выбрали (w). Подаем плюс на общий провод конкретной цифры
 Case 1 :
 Reset Dig1
 Case 2 :
 Reset Dig2
 Case 3 :
 Reset Dig3
 Case 4 :
 Reset Dig4
End Select
Start Timer0                                                ' запускаем таймер0
Return                                                      ' возвращаемся к выполнению основной программы

Look:                                                       ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
Z = Chislo(w) * 7 : Z = Y + Z                               ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 0..1..2..3.......9, Y это номер сегмента (A=0 B=1 C=2...G=7)
Z = Lookup(z , Cifri)                                       ' выбираем из таблици включить или выключить нужный сегмент
Incr Y                                                      'Y это номер сегмента (A=0 B=1 C=2...)

Return                                                      'возвращаемся на место откуда сюда прислали

Cifri:
Data 1 , 1 , 1 , 1 , 1 , 1 , 0                              '0
Data 0 , 1 , 1 , 0 , 0 , 0 , 0                              '1
Data 1 , 1 , 0 , 1 , 1 , 0 , 1                              '2
Data 1 , 1 , 1 , 1 , 0 , 0 , 1                              '3
Data 0 , 1 , 1 , 0 , 0 , 1 , 1                              '4
Data 1 , 0 , 1 , 1 , 0 , 1 , 1                              '5
Data 1 , 0 , 1 , 1 , 1 , 1 , 1                              '6
Data 1 , 1 , 1 , 0 , 0 , 0 , 0                              '7
Data 1 , 1 , 1 , 1 , 1 , 1 , 1                              '8
Data 1 , 1 , 1 , 1 , 0 , 1 , 1                              '9

Вариант 2

Код:
        $regfile = "attiny2313.dat"
$crystal = 8000000

Config Portd = Output , Portb = Output , Porta = Output


A Alias Portd.3
B Alias Portd.0
C Alias Portb.3
D Alias Portd.6
E Alias Portb.2
F Alias Portd.2
G Alias Portb.1
Dp Alias Portb.0                                            'Тут вписываем порты к которым подключены сегменты индикатора

Dig1 Alias Porta.1
Dig2 Alias Portd.1
Dig3 Alias Porta.0
Dig4 Alias Portb.4


Dim W As Byte , Z As Byte , Y As Byte , I As Byte , Chislo(8) As Long , Viv_peremennaya As Long , Temp_print As Long       ' задаем переменные
Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse :    ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Enable Interrupts : Enable Timer0                           ' разрешаем прерывания и таймер 0

Do
Temp_print = 1234                                           ' начало бесконечного цикла, в котором чето делаем
Loop

Pulse:
Stop Timer0                                                 ' останавливаем таймер 0
For I = 1 To 4                                              ' цикл в котором разбивается переменная на отдельные числа от 0 до 9
Chislo(i) = Temp_print Mod 10                               ' заносим в масив последнюю цифру от числа Temp_print(12345678 mod 10 = 8)
Temp_print = Temp_print / 10                                ' отсекаем последнюю цифру от числа Temp_print (12345678/10=1234567)
Next

Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4
Incr W : If W > 4 Then W = 1                                ' выбираем какую цифру сейчас включать
Y = 0
Gosub Look : A = Z                                          ' переходим к подпрограмме Look, которая определяет нужно ли сейчас загорется сегменту А
Gosub Look : B = Z
Gosub Look : C = Z
Gosub Look : D = Z
Gosub Look : E = Z
Gosub Look : F = Z
Gosub Look : G = Z

Select Case W                                               ' включаем цифру которую выбрали (w). Подаем плюс на общий провод конкретной цифры
 Case 1 :
 Set Dig1
 Case 2 :
 Set Dig2
 Case 3 :
 Set Dig3
 Case 4 :
 Set Dig4
End Select
Start Timer0                                                ' запускаем таймер0
Return                                                      ' возвращаемся к выполнению основной программы

Look:                                                       ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
Z = Chislo(w) * 7 : Z = Y + Z                               ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 0..1..2..3.......9, Y это номер сегмента (A=0 B=1 C=2...G=7)
Z = Lookup(z , Cifri)                                       ' выбираем из таблици включить или выключить нужный сегмент
Incr Y                                                      'Y это номер сегмента (A=0 B=1 C=2...)

Return                                                      'возвращаемся на место откуда сюда прислали

Cifri:
Data 0 , 0 , 0 , 0 , 0 , 0 , 1                              '0
Data 1 , 0 , 0 , 1 , 1 , 1 , 1                              '1
Data 0 , 0 , 1 , 0 , 0 , 1 , 0                              '2
Data 0 , 0 , 0 , 0 , 1 , 1 , 0                              '3
Data 1 , 0 , 0 , 1 , 1 , 0 , 0                              '4
Data 0 , 1 , 0 , 0 , 1 , 0 , 0                              '5
Data 0 , 1 , 0 , 0 , 0 , 0 , 0                              '6
Data 0 , 0 , 0 , 1 , 1 , 1 , 1                              '7
Data 0 , 0 , 0 , 0 , 0 , 0 , 0                              '8
Data 0 , 0 , 0 , 0 , 1 , 0 , 0                              '9

PS не в тему.  Ура!!! Наконец купил ИК приемник и розабрался с RC5)))

Отредактировано Pasha (2010-02-16 07:03:27)

0

8

неа, ни первый, ни второй, результат одинаков: --:--, и не меняется...

ps: разобрался на bascom-e? тоже все хотел, пока времени ни на что нет

0

9

[220(12:28:45)>/usr/home/avr/tmp]# diff 1 2 -s
Files 1 and 2 are identical

оба варианта одинаковы :)

0

10

чет запарился. исправил

с rc5, да. на баскоме. в хэлпе есть пример. подцепил приемник на +- и пин. код точно из примера. Очень четко все заработало.

Дык. Только что скоипилировал следующий код и залил в девайс

Код:
$regfile = "m8def.dat"
$crystal = 8000000

Config Portb = Output : Config Portd = Output


A Alias Portd.5 : B Alias Portd.7 : C Alias Portd.3 : D Alias Portd.1 : E Alias Portd.0 : F Alias Portd.6 : G Alias Portd.4 : Dp Alias Portd.2       'Тут вписываем порты к которым подключены сегменты индикатора
Dig1 Alias Portb.3 : Dig2 Alias Portb.2 : Dig3 Alias Portb.1 : Dig4 Alias Portb.0


Dim W As Byte , Z As Byte , Y As Byte , I As Byte , Chislo(8) As Long , Viv_peremennaya As Long , Temp_print As Long       ' задаем переменные
Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse :    ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Enable Interrupts : Enable Timer0                           ' разрешаем прерывания и таймер 0

Do
Temp_print = 1234
Loop

Pulse:
Stop Timer0
For I = 1 To 4                                              ' цикл в котором разбивается переменная на отдельные числа от 0 до 9
Chislo(i) = Temp_print Mod 10                               ' заносим в масив последнюю цифру от числа Temp_print(12345678 mod 10 = 8)
Temp_print = Temp_print / 10                                ' отсекаем последнюю цифру от числа Temp_print (12345678/10=1234567)
Next                                                        ' останавливаем таймер 0
Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4
Incr W : If W > 4 Then W = 1                                ' выбираем какую цифру сейчас включать
Y = 0
Gosub Look : A = Z                                          ' переходим к подпрограмме Look, которая определяет нужно ли сейчас загорется сегменту А
Gosub Look : B = Z
Gosub Look : C = Z
Gosub Look : D = Z
Gosub Look : E = Z
Gosub Look : F = Z
Gosub Look : G = Z

Select Case W                                               ' включаем цифру которую выбрали (w). Подаем плюс на общий провод конкретной цифры
 Case 1 :
 Set Dig1
 Case 2 :
 Set Dig2
 Case 3 :
 Set Dig3
 Case 4 :
 Set Dig4
End Select
Start Timer0                                                ' запускаем таймер0
Return                                                      ' возвращаемся к выполнению основной программы

Look:                                                       ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
Z = Chislo(w) * 7 : Z = Y + Z                               ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 0..1..2..3.......9, Y это номер сегмента (A=0 B=1 C=2...G=7)
Z = Lookup(z , Cifri)                                       ' выбираем из таблици включить или выключить нужный сегмент
Incr Y                                                      'Y это номер сегмента (A=0 B=1 C=2...)

Return                                                      'возвращаемся на место откуда сюда прислали

Cifri:
Data 0 , 0 , 0 , 0 , 0 , 0 , 1                              '0
Data 1 , 0 , 0 , 1 , 1 , 1 , 1                              '1
Data 0 , 0 , 1 , 0 , 0 , 1 , 0                              '2
Data 0 , 0 , 0 , 0 , 1 , 1 , 0                              '3
Data 1 , 0 , 0 , 1 , 1 , 0 , 0                              '4
Data 0 , 1 , 0 , 0 , 1 , 0 , 0                              '5
Data 0 , 1 , 0 , 0 , 0 , 0 , 0                              '6
Data 0 , 0 , 0 , 1 , 1 , 1 , 1                              '7
Data 0 , 0 , 0 , 0 , 0 , 0 , 0                              '8
Data 0 , 0 , 0 , 0 , 1 , 0 , 0                              '9

Вот результат

Отредактировано Pasha (2010-02-16 07:42:14)

0

11

во, теперь работает :)

только temp_print не надо трогать, лучше так, как было в начале

Код:
Do
Waitms 5
Incr Viv
Loop

Pulse:
Stop Timer0
Temp_print = Viv
.....

и еще, два пожелания :)
1) сделать переменную в бит, в соотвествии с состоянием которой, загорались бы 2 точки в середине(для индикации секунд)
2)и, в ту же оперу - разнести 1,2 и 3,4 цифры :) для варианта с отображением времени
просто у меня таких индикатором вагон и тележка, пойдут на таймеры, часы и тд..

0

12

Да не вопрос.

вот как оно у меня реализовано:

Код:
Gosub Getdatetime
Stop Timer0
Viv_peremennaya = Chasi * 100
Viv_peremennaya = Viv_peremennaya + Minuti
Start Timer0
Migalka = Secundi Mod 2
If Migalka <> 0 Then
Dp_flag2 = 1
Dp_flag3 = 1
Dp_flag4 = 0
Else
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
End If
Код:
Pulse:
Stop Timer0                                                 ' останавливаем таймер 0
Temp_print = Viv_peremennaya
For I = 1 To 4                                              ' цикл в котором разбивается переменная на отдельные числа от 0 до 9
Chislo(i) = Temp_print Mod 10                               ' заносим в масив последнюю цифру от числа Temp_print(12345678 mod 10 = 8)
Temp_print = Temp_print / 10                                ' отсекаем последнюю цифру от числа Temp_print (12345678/10=1234567)
Next
Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4
Incr W : If W > 4 Then W = 1                                ' выбираем какую цифру сейчас включать
Y = 0
Gosub Look : A = Z                                          ' переходим к подпрограмме Look, которая определяет нужно ли сейчас загорется сегменту А
Gosub Look : B = Z
Gosub Look : C = Z
Gosub Look : D = Z
Gosub Look : E = Z
Gosub Look : F = Z
Gosub Look : G = Z

Select Case W                                               ' включаем цифру которую выбрали (w). Подаем плюс на общий провод конкретной цифры
 Case 1 :
  If Dp_flag1 = 1 Then Reset Dp Else Set Dp
 Set Dig1
 Case 2 :
 If Dp_flag2 = 1 Then Reset Dp Else Set Dp
 Set Dig2
 Case 3 :
 If Dp_flag3 = 1 Then Reset Dp Else Set Dp
 Set Dig3
 Case 4 :
 If Dp_flag4 = 1 Then Reset Dp Else Set Dp
 Set Dig4
End Select

'(          ' для индикатора с общим минусом
Select Case W                                               ' включаем цифру которую выбрали (w). Подаем минус на общий провод конкретной цифры
 Case 1 :
  If Dp_flag1 = 1 Then Set Dp Else Reset Dp
 Reset Dig1
 Case 2 :
 If Dp_flag2 = 1 Then Set Dp Else Reset Dp
 Reset Dig2
 Case 3 :
 If Dp_flag3 = 1 Then Set Dp Else Reset Dp
 Reset Dig3
 Case 4 :
 If Dp_flag4 = 1 Then Set Dp Else Reset Dp
 Reset Dig4
End Select

')

If Chasi = Chasi_alarm And Minuti = Minuti_alarm And Pinb.7 = 0 Then : Set Stop_alarm : End If
Start Timer0                                                ' запускаем таймер0
Return                                                      ' возвращаемся к выполнению основной программы

Look:                                                       ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
Z = Chislo(w) * 7 : Z = Y + Z                               ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 0..1..2..3.......9, Y это номер сегмента (A=0 B=1 C=2...G=7)
Z = Lookup(z , Cifri)                                       ' выбираем из таблици включить или выключить нужный сегмент
Incr Y                                                      'Y это номер сегмента (A=0 B=1 C=2...)

'If Chasi = Chasi_alarm And Minuti = Minuti_alarm And Pinb.7 = 0 Then Alarm_flag = 0

Return                                                      'возвращаемся на место откуда сюда прислали

Cifri:
' таблица сегментом для семисегментников с общим плюсом      |Chislo(i)| Символ |
Data 0 , 0 , 0 , 0 , 0 , 0 , 1                              '0
Data 1 , 0 , 0 , 1 , 1 , 1 , 1                              '1
Data 0 , 0 , 1 , 0 , 0 , 1 , 0                              '2
Data 0 , 0 , 0 , 0 , 1 , 1 , 0                              '3
Data 1 , 0 , 0 , 1 , 1 , 0 , 0                              '4
Data 0 , 1 , 0 , 0 , 1 , 0 , 0                              '5
Data 0 , 1 , 0 , 0 , 0 , 0 , 0                              '6
Data 0 , 0 , 0 , 1 , 1 , 1 , 1                              '7
Data 0 , 0 , 0 , 0 , 0 , 0 , 0                              '8
Data 0 , 0 , 0 , 0 , 1 , 0 , 0                              '9

Либо

Chislo(1)=Chasi  mod 10
Chislo(2)=Chasi / 10
для третьего и четвертого аналогичный финт с минутами.
Фишка в том что можно Chislo(1) присвоить значение больше 9 а в таблице дата понадописывать символов

например
Data 0 , 0 , 0 , 0 , 0 , 0 , 1                              '10           "-"
Data 0 , 0 , 0 , 0 , 0 , 0 , 0                              '11           "" пусто
Data 1 , 0 , 0 , 1 , 1 , 1 , 0                              '12           "C"
Data 1 , 1 , 0 , 0 , 1 , 1 , 1                              '13           "P"
Data 0 , 0 , 0 , 1 , 1 , 1 , 1                              '14           "t"

0

13

ага, хорошо :)
только выложи исходник полностью, а то чего то не пойму как мигание точек реализовать

0

14

ПЕРЕРАБОТАЛ КОД 8% МЕГИ8

Код:
'e-mail P-a-h-a@yandex.ru
$regfile = "m8def.dat"                                      ' мега8
$crystal = 8000000
Config Portb = Output , Portd = Output
A Alias Portd.5 : B Alias Portd.7 : C Alias Portd.3 : D Alias Portd.1 : E Alias Portd.0 : F Alias Portd.6 : G Alias Portd.4 : Dp Alias Portd.2       'Тут вписываем порты к которым подключены сегменты индикатора
Dig1 Alias Portb.3 : Dig2 Alias Portb.2 : Dig3 Alias Portb.1 : Dig4 Alias Portb.0       ' тут вписываем порты к которым подключены общие провода каждой цифры

Dim I As Byte , X As Byte , Cifri(4) As Byte , Perenoschikobsh_provodov As Byte , Perenoschiksegmentov As Byte       'задаем всякие переменные и масивы
     Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse : Enable Timer0 : Enable Interrupts       ' конфигурируем таймер 0 чтоб потом на него повесить алгоритм отображения цифр
 Do                                                         ' начало основного цикла
Cifri(1) = 1 : Cifri(2) = 2 : Cifri(3) = 3 : Cifri(4) = 4
 Loop                                                       'конец основного цикла

Pulse:                                                      ' подпрограмма прерываний таймера0
Perenoschikobsh_provodov = &HFF
Gosub Perenos
Incr X : If X > 3 Then X = 0
Perenoschiksegmentov = Lookup(cifri(x + 1) , Dta)
Reset Perenoschikobsh_provodov.x
Gosub Perenos
Return                                                      '  возвращаемся на место откуда прервали программу


Perenos:
Dig1 = Perenoschikobsh_provodov.3
Dig2 = Perenoschikobsh_provodov.2
Dig3 = Perenoschikobsh_provodov.1
Dig4 = Perenoschikobsh_provodov.0
A = Perenoschiksegmentov.5
B = Perenoschiksegmentov.7
C = Perenoschiksegmentov.3
D = Perenoschiksegmentov.1
E = Perenoschiksegmentov.0
F = Perenoschiksegmentov.6
G = Perenoschiksegmentov.4
Dp = Perenoschiksegmentov.2
Return

       Dta:                                                 '  таблица с данными о цифрах зажигает по порядку : 0123456789
       Data &HEF , &H8C , &HB7 , &HBE , &HDC , &H7E , &H7F , &HAC , &HFF , &HFE

Отредактировано Pasha (2010-07-21 22:57:41)

0


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