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

