Dzięki kolego za kod, widzę że jest to kod obsługi jakiegoś zegarka, bardzo podobny kod znajduje się u M.Wiązania.
'Program multipleksowego sterowania czterema wyświetlaczami
'7-segmentowymi LED poprzez dekoder 4543
'cyfra załadowana do A będzie wyświetlana na wyświetlaczu 1
'cyfra załadowana do B będzie wyświetlana na wyświetlaczu 2
'cyfra załadowana do C będzie wyświetlana na wyświetlaczu 3
'cyfra załadowana do D będzie wyświetlana na wyświetlaczu 4
'zmienna Kr1 steruje kropką wyświetlacza 1
'zmienna Kr2 steruje kropką wyświetlacza 2
'zmienna Kr3 steruje kropką wyświetlacza 3
'zmienna Kr4 steruje kropką wyświetlacza 4
'częstotliwość sterowania cyfr wynosi 250 Hz
'czyli częstotliwość odświeżania 4 wyświetlaczy
'wynosi ok. 250/4 = 62 Hz
$regfile = "m8def.dat" 'informuje kompilator o pliku
'dyrektyw mikrokontrolera
$crystal = 8000000 'informuje kompilator
'o częstotliwości oscylatora
'taktującego mikrokontroler
Config Pind.0 = Output 'linia PD0 jako wyjściowa
Config Pind.1 = Output 'linia PD1 jako wyjściowa
Config Pind.2 = Output 'linia PD2 jako wyjściowa
Config Pind.3 = Output 'linia PD3 jako wyjściowa
Config Pind.7 = Output 'linia PD7 jako wyjściowa
Config Pinb.0 = Output 'linia PB0 jako wyjściowa
Config Pinb.1 = Output 'linia PB1 jako wyjściowa
Config Pinb.2 = Output 'linia PB2 jako wyjściowa
Config Pinb.3 = Output 'linia PB3 jako wyjściowa
Config Timer0 = Timer , Prescale = 256
'konfiguracja Timer0 jako timer
'z podziałem preskalera przez
'256
Declare Sub Zapis_cyfry(cyfra As Byte)
'deklaracja procedury
'zapisującej cyfrę do dekodera
'4543
On Timer0 Mult_wysw 'przerwanie od przepełnienia
'Timer0, skok nastąpi do
'podprogramu Mult_wysw
Dim A As Byte , B As Byte , C As Byte , D As Byte 'definicje zmiennych A, B, C, D
'w których będą przechowywane
'wartości do wyświetlenia
Dim Nr_wysw As Byte 'zmienna określająca numer
'zapalonego wyświetlacza
Dim Kr1 As Bit , Kr2 As Bit , Kr3 As Bit , Kr4 As Bit 'zmienne bitowe sterujące
'kropkami wyświetlaczy
Dim I As Byte 'zmienna, której wartość będzie
'wyświetlana na wyświetlaczach
W1 Alias Portb.0 'przypisanie linii PB0 nazwy W1
W2 Alias Portb.1 'przypisanie linii PB1 nazwy W2
W3 Alias Portb.2 'przypisanie linii PB2 nazwy W3
W4 Alias Portb.3 'przypisanie linii PB3 nazwy W4
Kropki Alias Portd.7 'przypisanie linii PD7 nazwy
'Kropki
Enable Interrupts 'odblokowanie globalnego systemu
'przerwań
Enable Timer0 'odblokowanie przerwania od
'przepełnienia Timer0
Load Timer0 , 125 'załadowanie do licznika
'wartości początkowej 131, bo
'256 - 125 = 131
Set Kr1 'wyłączenie kropki
'wyświetlacza 1
Set Kr2 'wyłączenie kropki
'wyświetlacza 2
Set Kr3 'wyłączenie kropki
'wyświetlacza 3
Set Kr4 'wyłączenie kropki
'wyświetlacza 4
Do 'początek nieskończonej pętli
A = I 'wyświetlenie na wyświetlaczu 1
'wartości zmiennej I
B = I 'wyświetlenie na wyświetlaczu 2
'wartości zmiennej I
C = I 'wyświetlenie na wyświetlaczu 3
'wartości zmiennej I
D = I 'wyświetlenie na wyświetlaczu 4
'wartości zmiennej I
Incr I 'zwiększenie o 1 wartości
'zmiennej I
If I = 11 Then 'jeśli wartość I osiągnie 11, to
I = 0 'wyzerowanie tej zmiennej
End If
Toggle Kr1 'zmiana na przeciwny stanu bitu
'sterującego kropką
'wyświetlacza 1
Toggle Kr3 'zmiana na przeciwny stanu bitu
'sterującego kropką
'wyświetlacza 3
Waitms 500 'opóźnienie 500 ms
Loop 'koniec pętli nieskończonej
End 'koniec programu
Sub Zapis_cyfry(cyfra As Byte) 'definicja procedury zapisującej
'cyfrę do układu 4543
Cyfra = Cyfra And &B00001111 'wyzerowanie zmiennej Cyfra 4
'najbardziej znaczących bitów
Portd = Portd And &B11110000 'zamaskowanie 4 bardziej
'znaczących bitów i wyzerowanie
'4 mniej znaczących bitów
'rejestru PORTD
Portd = Portd Or Cyfra 'wystawienie na port D wartości
'zmiennej Cyfra bez naruszenia 4
'bardziej znaczących bitów
'rejestru PORTD
End Sub 'koniec procedury
Mult_wysw: 'podprogram przerwania od
'przepełnienia Timer0
Load Timer0 , 125 'załadowanie do licznika
'wartości początkowej
Set W1 'wygaszenie wyświetlacza 1
Set W2 'wygaszenie wyświetlacza 2
Set W3 'wygaszenie wyświetlacza 3
Set W4 'wygaszenie wyświetlacza 4
Select Case Nr_wysw 'w zależności od wartości
'Nr_wysw
'wykonaj:
Case 0: 'gdy Nr_wysw = 0 to
Call Zapis_cyfry(a) 'wywołanie procedury zapisującej
'wartość zmiennej A do układu
'4543
Kropki = Kr1 'wpisanie na linie PD7
'sterującej kropką wartości bitu
'Kr1 dla wyświetlacza 1
Reset W1 'włączenie wyświetlacza 1
Case 1: 'gdy Nr_wysw = 1 to
Call Zapis_cyfry(b) 'wywołanie procedury zapisującej
'wartość zmiennej B do układu
'4543
Kropki = Kr2 'wpisanie na linie PD7
'sterującej kropką wartości bitu
'Kr2 dla wyświetlacza 2
Reset W2 'włączenie wyświetlacza 2
Case 2: 'gdy Nr_wysw = 2 to
Call Zapis_cyfry(c) 'wywołanie procedury zapisującej
'wartość zmiennej C do układu
'4543
Kropki = Kr3 'wpisanie na linie PD7
'sterującej kropką wartości bitu
'Kr3 dla wyświetlacza 3
Reset W3 'włączenie wyświetlacza 3
Case 3: 'gdy Nr_wysw = 3 oraz
Call Zapis_cyfry(d) 'wywołanie procedury zapisującej
'wartość zmiennej D do układu
'4543
Kropki = Kr4 'wpisanie na linie PD7
'sterującej kropką wartości bitu
'Kr4 dla wyświetlacza 4
Reset W4 'właczenie wyświetlacza 4
End Select 'koniec instrukcji wyboru
Incr Nr_wysw 'zwiększenie o jeden wartość
'Nr_wysw
If Nr_wysw = 4 Then 'jeśli wartość Nr_wysw osiągnie
'4 to
Nr_wysw = 0 'zeruj wartość Nr_wysw
End If
Return 'powrót z podprogramu przerwania
Kody7seg: 'tablica stałych Kody7seg
'przechowująca kody
'wyświetlanych cyfr
'Kody cyfr
Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110,
Data &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111
Właśnie nad tym kodem pracuję, problem polega na tym, że po wrzuceniu go do procka mam cztery zera, a wg kodu powinny się te cyfry zmieniać, nie wiem gdzie jest problem.
Po dopisaniu w pętli głównej komendy zmiany stanu portu sterującego minusem, minus mruga w takt pętli, a cyfry się nie zmieniają...
Dodano po 45 [minuty]: Stworzyłem takie coś:
$regfile = "m8def.dat"
$crystal = 8000000
Config Pind.0 = Output
Config Pind.1 = Output
Config Pind.2 = Output
Config Pind.3 = Output
Config Pind.6 = Output
Config Pind.7 = Output
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output
Config Timer0 = Timer , Prescale = 256
Declare Sub Zapis_cyfry(cyfra As Byte)
On Timer0 Mult_wysw
Dim A As Byte , B As Byte , C As Byte , D As Byte , E As Byte
Dim Nr_wysw As Byte
Dim Kr1 As Bit , Kr2 As Bit , Kr3 As Bit , Kr4 As Bit
Dim I As Byte
W1 Alias Portb.0
W2 Alias Portb.1
W3 Alias Portb.2
W4 Alias Portb.3
W5 Alias Portb.4
Minus Alias Portd.6
Kropki Alias Portd.7
Enable Interrupts
Enable Timer0
Load Timer0 , 125
Set Kr1
Set Kr2
Set Kr3
Set Kr4
Waitms 800
Do
A = I
B = I
C = I
D = I
E = I
Incr I
If I = 11 Then
I = 0
End If
Toggle Minus
Waitms 500
Loop
End
Sub Zapis_cyfry(cyfra As Byte)
Cyfra = Cyfra And &B00001111
Portd = Portd And &B11110000
Portd = Portd Or Cyfra
End Sub
Mult_wysw:
Load Timer0 , 125
Set W1
Set W2
Set W3
Set W4
Set W5
Select Case Nr_wysw
Case 0:
Call Zapis_cyfry(a)
Reset W1
Case 1:
Call Zapis_cyfry(b)
Reset W2
Case 2:
Call Zapis_cyfry(c)
Reset W3
Case 3:
Call Zapis_cyfry(d)
Reset W4
Case 4:
Call Zapis_cyfry(e)
Reset W5
End Select
Incr Nr_wysw
If Nr_wysw = 5 Then
Nr_wysw = 0
End If
Return
Kody7seg:
Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110,
Data &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111
Wg. mnie program powinien zmieniać cyfry, podczas gdy mi mruga led "minus" a ciągle wyświetlają mi się pięć zer. Gdzie jest błąd?? Bo już całkiem zaczynam się w tym gubić...