Skocz do zawartości

BASCOM + Atmega 8 = problem w obsłudze wyświetlacza LED


Artizzz

Pomocna odpowiedź

Witam!

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?

$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
Link do komentarza
Share on other sites

Anonim
Ten temat został zamknięty.
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.