a program na tą chwile wygląda tak:
- $regfile = "m328pdef.dat"
- $crystal = 8000000
- $hwstack = 64
- $swstack = 64
- $framesize = 128
- Config Portd = Output
- Config Portb.0 = Output
- Config Portb.1 = Output
- Config Portb.2 = Output
- Config Portb.3 = Output
- Config Pinc.0 = Input
- Config Pinc.1 = Input
- Config Pinc.2 = Input
- Portc.0 = 1
- Portc.1 = 1
- Portc.2 = 1
- Portb.0 = 0
- Portb.1 = 0
- Portb.2 = 0
- Portb.3 = 0
- Portd = 255
- W1 Alias Portb.0
- W2 Alias Portb.1
- W3 Alias Portb.2
- W4 Alias Portb.3
- Prz1 Alias Pinc.0
- Prz2 Alias Pinc.1
- Enter Alias Pinc.2
- Segmenty Alias Portd
- Declare Sub Dec2bcd(byval Liczba As Byte , Byval Pozycja_wysw As Byte , Byref Tab() As Byte)
- Dim s1 as Byte
- Dim m1 as byte
- Dim Sekundy As Byte
- Dim Minuty as byte
- Dim Wyswietlacz As Byte
- Dim Tablica(4) As Byte
- Dim Kr1 as Bit
- Dim Kr2 as Bit
- Dim Kr3 as Bit
- Dim Kr4 as Bit
- Dim f_Odej as Bit
- Dim f_Dodaj as Bit
- Dim Startuj as bit
- dim 1_sek as Word
- Dim Menu as Byte
- Dim 8msek as Byte
- Dim f_timer2 as bit
- Config Timer0 = Timer , Prescale = 256
- Config TIMER2 = Timer , Prescale = 256
- On Ovf0 Przerwanie
- On Timer2 Odmierz_1s
- Load Timer0 = 65
- Load Timer2 = 250
- Enable Ovf0
- Enable Timer2
- Enable Interrupts
- s1 = 0
- m1 = 0
- Sekundy = 0
- Startuj = 0
- Menu = 1
- 8msek = 0
- Stop timer2
- Do
- Select Case Menu
- Case 1:
- If f_Dodaj = 0 Then
- if Prz1 = 0 then ' Jeśli przycisk wciśnięty, czekaj 15ms(drgania styku) sprawdz ponownie przycisk, jeśli przyciśnięty to:
- waitms 15
- If Prz1 = 0 Then
- s1 = s1 + 1 ' zwiększ o 1 zmienną s1
- gosub Wyswietl
- if s1 = 60 Then ' jeśli zmienna s1 dobije do 60 to
- m1 = m1 + 1 ' zwiększ o 1 zmienną m1
- s1 = 0 ' wyzeruj zmienną s1
- gosub Wyswietl ' przejdz do podprogramu, by przekazać zmienne s1 i m1 do zmiennych Sekundy i Minuty, a następnie je wyświetlić
- end if
- waitms 30 ' opuźnienie 30ms przycisku
- end if
- End if
- End if
- if f_Odej = 0 then ' flaga pomocnicza, przy wartości zmiennych s1 = 0 i m1 = 0, wyłącza obsługe przycisku, uniemożliwiając dalsze odejmowanie
- if Prz2 = 0 then ' jeśli wcisznięty
- waitms 15 ' drganie styków
- If Prz2 = 0 Then ' ponownie jeśli wciśnięty to:
- s1 = s1 - 1 ' zmniejsz zmienną s1 o 1
- gosub Wyswietl ' idz to wyświetlić
- If m1 > 0 Then
- ' jeśli wartość minut jest większa niż 0 a sekund równa się 0 to:
- If s1 = 0 Then
- m1 = m1 - 1 ' zmniejsz minuty o 1
- s1 = 60 ' a sekundy ustaw na 60
- end if
- waitms 30 ' opuźnienie przycisku
- end if
- end if
- End if
- end if
- if Enter = 0 Then ' jeśli przycisk enter przyciśnięty to:
- waitms 15 ' drganie styków
- if Enter = 0 Then ' jeśli dalej wciśnięty to
- Incr Menu ' zwiększ menu o 1 przechodząc do następnej funkcji menu z odliczaniem i bez obsługi przycisków
- Bitwait Enter , Set ' ale poczekaj zanim powróci stan wysoki
- end if
- End if
- If m1 > 0 Then ' zapalanie kropki gdy min większe od 0
- Set Kr2
- else
- Reset Kr2
- End if
- If m1 = 0 then ' jeśli minuty są równe 0 i sekundy też 0 to:
- If s1 = 0 Then
- f_Odej = 1
- ' przestaw flagę od przycisku odejmowania co by go wyłączyć, albo nie jeśli główny warunek nie zostanie spełniony
- else
- f_Odej = 0
- End if
- end if
- If m1 = 15 then ' jeśli minuty mają wartość 15 i sekundy 0 to: (ustawiłem na 15, bo przy testowaniu nie chciało mi się czekać do 30)
- If s1 = 0 then
- s1 = 0 ' zeruj minuty i sekundy
- m1 = 0 ' idz to wyświetlić
- gosub Wyswietl
- End if
- End if
- Case 2: ' następna fukncja menu uruchamiana przyciskiem enter, odliczanie w dół bez już obsługi przycisków plus i minus
- If f_timer2 = 0 then ' flaga pomocnicza zezwalająca na start timer2
- Start timer2
- else
- Stop Timer2
- End if
- If m1 = 0 then ' jeśli sekundy i minuty dobiją do zera to:
- If s1 = 0 Then
- set f_timer2 ' resetowanie flagi i stop timer2
- End if
- end if
- If m1 > 0 Then 'zapalanie kropki gdy min większe od 0
- Set Kr2
- else
- Reset Kr2
- End if
- if Enter = 0 Then ' jeśli przycisk enter przyciśnięty to:
- waitms 15 ' drganie styków
- if Enter = 0 Then ' jeśli dalej wciśnięty to
- toggle f_timer2 ' pauza lub wznowienie odliczania
- Bitwait Enter , Set ' ale poczekaj zanim powróci stan wysoki
- end if
- End if
- End Select
- Loop
- End 'end program
- '**************************************************************
- Wyswietl: ' podprogram wyświetlania, zmienne s1 i m1 przekazywane do zmiennych Sekundy i Minuty, a następnie multipleksowane na wyś. LED
- Sekundy = s1
- Dec2bcd Sekundy , 3 , Tablica(1)
- Minuty = m1
- Dec2bcd Minuty , 1 , Tablica(1)
- return
- Odmierz_1s: ' podprogram obliczania 1 sek
- Load Timer2 = 250
- Incr 8msek
- if 8msek = 125 then
- 8msek = 0
- s1 = s1 - 1
- gosub Wyswietl
- If m1 > 0 Then
- If s1 = 0 Then
- m1 = m1 - 1
- s1 = 59
- end if
- end if
- end if
- Return
- Przerwanie:
- Load Timer0 , 65
- Incr Wyswietlacz
- If Wyswietlacz = 5 Then
- Wyswietlacz = 1
- End If
- Select Case Wyswietlacz
- Case 1:
- W4 = 1
- Segmenty = Lookup(tablica(1) , Kody7seg)
- Portd.7 = Kr1
- W1 = 0
- Case 2:
- W1 = 1
- Segmenty = Lookup(tablica(2) , Kody7seg)
- Portd.7 = Kr2
- W2 = 0
- Case 3:
- W2 = 1
- Segmenty = Lookup(tablica(3) , Kody7seg)
- Portd.7 = Kr3
- W3 = 0
- Case 4:
- W3 = 1
- Segmenty = Lookup(tablica(4) , Kody7seg)
- Portd.7 = Kr4
- W4 = 0
- End Select
- Return
- '************************************************************
- Sub Dec2bcd(byval Liczba As Byte , Byval Pozycja_wysw As Byte , Byref Tab() As Byte)
- Local Pomocnicza1 As Byte
- Local Pomocnicza2 As Byte
- Pomocnicza1 = Makebcd(liczba)
- Pomocnicza2 = Pomocnicza1 And &B00001111
- Tablica(pozycja_wysw + 1) = Pomocnicza2
- Shift Pomocnicza1 , Right , 4
- Pomocnicza2 = Pomocnicza1 And &B00001111
- Tablica(pozycja_wysw) = Pomocnicza2
- 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
- ' dp , g , f , e , d , c , b , a
docelowo w kodzie będę musiał zmienić wykrywanie przycisków z 0 na 1 gdyż chcę użyć dotykowych przycisków atmela at42 1010 a tam stanem aktywnym jest 1. Bawiłem się też timerem i jak ustawiłem preskaler na 1024 i wartoś początkową timera na 77 to wyświetlacze mrugają.
Co dziwne nie rozumiem pewnej rzeczy czym się różni zapis
- Load Timer0 , 65
- Load Timer0 = 65
Następny problem to gdy odlicza sekundy w dół na wyświetlaczu widzę 02 -> 01 -> 00 -> 58 ->57 gdzieś ginie 59
Noi na koniec doszedłem do wniosku po twojej sugestii, że przerobie program tak by jednym przyciskiem(minusem) zmieniać minuty a drugi (plusem) zmieniać sekundy, bo tak jak mówisz w poprzedniej wersji by ustawić na 20min strasznie długo trzeba było trzymać przycisk.
