Jestem bardzo początkujący w programowaniu. Natrafiłem na następujący problem i nijak nie mogę go rozgryźć:/
Programik ma za zadanie wyświetlić na podwójnym wyświetlaczu LED (wyświetlanie multipleksowane) wartość zmiennej. Ale od początku: W pętli głównej chcę przypisywać zmiennej A jakieś wartości (dodawać i odejmować przez naciśnięcie odpowiedniego przycisku). Samo wyświetlanie ma się realizować w przerwaniu od Timera0. Programik niby działa ale....
Załóżmy że wyświetla się wartość 17 (jedynka na pierwszym wyświetlaczu od zmiennej B wyświetla się zawsze, mogę tylko zmieniać drugą liczbę od zmiennej A). Przy naciśnięciu S1 - dodaj do zmiennej - wyświetlacz pokazuje mi na pół sekundy DWA ZERA, po czym przechodzi do wyświetlenia liczby 18. Analogicznie przy odejmowaniu - przez pół sekundy dwa zera i potem "normalna" wartość 16. Jak obejść ten problem dwóch zer?? Zmniejszenie w odpowiedniej pętli obsłui przycisku opóźnienia z 500 ms nie pomaga.
Próbowałem analizować kod, wg mnie przy naciśnięciu przycisku zeruje się zmienna lokalna "cyfra" w procedurze "pobierz". Dlaczego?
A może ktoś ma inny pomysł na realizację obsługi multipleksowania wyświetlacza LED w tle programu głównego?
Kod: Zaznacz cały
$regfile = "m8def.dat"
$crystal = 6000000
'*************** KONFIGURACJE
Config Portd = Output
Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.3 = Output
Config Pinb.4 = Output
Config Timer0 = Timer , Prescale = 256
Set Portb.0
Set Portb.1
'*************** ALIASY
S1 Alias Pinb.0
S2 Alias Pinb.1
W1 Alias Portb.3
W2 Alias Portb.4
'*************** ZMIENNE
Dim A As Byte 'przechowuje wartosc do wyswietlenia na 1 wyswietlaczu
Dim B As Byte 'przechowuje wartosc do wyswietlenia na 2 wyswietlaczu
Dim Nrwys As Byte 'numer wyswietlacza do wlaczenia
Dim Wart As Byte 'wartosc do wyswietlenia
Dim Wartbcd As Byte 'wartosc do wyswietlenia w BCD
'*************** DEKLARACJE
Declare Sub Pobierz(byval Cyfra As Byte)
'*************** PROGRAM
On Timer0 Multi
Enable Interrupts
Enable Timer0
Load Timer0 = 255
Do
If S1 = 0 Then ' jesli nacisniety S1
Waitms 25 ' eliminacja drgan
If S1 = 0 Then
Incr Wart ' dodaj 1 do zmiennej Wart
Waitms 500 ' czekaj 500 ms
End If
If Wart = 9 Then ' jesli Wart = 9
Wart = 0 ' to zeruj zmienna Wart
End If
End If
If S2 = 0 Then ' jesli nacisniety S2
Waitms 25 ' eliminacja drgan
If S2 = 0 Then
Decr Wart ' odejmij 1 od zmiennej Wart
Waitms 500 ' czekaj 500 ms
End If
If Wart = 0 Then ' jesli Wart = 0
Wart = 9 ' to przypisz jej 9
End If
End If
A = Wart
B = 1 ' przypisanie zmiennym A i B wartosci do wyswietlenia
Loop
End
Multi: ' podprogram obslugi przerwania
Load Timer0 = 255
Set W1
Set W2 'wygaszenie wyswietlaczy
Select Case Nrwys
Case 0:
Call Pobierz(b) 'wywolanie procedury pobierajacej ze zmiennej A
Reset W1 'wlaczenie anody W2 (prawy)
Case 1:
Call Pobierz(a) 'wywolanie procedury pobierajacej ze zmiennej B
Reset W2 'wlaczenie anody W1 (lewy)
End Select
Incr Nrwys
If Nrwys = 2 Then
Nrwys = 0
End If
Return
Sub Pobierz(byval Cyfra As Byte) 'procedura pobierajaca i wyswietlajaca wartosc znaku
If Cyfra < 10 Then ' jesli pobierana cyfra jest mniejsza niz 10
Portd = Lookup(cyfra , Kody7seg) ' to pobierz wartosc PortuD z tablicy i wyswietl go
Else
Portd = 0 'wygaszenie wyswietlacza
End If
End Sub
Kody7seg:
Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110 , ' 0, 1, 2, 3, 4
Data &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111 ' 5, 6, 7, 8, 9