Код: Выделить всё
$regfile = "m8def.dat"
$crystal = 8000000
' * * * настраиваем порты к которым цепляется индикатор на выход * * *
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Ddrb = &B11111111
Config Pinc.0 = Input
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
' * * * заводим переменные * * *
Dim A As Byte
Dim W As Word
Dim B As Word
Dim C As Word
Dim D As Byte
Dim F As Bit
Dim K As Byte
Dim S As Byte
Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte
Dim M1 As Integer
Dim M2 As Integer
Dim M3 As Integer
Declare Sub Led()
Declare Sub Knopka()
Declare Sub Seg_1()
Declare Sub Seg_2()
Declare Sub Seg_3()
' включаем прерывания
Config Timer1 = Timer , Prescale = 256
On Timer0 Led
Enable Timer0
Config Timer1 = Timer , Prescale = 1024
Enable Timer1
B = Timer1
C = Timer1
Enable Interrupts
Reset A
W = 0
' * * * Основной цикл программы * * *
Do
M1 = W ' вот это число будем отображать
M2 = M1
M3 = M1
M1 = M1 / 100 'обработка первого числа
N1 = Abs(m1)
M2 = M2 Mod 100 'обработка второго числа
M2 = M2 / 10
N2 = Abs(m2)
M3 = M3 Mod 10 ' обработка четвертого числа
N3 = Abs(m3)
rcall Knopka
Loop
Schet:
If Pinc.0 = 0 Then
Waitms 5
Incr A
End If
If Pinc.1 = 0 Then
Waitms 5
Decr A
End If
'коэффициент пересчёта
If A = 2 Then
Incr W
A = 0
End If
If A = -2 Then
Decr W
A = 0
End If
Return
'* * * подпрограма обработки индикации * * *
Led:
Incr S
If S = 1 Then
Portd = &B01000000 'зажигаем первое число
If N1 = 0 Then 'гашение не значащих нулей
Portd = &B00000000
End If
Select Case N1
Case 0 : Portb = &B11000000
Case 1 : Portb = &B11111001
Case 2 : Portb = &B10100100
Case 3 : Portb = &B10110000
Case 4 : Portb = &B10011001
Case 5 : Portb = &B10010010
Case 6 : Portb = &B10000010
Case 7 : Portb = &B11111000
Case 8 : Portb = &B10000000
Case 9 : Portb = &B10010000
End Select
End If
If S = 2 Then
Portd = &B00100000 'зажигаем второе число вместе с точкой
If N2 = 0 And N1 = 0 Then 'гашение не значащих нулей
Portd = &B00000000
End If
Select Case N2
Case 0 : Portb = &B01000000
Case 1 : Portb = &B01111001
Case 2 : Portb = &B00100100
Case 3 : Portb = &B00110000
Case 4 : Portb = &B00011001
Case 5 : Portb = &B00010010
Case 6 : Portb = &B00000010
Case 7 : Portb = &B01111000
Case 8 : Portb = &B00000000
Case 9 : Portb = &B00010000
End Select
End If
If S = 3 Then
Portd = &B00010000 'зажигаем третье число
Select Case N3
Case 0 : Portb = &B11000000
Case 1 : Portb = &B11111001
Case 2 : Portb = &B10100100
Case 3 : Portb = &B10110000
Case 4 : Portb = &B10011001
Case 5 : Portb = &B10010010
Case 6 : Portb = &B10000010
Case 7 : Portb = &B11111000
Case 8 : Portb = &B10000000
Case 9 : Portb = &B10010000
End Select
End If
If S > 3 Then
S = 1
End If
Return

Код очень полезный. Не так давно сам искал нечто подобное. Для зажигания светодиодов он, несомнено, подойдёт, а вот как его совместить с динамической индикацией? Проблема то, как раз в сбое оной при применении ЦИКЛОВ в обработчике.