Cześć
Chciałem prosić kogoś o wskazówkę jak poradzić sobie z problemem wyświetlania wartości "Wartosc2" poniższego kodu.
Mój problem polega na tym że w momencie naciśnięcia przycisku ( w programie to Up, Dwn ) gdy na wyświetlaczach jest np 1.1 wyświetlacze "resetują" się i wskazują wartość 00 po zwolnieniu przycisku wyświetlona zostaje poprawnie kolejna wartość zliczona. W jaki sposób wyeliminować to znikanie poprawnej wartości w chwili trzymania przycisku?
Z góry dziękuję Michał
Chciałem prosić kogoś o wskazówkę jak poradzić sobie z problemem wyświetlania wartości "Wartosc2" poniższego kodu.
Mój problem polega na tym że w momencie naciśnięcia przycisku ( w programie to Up, Dwn ) gdy na wyświetlaczach jest np 1.1 wyświetlacze "resetują" się i wskazują wartość 00 po zwolnieniu przycisku wyświetlona zostaje poprawnie kolejna wartość zliczona. W jaki sposób wyeliminować to znikanie poprawnej wartości w chwili trzymania przycisku?
Z góry dziękuję Michał
'Program sterujący 2 wyświetlaczami 7-segmentowym LED
'Napisany by parklinson
'Wykorzystano fragmenty z książki "Programowanie mikrokontrolerów AVR w języku BASCOM".
$regfile = "m16def.dat" 'informuje kompilator o pliku
'dyrektyw mikrokontrolera
$crystal = 16000000 'informuje kompilator
'o częstotliwości oscylatora
'taktującego mikrokontroler
Config Portc = Output
Config Pinb.0 = Output '
Config Pinb.1 = Output
Config Pinb.2 = Input
Config Pinb.3 = Input
Config Timer0 = Timer , Prescale = 256 'konfiguracja Timer0 jako
'timer z podziałem
'preskalera przez 256
On Timer0 Mult_wysw 'przerwanie od przepełnienia
'Timer0‚ skok nastąpi do
'podprogramu Mult_wysw
Dim A As Byte , B As Byte 'definicje zmiennych A, B,
'przechowywana wartość do
'wyświetlenia
Dim Nr_wysw As Byte 'zmienna określająca numer
'zapalonego wyświetlacza
Dim Kr1 As Bit , Kr2 As Bit 'zmienne bitowe sterujące
'kropkami
W1 Alias Portb.0 'przypisanie linii PB0 nazwy W1
W2 Alias Portb.1 'przypisanie linii PB1 nazwy W2
Declare Sub Pobr_znaku(cyfra As Byte) 'deklaracja procedury
'pobierającej kod cyfry do
'wyświetlenia z tablicy
Declare Sub Liczba
Dim Wartosc2 As Byte
Dim Wart As Byte
Dim Wartosc As Byte
Up Alias Pinb.2
Dwn Alias Pinb.3
Set Portb.2
Set Portb.3
A = 0
B = 0
Kropka Alias Portc.7 'przypisanie bitowi 7 rejestru
'PORTD nazwy Kropka
Enable Interrupts 'odblokowanie globalnego
'systemu przerwań
Enable Timer0 'odblokowanie przerwania od
'przepełnienia Timer0
Load Timer0 , 150 'załadowanie do licznika
'wartości początkowej
Do 'początek pętli nieskończonej
If Up = 0 Then
Waitms 25
If Up = 0 Then
Wartosc = Wartosc + 10
Call Liczba
Waitms 150
End If
End If
If Wartosc > 0 Then
If Dwn = 0 Then
Waitms 25
If Dwn = 0 Then
Wartosc = Wartosc - 1
Call Liczba
Waitms 150
Else
Wartosc = 0
End If
End If
End If
Loop 'koniec pętli nieskończonej
End 'koniec programu
Sub Liczba
If Wartosc > 99 Then
Wartosc2 = Wartosc \ 10
Else
Wartosc2 = Wartosc
End If
Wart = Wartosc2
Wart = Makebcd(wartosc2) 'zamiana wartości zmiennej
'Wart na wartość zapisaną
'w kodzie BCD
B = Wart And &B00001111 'wyodrębnienie (przez
'maskowanie) i wyświetlenie
'pierwszej cyfry zapisanej
'w zmiennej Wart (cyfra 5)
Shift Wart , Right , 4 'przesunięcie wartości
'drugiej cyfry w zmiennej
'Wart na pozycje czterech
'mniej znaczących bitów
A = Wart 'wyświetlenie na
'wyświetlaczu 2 cyfry 3
End Sub
Sub Pobr_znaku(cyfra As Byte) 'definicja procedury
'Pobr_znaku
If Cyfra < 10 Then 'jeżeli wartość otrzymanej do
'wyświetlenia cyfry < od 10,
Portc = Lookup(cyfra , Kody7seg ) 'to wpisanie do portu D
'wartość kodu z tablicy
'stałych Kody7seg
Else 'w przeciwnym razie
Portc = 0 'wpisanie do portu D wartości
'0 która wygasza wyświetlacz
'Reset Kropka
End If 'koniec warunku If...Then
End Sub 'koniec procedury
Mult_wysw: 'podprogramu obsługi
'przerwania od przepełnienia
'Timer0 w którym odbywa się
'multipleksowanie
Load Timer0 , 150 'załadowanie do licznika
'wartości początkowej
Set W1 'wygaszenie wyświetlacza 1
Set W2 'wygaszenie wyświetlacza 2
Select Case Nr_wysw 'w zależności od wartości
'Nr_wysw, wykonaj:
Case 0: 'gdy Nr_wysw = 0, to
Call Pobr_znaku(a) 'wywołanie procedury
'pobierającej z tablicy kod
'znaku dla wartości A
If Wartosc > 10 Then
Kropka = 0
If Wartosc > 99 Then
Set Kropka
End If
End If
Reset W1 'włączenie wyświetlacza 1
Case 1: 'gdy Nr_wysw = 1, to
Call Pobr_znaku(b) 'wywołanie procedury
'pobierającej z tablicy kod
'znaku dla wartości B
Reset W2 'włączenie wyświetlacza 2
End Select 'koniec instrukcji wyboru
Incr Nr_wysw 'zwiększenie o jeden wartości
'Nr_wysw
If Nr_wysw = 2 Then 'jeśli wartość Nr_wysw
'osiągnie 2, to
Nr_wysw = 0 'zeruj wartość Nr_wysw
End If
Return 'powrót z podprogramu
Kody7seg: 'tablica stałych Kody7seg
'przechowująca kody wyświetlanych
'cyfr
'Kody cyfr
Data &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001
Data &B10010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000
