OK, witam ponownie
po braku odpowiedzi, wywnioskowałem iż nikt nie posiada żadnego prostszego i sprawdzonego sposobu na formatowanie liczb w postaci zmiennych typu WORD i BYTE.
Zgodnie z tym założeniem, napisałem sobie programik, z zegarkiem i kilkoma menu. Z założenia powinno wyglądać to tak:
timer przepełnia się dokładnie co 1s, wtedy zmienna SEK jest zwiększana od 0 do 59 (i tak dalej jak w zegarku).
W zależności od ilości kliknięć portem B.1 pojawiają się różne menu (wyświetlanie czasu i jakieś durne teksty, dla ćwiczenia).
Czas formatowany jest podczas wywołania etykiety
Et_wyswietlanieczasu, gdzie powinien czas formatować się na
00 : 00 : 00.
Wszystko z początku działa, ale po upłynięciu pewnego czasu (różnie bywa, 1 minuta, 3 minuty ,5 minut) IC "myli" się w formatowaniu i w miejscu czasu pojawia się
00 : 00 : 000. Zupełnie jakby nie zdążył z jakimiś obliczeniami... .
Proszę o pomoc, załączam kod programiku, uwaga roi się od etykiet.
'----------------------------------------------------------------------------
'........OPIS PROGRAMU.......................................................
'----------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 8000000
'----------------------------------------------------------------------------
'........LCD.................................................................
'----------------------------------------------------------------------------
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
'----------------------------------------------------------------------------
'........DEKLARACJE..........................................................
'----------------------------------------------------------------------------
'porty
Config Pinb.1 = Input
Config Pinb.2 = Input
Portb.1 = 1
Portb.2 = 1
'timery
Config Timer1 = Timer , Prescale = 256
Enable Timer1
Enable Interrupts
On Timer1 Et_przerwanie
'zmienne
Dim Migacz As Bit
Dim Godz As Byte
Dim Minuta As Byte
Dim Sek As Byte
Dim Stanb1 As Byte
Dim Stanb1_help As Bit
Dim Stanb2 As Byte
Dim Stanb2_help As Bit
Dim Iloscprzerwan As Word
'----------------------------------------------------------------------------
'........ZAŁOŻENIA WSTĘPNE...................................................
'----------------------------------------------------------------------------
Cls
Migacz = 0
Stanb1_help = 0
Stanb2_help = 0
Stanb1 = 1
Cursor Off
'----------------------------------------------------------------------------
'........PĘTLA GŁÓWNA........................................................
'----------------------------------------------------------------------------
Do
Gosub Et_stan_pinb1
Gosub Et_wybormenu
Locate 1 , 2
Lcd Iloscprzerwan
Loop
End
'----------------------------------------------------------------------------
'........ETYKIETY............................................................
'----------------------------------------------------------------------------
Et_przerwanie:
Timer1 = 34286
Iloscprzerwan = Iloscprzerwan + 1
Toggle Migacz
If Sek < 59 Then
Sek = Sek + 1
Else
Sek = 0
If Minuta < 59 Then
Minuta = Minuta + 1
Else
Minuta = 0
If Godz < 23 Then
Godz = Godz + 1
Else
Godz = 0
End If
End If
End If
Return
'............................................................................
Et_wyswietlanieczasu:
'......ustawienie czasu impulsu na 1 sekundę
'zmienne do ustawienia
'Godz - godziny od 00 do 23
'Minuta - minuty od 00 do 59
'Sek - sekundy od 00 do 59
'......uruchamianie mrugania dwukropków
'( If Migacz = 0 Then
Locate 2 , 6
Lcd ":"
Locate 2 , 11
Lcd ":"
Else
Locate 2 , 6
Lcd " "
Locate 2 , 11
Lcd " "
End If
')
'......umiejscowienie godzin w odpowiednim miejscu
Locate 2 , 3
If Godz < 10 Then
Lcd "0" ; Godz
Else
Lcd Godz
End If
'......umiejscowienie minut w odpowiednim miejscu
Locate 2 , 8
If Minuta < 10 Then
Lcd "0" ; Minuta
Else
Lcd Minuta
End If
'......umiejscowienie sekund w odpowiednim miejscu
Locate 2 , 13
If Sek < 10 Then
Lcd "0" ; Sek
Else
Lcd Sek
End If
Return
'............................................................................
Et_stan_pinb1:
If Stanb1_help = 1 Then
If Pinb.1 = 0 Then
Cls
If Stanb1 > 3 Then
Stanb1 = 1
Stanb1_help = 0
Else
Stanb1 = Stanb1 + 1
Stanb1_help = 0
End If
End If
Else
If Pinb.1 = 1 Then
Stanb1_help = 1
End If
End If
Return
'............................................................................
Et_stan_pinb2:
If Stanb2_help = 1 Then
If Pinb.2 = 0 Then
Stanb2 = Stanb2 + 1
Stanb2_help = 0
End If
Else
If Pinb.2 = 1 Then
Stanb2_help = 1
End If
End If
Return
'............................................................................
Et_menu_1:
Gosub Et_wyswietlanieczasu
Return
'............................................................................
Et_menu_2:
Locate 1 , 2
Lcd "Zmień czas"
Locate 2 , 2
Lcd "godzina: "
Return
'............................................................................
Et_menu_3:
Locate 1 , 2
Lcd "Zmień czas"
Locate 2 , 2
Lcd "minuta: "
Return
'............................................................................
Et_menu_4:
Locate 1 , 2
Lcd "Uśmiechnij się"
Locate 2 , 2
Lcd "Jutro do pracy"
Return
'............................................................................
Et_wybormenu:
Select Case Stanb1
Case 1 : Gosub Et_menu_1
Case 2 : Gosub Et_menu_2
Case 3 : Gosub Et_menu_3
Case 4 : Gosub Et_menu_4
End Select
Return
'----------------------------------------------------------------------------
'.......KONIEC PROGRAMU.....................................................
'----------------------------------------------------------------------------
Bardzo proszę o pomoc, siedzę już nad problemem tydzień.
PS.
wczoraj wydawało mi się że zatłukłem Atmegę8 (przy zmianie fusebit na zewnętrzny Xtal,) a okazało się że nóżka od Xtal1 była nie przylutowana, w ogóle

. A najśmieszniejsza rzecz : na LCD pojawiały się znaki z programu, ale w tempie 1 na 5 s.
Pozdrawiam, Tomek