Witam,
Wgrałem program na ATmega168 i prawie wszystko śmiga tak jak chciałem pierwotnie, ale przy MENU (do ustawiania indywidualnych opcji) pojawia się problem, mianowicie I wiersz widać jasno, II już ciemniej, III ledwo co a IV nie widać w cale. Pulpit główny wyświetla się normalnie, reszta też. Co może być przyczyną?
Jak ustawić Fusebity w tym procesorze? Teraz mam ustawione tak jak w PS i program nie działa dobrze. Odświeżanie następuje co kilka sekund, tak jakby taktowanie było ustawione źle... Procesor pracuje na wew. oscylatorze (8MHz).
Pozdrawiam Paweł
Re: Problem z programem LCD 16x4
Prawdopodobnie masz gdzieś cls i zaraz po tym wpisywanie info na lcd. Jeśli masz tak w kolo to masz to co opisujesz.
Moja strona w powijakach
Fusebity
A co z Fusebitami? Są dobrze ustawione ? Pierwszy raz pracuje z tym procesorem i nie mam z nim żadnego doświadczenia...
Re: Problem z programem LCD 16x4
Fusy nie mają wpływu na wyświetlanie w takim stopniu. Albo pozwoliły by Ci na uruchomienie procesora, albo nie. Ale jeśli juz mam się wypowiedzieć na ich temat to jest ok.
Moja strona w powijakach
A co z wolnym odliczaniem?
Odświeżanie następuje co kilka sekund, tak jakby taktowanie było ustawione źle... Procesor pracuje na wew. oscylatorze (8MHz) i jeśi w kodzie jest jakaś komenda, która trwa np. 2s to czekam, czekam i nic się nie dzieje. Również odczyt z czujników temperatury jest odświeżany co kilka sekund czyli za wolno.
Re: Problem z programem LCD 16x4
Chodzi o coś innego. Do LCD znaki wpisywane są kolejno od najwyższej linii od pierwszego lewego pola (chyba że użyjesz komendy locate) znak po znaku i linia po linii. Jeśli w programie będzie zbyt często komenda cls przepleciona z komendami wpisywania znaków na wyświetlacz to najzwyczajniej wyświetlacz nie zdąży wpisać sobie wszystkiego na ekranik.
Efektem tego będzie właśnie takie wyświetlanie jak u Ciebie czyli od lewej znaki będą bardzo jasne a czym bliżej kńca lcd tym coraz ciemniej.
Zrób prosty test, napisz coś takiego:
Jeśli to prawidłowo zapisze Ci cały lcd to szukaj problemu który opisalem.
Moja strona w powijakach
Jeśli chodzi o LCD kolega
Jeśli chodzi o LCD kolega Matrix ma rację.Nie umieszczaj polecenia CLS w pętli głównej ponieważ jeśli raz na cykl procesora wyczyścisz LCD to wyświetlacz nie zdąży napisać treści a procek znów go wyczyści.W moim menu używam polecenia CLS dopiero w momencie spełnienia pewnych warunków.W moim przypadku jest to wyjście z menu.
Jeśli chodzi o wolne działanie programu to za to odpowiedzialny jest rezonator.Używając nowego Atmega162 sam się kiedyś zdziwiłem.Uruchomiłem układ na wewnętrznym oscylatorze i wpisując komendę Wait 1 (czekaj jedną sekundę) program czekał około 4 sekundy.Dopiero po zamontowaniu zewnętrznego kwarcu 16 MHz "program" zaczął pracować szybciej.
Domyślam się,że u Ciebie jest tych Wait trochę i podejrzewam,że stąd wynika wolna praca programu.
Grzegorz
Kwarc
Co powinienem zrobić jeśli porty XTAL1 i XTAL2 mam zajęte przez magistralę I2C do komunikacji z zegarkiem Ds1307 i nie mam gdzie podpiąć kwarcu?
Są może jakieś programowe "sztuczki" aby program działał szybciej?
Paweł
Re: Problem z programem LCD 16x4
Na pewno w programie masz naćpane waitów. Same fusy masz ustawione dobrze. Taktowanie ustawione na 8MHz i podział przez 8 wyłączony. Nie ma się czego czepiać jeśli chodzi o fuse bity.
Wyeliminuj waity i będzie ok.
Moja strona w powijakach
Eliminacja
Na co mam zamienić te komendy? Kod to 98% flash'a wiec trochę tego jest... ;-(
Re: Problem z programem LCD 16x4
Użyj timera. Wstaw kod, pokaż co co Ty tam nakombinowaleś?
Moja strona w powijakach
eliminacja
Wait wstrzymuje działanie programu na czas określony w poleceniu.W tym czasie procek może zrobić kupę innej roboty ale Ty mu tego nie umożliwiasz.Możesz np. wykorzystać Timery a w wolnym czasie procek może wykonywać inne czynności.Generalnie jak zaczynałem korzystałem z tego polecenia ale od dłuższego czasu w moich projektach nie ma ani jednego Wait.
Grzegorz
Program jest baaardzo długi,
Program jest baaardzo długi, wstawiam pętle głowną bez podprogramów:
Do
'-----------------------------------------------------------------------------
'obsługa przycisków i odczyty z RTC
'-----------------------------------------------------------------------------
Gosub Odczytdataiczas
If Menu = 0 And M = 0 Then
Menu = 1
End If
If Menu >= 1 And Plus = 0 And Podmenu = 0 And Opcja = 0 Then
Incr Menu
If Menu >= 7 Then : Menu = 0 : End If 'po przekręceniu się menu, wracamy do pulpitu
End If
If Menu >= 1 And Minus = 0 And Podmenu = 0 And Opcja = 0 Then
Decr Menu
If Menu >= 7 Then : Menu = 6 : End If 'po przekręceniu się menu, wracamy do pozycji ostatniej
End If
'-----------------------------------------------------------------------------
'Fragment służący obsłudze domyślnego pulpitu
'-----------------------------------------------------------------------------
If Menu = 0 Then
Gosub Odczyttemp 'odczyt temperatur
Gosub Konwertdata 'konwersja dnia i miesiąca na postać trzyliterową
Gosub Odczytnapiecia 'odczyt napięcia z ADC
Podmenu = 0 'wyzerowanie licznika podmenu, na wszelki wypadek
Cls
Locate 1 , 1
Lcd Godziny ; ":" ; Minuty ; " " ; Dzien_slownie ; " " ; Dzien ; " " ; Miesiac_slownie
Locate 2 , 1
Lcd "T1 " ; T1 ; Chr(4) ; " T2 " ; T2 ; Chr(4)
Locate 3 , 1
Lcd Chr(3) ; " " ; Tpow ; Chr(4) ; "AKU" ; Napiecie_ekran ; "V"
If Ustawdzwiek_kontr >= 1 Then
Locate 4 , 1
Lcd Chr(6) ; ")"
End If
If Tpow < 0 Then
Locate 4 , 3
Lcd "*"
End If
If Starlight >= 1 Then
Locate 4 , 4
Lcd "SL"
End If
If Sygnalizacjaled_kontr >= 1 Then
Locate 4 , 6
Lcd Chr(0)
End If
Locate 4 , 8
Lcd "1 2 3 4 5"
Locate 4 , 7
If Ok1 = 0 Then : Lcd Chr(7) : Else : Lcd "F" : End If
Locate 4 , 9
If Ok2 = 0 Then : Lcd Chr(7) : Else : Lcd "F" : End If
Locate 4 , 11
If Ok3 = 0 Then : Lcd Chr(7) : Else : Lcd "F" : End If
Locate 4 , 13
If Ok4 = 0 Then : Lcd Chr(7) : Else : Lcd "F" : End If
Locate 4 , 15
If Ok5 = 0 Then : Lcd Chr(7) : Else : Lcd "F" : End If
Gosub Kontrola_alarmow 'sprawdzenie, czy nie trzeba załączyć alarmu wywołanego zwarciem transoptora
' obliczenie procentowej jasności podświetlenia lcd
If Starlight = 0 Then
Pwm_zaladowane = Pwm 'SL wyłączony, to wrzucaj zadeklarowaną ręcznie wartość
End If
If Starlight <> 0 Then 'po uruchomieniu SL
If Godziny >= 0 And Godziny <= 11 Then
Sl_pomocnicza = 4 * Godziny
Sl_pomocnicza = Sl_pomocnicza + 37
End If
If Godziny >= 12 And Godziny <= 23 Then 'wieczorem i w nocy obowiązuje drugi algorytm: ściemnający
Sl_pomocnicza = Godziny - 12
Sl_pomocnicza = Sl_pomocnicza * 4
Sl_pomocnicza = 85 - Sl_pomocnicza
End If
If Miesiac = 12 Or Miesiac = 1 Or Miesiac = 2 Then 'zimą działa modyfikacja
Pwm_zaladowane = Sl_pomocnicza - 4
End If
If Miesiac = 6 Or Miesiac = 7 Or Miesiac = 8 Then 'latem działa druga modyfikacja
Pwm_zaladowane = Sl_pomocnicza + 15
End If
If Miesiac = 3 Or Miesiac = 4 Or Miesiac = 5 Or Miesiac = 9 Or Miesiac = 10 Or Miesiac = 11 Then 'jesienią i wiosną bez modyfikacji
Pwm_zaladowane = Sl_pomocnicza
End If
End If
End If
'-----------------------------------------------------------------------------
'Fragment służący przejściu do podmenu nastaw czasu 1/6
'-----------------------------------------------------------------------------
If Menu = 1 And Podmenu = 0 Then
Cls
Locate 1 , 7
Lcd "MENU 1/6"
Locate 2 , 4
Lcd "USTAW DATE"
Locate 3 , 4
Lcd "I GODZINE"
Gosub Menu_czwartalinia
If M = 0 Then : Podmenu = 1 : Opcja = 0 : Waitms 500 : End If 'po wciśnięciu M przejdź do nastawy daty
End If
'-----------------------------------------------------------------------------
'Fragment obsługujący nastawę daty
'-----------------------------------------------------------------------------
If Menu = 1 And Podmenu = 1 Then
Latatmp = 2000 + Rok 'do wyświetlenia i wygodniejszego ustawiania
Cls
Locate 1 , 7
Lcd "DATA"
Locate 2 , 3
Lcd "DZIEN " ; Dzien
Locate 3 , 3
Lcd "MIESIAC " ; Miesiac
Locate 4 , 3
Lcd "ROK " ; Latatmp
If M = 0 Then : Incr Opcja : Waitms 500 : End If 'po wciśnięciu M ma migać kolejna pozycja
If Opcja >= 3 Then : Podmenu = 2 : Opcja = 0 : End If 'jak przejdziemy wszystkie pozycje migania, przejdź do nastawy czasu
'----------------------------nastawy dni
If Opcja = 0 Then 'miga dzień
Locate 2 , 13
Lcd " "
Waitms 150
Locate 2 , 13
Lcd Dzien
Waitms 150
If Miesiac = 2 Then 'wyznaczenie zakresu ruchu dni
Dnimax = 28
End If
If Miesiac = 4 Or Miesiac = 6 Or Miesiac = 9 Or Miesiac = 11 Then
Dnimax = 30
End If
If Miesiac = 1 Or Miesiac = 3 Or Miesiac = 5 Or Miesiac = 7 Or Miesiac = 8 Or Miesiac = 10 Or Miesiac = 12 Then
Dnimax = 31
End If
Latatmp = Rok Mod 4
If Latatmp = 0 And Miesiac = 2 Then 'jeżeli rok jest przestępny
Dnimax = 29
End If
If Plus = 0 Then
Incr Dzien
If Dzien > Dnimax Then
Dzien = 1
End If
End If
If Minus = 0 Then
Decr Dzien
If Dzien > Dnimax Then
Dzien = Dnimax
End If
End If
Gosub Zapisdataiczas
Gosub Odczytdataiczas
End If 'zamknięcie opcji 0
'----------------------------nastawy miesięcy
If Opcja = 1 Then 'miga miesiąc
Locate 3 , 13
Lcd " "
Waitms 150
Locate 3 , 13
Lcd Miesiac
Waitms 150
If Plus = 0 Then
Incr Miesiac
If Miesiac >= 13 Then
Miesiac = 1
End If
End If
If Minus = 0 Then
Decr Miesiac
If Miesiac >= 13 Then
Miesiac = 12
End If
End If
Gosub Zapisdataiczas
Gosub Odczytdataiczas
End If 'zamknięcie opcji 1
'----------------------------nastawy lat
If Opcja = 2 Then 'miga rok
Locate 4 , 12
Lcd " "
Waitms 150
Locate 4 , 12
Lcd Latatmp
Waitms 150
If Plus = 0 Then
Incr Latatmp
If Latatmp >= 2099 Then
Latatmp = 2012
End If
End If
If Minus = 0 Then
Decr Latatmp
If Latatmp <= 2011 Then
Latatmp = 2098
End If
End If
Rok = Latatmp - 2000
Gosub Zapisdataiczas
Gosub Odczytdataiczas
End If 'zamknięcie opcji 2
End If 'zamknięcie podmenu = 1
'-----------------------------------------------------------------------------
'Fragment obsługujący nastawę czasu
'-----------------------------------------------------------------------------
If Menu = 1 And Podmenu = 2 Then
Cls
Locate 1 , 7
Lcd "CZAS"
Locate 2 , 5
Lcd "GODZINA " ; Godziny
Locate 3 , 5
Lcd "MINUTA " ; Minuty
If M = 0 Then : Incr Opcja : Waitms 500 : End If 'po wciśnięciu M ma migać kolejna pozycja
If Opcja >= 2 Then : Podmenu = 0 : Opcja = 0 : Menu = 1 : End If 'jak przejdziemy wszystkie pozycje migania, przejdź do głównego menu tj. z napisem 1/8
'----------------------------nastawy godzin
If Opcja = 0 Then 'migają godziny
Locate 2 , 13
Lcd " "
Waitms 150
Locate 2 , 13
Lcd Godziny
Waitms 150
If Plus = 0 Then
Incr Godziny
If Godziny >= 25 Then
Godziny = 0
End If
End If
If Minus = 0 Then
Decr Godziny
If Godziny >= 25 Then
Godziny = 24
End If
End If
Gosub Zapisdataiczas
Gosub Odczytdataiczas
End If 'zamknięcie opcji 0
'----------------------------nastawy minut
If Opcja = 1 Then 'migają godziny
Locate 3 , 13
Lcd " "
Waitms 150
Locate 3 , 13
Lcd Minuty
Waitms 150
If Plus = 0 Then
Incr Minuty
If Minuty >= 60 Then
Minuty = 0
End If
End If
If Minus = 0 Then
Decr Minuty
If Minuty >= 60 Then
Minuty = 59
End If
End If
Gosub Zapisdataiczas
Gosub Odczytdataiczas
End If 'zamknięcie opcji 0
End If 'zamknięcie podmenu 2 i ogólnie, zamknięcie nastaw czasu
'-----------------------------------------------------------------------------
'przejście do menu nastaw jasności LCD 2/6
'-----------------------------------------------------------------------------
If Menu = 2 And Podmenu = 0 Then
Cls
Locate 1 , 7
Lcd "MENU 2/6"
Locate 2 , 5
Lcd "JASNOSC"
Locate 3 , 7
Lcd "LCD"
Gosub Menu_czwartalinia
If M = 0 Then : Podmenu = 1 : Opcja = 0 : Waitms 500 : End If 'po wciśnięciu M przejdź do nastawy jasności ręcznej
End If
'-----------------------------------------------------------------------------
'Fragment obsługujący ręczną nastawę jasności
'-----------------------------------------------------------------------------
If Menu = 2 And Podmenu = 1 Then
Cls
Locate 1 , 2
Lcd "USTAW JASNOSC"
Locate 2 , 5
Lcd "RECZNIE"
Locate 4 , 3
Lcd "- " ; Pwm ; "% +"
Waitms 150
Locate 4 , 8 'miganie
Lcd " "
Waitms 150
Locate 4 , 8
Lcd Pwm
If Plus = 0 Then
Pwm = Pwm + 10
If Pwm >= 101 Then
Pwm = 0
End If
End If
If Minus = 0 Then
Pwm = Pwm - 10
If Pwm >= 101 Then
Pwm = 100
End If
End If
If M = 0 Then : Podmenu = 2 : Waitms 500 : Writeeeprom Pwm , 7 : End If 'po wciśnięciu M przejście do StarLighta
End If
'-----------------------------------------------------------------------------
'Fragment obsługujący ustawienie funkcji StarLight
'-----------------------------------------------------------------------------
If Menu = 2 And Podmenu = 2 Then
Cls
Locate 1 , 4
Lcd "STAR LIGHT"
Locate 3 , 3
Lcd "WLACZ/WYLACZ"
If Starlight = 0 Then 'jeżeli ma być wyłączony
Gosub Miganie_wylacz
End If
If Starlight > 0 Then 'jeżeli ma być załączony
Gosub Miganie_wlacz
End If
If Plus = 0 Then 'po wciśnięciu
Incr Starlight
If Starlight >= 2 Then : Starlight = 0 : End If
End If
If Minus = 0 Then 'po wciśnięciu
Decr Starlight
If Starlight >= 2 Then : Starlight = 1 : End If
End If
If M = 0 Then : Menu = 2 : Podmenu = 0 : Opcja = 0 : Waitms 500 : Writeeeprom Starlight , 5 : End If 'przejście do głównego menu
End If 'koniec bloku do ustawiania podświetlenia
'-----------------------------------------------------------------------------
'przejście do menu ustawiania kontrolek, 3/6
'-----------------------------------------------------------------------------
If Menu = 3 And Podmenu = 0 Then
Cls
Locate 1 , 7
Lcd "MENU 3/6"
Locate 2 , 4
Lcd "KONTROLKI"
Gosub Menu_czwartalinia
If M = 0 Then : Podmenu = 1 : Opcja = 0 : Waitms 500 : End If 'po wciśnięciu M przejdź do wyboru kontrolki
End If
'-----------------------------------------------------------------------------
'przejście do podmenu wyboru kontrolki F1 - F5
'-----------------------------------------------------------------------------
If Menu = 3 And Podmenu = 1 Then
Cls
Locate 1 , 6
Lcd "ALARM"
Locate 2 , 1
Lcd "WYBIERZ KONTROL."
Locate 3 , 1
Lcd "F1 F2 F3 F4 F5"
If Wybr_kontrolka = 1 Then : Wsp_x = 1 : End If 'ustalanie położenia "migania" i klocka, dla zaoszczędzenia pamięci
If Wybr_kontrolka = 2 Then : Wsp_x = 4 : End If
If Wybr_kontrolka = 3 Then : Wsp_x = 8 : End If
If Wybr_kontrolka = 4 Then : Wsp_x = 12 : End If
If Wybr_kontrolka = 5 Then : Wsp_x = 15 : End If
Locate 4 , Wsp_x 'szereg "klocków"
Lcd Chr(5) ; Chr(5)
Waitms 150
Locate 3 , Wsp_x 'miganie
Lcd " "
Waitms 150
Locate 3 , Wsp_x
Lcd "F" ; Wybr_kontrolka
If Plus = 0 Then 'po wciśnięciu
Incr Wybr_kontrolka
If Wybr_kontrolka >= 6 Then : Wybr_kontrolka = 1 : End If
End If
If Minus = 0 Then 'po wciśnięciu
Decr Wybr_kontrolka
If Wybr_kontrolka >= 6 Or Wybr_kontrolka = 0 Then : Wybr_kontrolka = 5 : End If
End If
If M = 0 Then : Podmenu = 2 : Opcja = 0 : Writeeeprom Wybr_kontrolka , 8 : Waitms 500 : End If 'po wciśnięciu M przejdź do nastawy czasu między alarmami
End If
'-----------------------------------------------------------------------------
'przejście do podmenu wyboru czasu do alarmu
'-----------------------------------------------------------------------------
If Menu = 3 And Podmenu = 2 Then
Cls
Locate 1 , 6
Lcd "ALARM"
Locate 2 , 3
Lcd "KONTROLKA #" ; Wybr_kontrolka
Locate 3 , 1
Lcd "USTAW CZAS " ; Czasdoalarmu
Locate 3 , 16
Lcd "S"
Locate 4 , 1
Lcd "DO ALARMU"
Waitms 150
Locate 3 , 12 'miganie
Lcd " "
Waitms 150
Locate 3 , 12
Lcd Czasdoalarmu
If Plus = 0 Then 'po wciśnięciu
Incr Czasdoalarmu
If Czasdoalarmu >= 10000 Then : Czasdoalarmu = 0 : End If
End If
If Minus = 0 Then 'po wciśnięciu
Decr Czasdoalarmu
If Czasdoalarmu >= 10000 Then : Czasdoalarmu = 9999 : End If
End If
If M = 0 Then : Podmenu = 3 : Opcja = 0 : Writeeeprom Czasdoalarmu , 9 : Waitms 500 : End If 'po wciśnięciu M przejdź do nastawy czasu cykliczności alarmu
End If
'-----------------------------------------------------------------------------
'przejście do podmenu wyboru działania LED i dźwięku dla tej kontrolki
'-----------------------------------------------------------------------------
If Menu = 3 And Podmenu = 3 Then
Cls
Locate 1 , 3
Lcd "KONTROLKA #" ; Wybr_kontrolka
Locate 2 , 2
Lcd "SYGNALIZACJA :"
Locate 3 , 1
Lcd "LED"
Locate 4 , 1
Lcd "DZW."
Locate 3 , 6
If Sygnalizacjaled_kontr = 0 Then
Lcd "WYLACZONA"
Else
Lcd "WLACZONA"
End If
Locate 4 , 6
If Ustawdzwiek_kontr = 0 Then
Lcd "WYLACZONA"
Else
Lcd "WLACZONA"
End If
If M = 0 Then : Incr Opcja : Waitms 500 : End If 'po wciśnięciu M ma migać kolejna pozycja
If Opcja >= 2 Then 'jak przejdziemy wszystkie pozycje migania, przejdź do menu głównego
Menu = 3 : Podmenu = 0 : Opcja = 0
Writeeeprom Sygnalizacjaled_kontr , 6
Writeeeprom Ustawdzwiek_kontr , 5
End If
'----------------------------nastawy LED
If Opcja = 0 Then 'miga pierwsza pozycja
Locate 3 , 6
Lcd " "
Waitms 150
Locate 3 , 6
If Sygnalizacjaled_kontr = 0 Then
Lcd "WYLACZONA"
Else
Lcd "WLACZONA"
End If
If Plus = 0 Then 'po wciśnięciu
Incr Sygnalizacjaled_kontr
If Sygnalizacjaled_kontr >= 2 Then : Sygnalizacjaled_kontr = 0 : End If
End If
If Minus = 0 Then 'po wciśnięciu
Decr Sygnalizacjaled_kontr
If Sygnalizacjaled_kontr >= 2 Then : Sygnalizacjaled_kontr = 1 : End If
End If
End If
'----------------------------nastawy dźwięku
If Opcja = 1 Then 'miga druga pozycja
Locate 4 , 6
Lcd " "
Waitms 150
Locate 4 , 6
If Ustawdzwiek_kontr = 0 Then
Lcd "WYLACZONA"
Else
Lcd "WLACZONA"
End If
If Plus = 0 Then 'po wciśnięciu
Incr Ustawdzwiek_kontr
If Ustawdzwiek_kontr >= 2 Then : Ustawdzwiek_kontr = 0 : End If
End If
If Minus = 0 Then 'po wciśnięciu
Decr Ustawdzwiek_kontr
If Ustawdzwiek_kontr >= 2 Then : Ustawdzwiek_kontr = 1 : End If
End If
End If
End If
'-----------------------------------------------------------------------------
'przejście do menu ustawiania alarmu o gołoledzi, 4/6
'-----------------------------------------------------------------------------
If Menu = 4 And Podmenu = 0 Then
Cls
Locate 1 , 7
Lcd "MENU 4/6"
Locate 2 , 3
Lcd "INFORMACJA O"
Locate 3 , 5
Lcd "GOLOLEDZI"
Gosub Menu_czwartalinia
If M = 0 Then : Podmenu = 1 : Opcja = 0 : Waitms 500 : End If 'po wciśnięciu M przejdź do cykliczności
End If
'-----------------------------------------------------------------------------
'przejście do podmenu wyboru cykliczności alarmu o gołoledzi
'-----------------------------------------------------------------------------
If Menu = 4 And Podmenu = 1 Then
Cls
Locate 1 , 5
Lcd "GOLOLEDZ"
Locate 2 , 2
Lcd "SYGNALIZACJA :"
Locate 3 , 1
Lcd "LED"
Locate 4 , 1
Lcd "DZW."
Locate 3 , 6
If Sygnalizacjaled_gol = 0 Then
Lcd "WYLACZONA"
Else
Lcd "WLACZONA"
End If
Locate 4 , 6
If Ustawdzwiek_gol = 0 Then
Lcd "WYLACZONA"
Else
Lcd "WLACZONA"
End If
If M = 0 Then : Incr Opcja : Waitms 500 : End If 'po wciśnięciu M ma migać kolejna pozycja
If Opcja >= 2 Then 'jak przejdziemy wszystkie pozycje migania, przejdź do menu głównego
Menu = 3 : Podmenu = 0 : Opcja = 0
Writeeeprom Sygnalizacjaled_gol , 15
Writeeeprom Ustawdzwiek_gol , 14
End If
'----------------------------nastawy LED
If Opcja = 0 Then 'miga pierwsza pozycja
Locate 3 , 6
Lcd " "
Waitms 150
Locate 3 , 6
If Sygnalizacjaled_gol = 0 Then
Lcd "WYLACZONA"
Else
Lcd "WLACZONA"
End If
If Plus = 0 Then 'po wciśnięciu
Incr Sygnalizacjaled_gol
If Sygnalizacjaled_gol >= 2 Then : Sygnalizacjaled_gol = 0 : End If
End If
If Minus = 0 Then 'po wciśnięciu
Decr Sygnalizacjaled_gol
If Sygnalizacjaled_gol >= 2 Then : Sygnalizacjaled_gol = 1 : End If
End If
End If
'----------------------------nastawy dźwięku
If Opcja = 1 Then 'miga druga pozycja
Locate 4 , 6
Lcd " "
Waitms 150
Locate 4 , 6
If Ustawdzwiek_gol = 0 Then
Lcd "WYLACZONA"
Else
Lcd "WLACZONA"
End If
If Plus = 0 Then 'po wciśnięciu
Incr Ustawdzwiek_gol
If Ustawdzwiek_gol >= 2 Then : Ustawdzwiek_gol = 0 : End If
End If
If Minus = 0 Then 'po wciśnięciu
Decr Ustawdzwiek_gol
If Ustawdzwiek_gol >= 2 Then : Ustawdzwiek_gol = 1 : End If
End If
End If
End If
'-----------------------------------------------------------------------------
'przejście do menu ustawiania, czy tekst powitalny ma być załączony, 5/6
'-----------------------------------------------------------------------------
If Menu = 5 And Podmenu = 0 Then
Cls
Locate 1 , 7
Lcd "MENU 5/6"
Locate 2 , 1
Lcd "TEKST POWITALNY"
Gosub Menu_czwartalinia
If M = 0 Then : Podmenu = 1 : Opcja = 0 : Waitms 500 : End If 'po wciśnięciu M przejdź do zał/wył tekstu
End If
'-----------------------------------------------------------------------------
'Fragment obsługujący ustawienie załączenia napisu powitalnego
'-----------------------------------------------------------------------------
If Menu = 5 And Podmenu = 1 Then
Cls
Locate 1 , 1
Lcd "TEKST POWITALNY"
Locate 3 , 3
Lcd "WLACZ/WYLACZ"
If Dzialanie_tekstow = 0 Then 'jeżeli ma być wyłączony
Gosub Miganie_wylacz
End If
If Dzialanie_tekstow > 0 Then 'jeżeli ma być załączony
Gosub Miganie_wlacz
End If
If Plus = 0 Then 'po wciśnięciu
Incr Dzialanie_tekstow
If Dzialanie_tekstow >= 2 Then : Dzialanie_tekstow = 0 : End If
End If
If Minus = 0 Then 'po wciśnięciu
Decr Dzialanie_tekstow
If Dzialanie_tekstow >= 2 Then : Dzialanie_tekstow = 1 : End If
End If
If M = 0 Then : Menu = 5 : Podmenu = 0 : Opcja = 0 : Waitms 500 : Writeeeprom Dzialanie_tekstow , 3 : End If 'przejście do głównego menu
End If
'-----------------------------------------------------------------------------
'obsługa jednego przypomnienia 6/6
'-----------------------------------------------------------------------------
If Menu = 6 And Podmenu = 0 Then
Cls
Locate 1 , 7
Lcd "MENU 6/6"
Locate 2 , 2
Lcd "PRZYPOMNIENIA"
Gosub Menu_czwartalinia
If M = 0 Then : Podmenu = 1 : Opcja = 0 : Waitms 500 : End If 'po wciśnięciu M przejdź do zał/wył LED
End If
'-----------------------------------------------------------------------------
'Fragment obsługujący nastawę daty przypomnienia
'-----------------------------------------------------------------------------
If Menu = 6 And Podmenu = 1 Then
Latatmp = 2000 + Lataprzyp 'do wyświetlenia i wygodniejszego ustawiania
Cls
Locate 1 , 7
Lcd "DATA"
Locate 2 , 3
Lcd "DZIEN " ; Dzienprzyp
Locate 3 , 3
Lcd "MIESIAC " ; Miesprzyp
Locate 4 , 3
Lcd "ROK " ; Lataprzyp
If M = 0 Then : Incr Opcja : Waitms 500 : End If 'po wciśnięciu M ma migać kolejna pozycja
If Opcja >= 3 Then
Menu = 6
Podmenu = 0
Opcja = 0
Writeeeprom Dzienprzyp , 16
Writeeeprom Miesprzyp , 17
Writeeeprom Lataprzyp , 18
End If 'jak przejdziemy wszystkie pozycje migania, przejdź do menu głównego
'----------------------------nastawy dni
If Opcja = 0 Then 'miga dzień
Locate 2 , 13
Lcd " "
Waitms 150
Locate 2 , 13
Lcd Dzienprzyp
Waitms 150
If Miesprzyp = 2 Then 'wyznaczenie zakresu ruchu dni
Dnimax = 28
End If
If Miesprzyp = 4 Or Miesprzyp = 6 Or Miesprzyp = 9 Or Miesprzyp = 11 Then
Dnimax = 30
End If
If Miesprzyp = 1 Or Miesprzyp = 3 Or Miesprzyp = 5 Or Miesprzyp = 7 Or Miesprzyp = 8 Or Miesprzyp = 10 Or Miesprzyp = 12 Then
Dnimax = 31
End If
Latatmp = Lataprzyp Mod 4
If Latatmp = 0 And Miesprzyp = 2 Then 'jeżeli rok jest przestępny
Dnimax = 29
End If
If Plus = 0 Then
Incr Dzienprzyp
If Dzienprzyp > Dnimax Then
Dzienprzyp = 1
End If
End If
If Minus = 0 Then
Decr Dzienprzyp
If Dzienprzyp > Dnimax Then
Dzienprzyp = Dnimax
End If
End If
End If 'zamknięcie opcji 0
'----------------------------nastawy miesięcy
If Opcja = 1 Then 'miga miesiąc
Locate 3 , 13
Lcd " "
Waitms 150
Locate 3 , 13
Lcd Miesprzyp
Waitms 150
If Plus = 0 Then
Incr Miesprzyp
If Miesprzyp >= 13 Then
Miesprzyp = 1
End If
End If
If Minus = 0 Then
Decr Miesprzyp
If Miesprzyp >= 13 Then
Miesprzyp = 12
End If
End If
End If 'zamknięcie opcji 1
'----------------------------nastawy lat
If Opcja = 2 Then 'miga rok
Locate 4 , 12
Lcd " "
Waitms 150
Locate 4 , 12
Lcd Latatmp
Waitms 150
If Plus = 0 Then
Incr Latatmp
If Latatmp >= 2099 Then
Latatmp = 2012
End If
End If
If Minus = 0 Then
Decr Latatmp
If Latatmp <= 2011 Then
Latatmp = 2098
End If
End If
Lataprzyp = Latatmp - 2000
End If 'zamknięcie opcji 2
End If 'zamknięcie podmenu = 1
Loop
End
Re: Problem z programem LCD 16x4
Dwie rzeczy:
1. Matko słodka jaki chaos. Tak się nie pisze programów. Wszelkie ustawienia robisz w pętli głównej? Podziel to na porządne podprogramy.
2. Nie dziw się że masz wyświetlanie jakie masz skoro na początku każdego warunku masz cls. Wygląda to u Ciebie tak:
- sprawdzasz warunek
- jeśli zgadza się z założeniem to
- czyścisz lcd
- wpisujesz coś na lcd
i teraz weź do tego wrzuć to w pętlę. Oczywiste że będzie ledwo wyświetlać bo najpierw coś wpisujesz na wyświetlacz, za chwilę go czyścisz i znowu coś wpisujesz.
Moja strona w powijakach
Podprogramy
Pętla główna jest długa, bo program jest długi. Podprogramy są i to całkiem sporo:
Odczytdataiczas 'podprogram odczytu z DS1307
Odczyttemp 'odczyt temperatur z DS18B20
Konwertdata 'konwersja daty na postać słowną
Odczytnapiecia 'odczyt napięcia z ADC i konwersja na liczbę
Konwerttemp 'konwersja temperatury - wymuszenie
Zapisdataiczas 'podprogram zapisu do DS1307
Menu_czwartalinia 'podprogram wyświetlający czwartą linijkę w MENU - dla zaoszcz. pamięci
Miganie_wlacz 'miganie napisem WŁACZ na wyświetlaczu
Miganie_wylacz 'miganie napisem WYŁACZ na wyświetlaczu
Zalaczenieprzypomnienia 'obliczenie dni pozostałych do przypomnienia
Kontrola_alarmow 'sprawdzenie, czy nie trzeba załączyć alarmu wywołanego zwarciem transoptora lub gołoledzią
Napisałeś że:
- sprawdzasz warunek
- jeśli zgadza się z założeniem to
- czyścisz lcd
- wpisujesz coś na lcd
a jeśli warunek w pętli głównej się zgodzi to podprogram wykona to samo co mój kod w pętli głównej.
Co proponujesz z poleceniem wait?
Re: Problem z programem LCD 16x4
Ja po pierwsze proponuję nie używać cls. Zamiast tego używaj locate i nadpisuj tylko to co trzeba nadpisać.
Moja strona w powijakach
LCD
W moim przypadku czyszczę LCD przy wyjściu z menu głównego lub przy WYJŚCIU z podmenu.A nie tak jak w Twoim przypadku przy wejściu.A do tego jeśli zmieniają się parametry na danym menu to zrób tak : "opis wartości" "dana wartość zmieniająca się" a po tym w cudzysłowie puste znaki spacji powodujące wymazania poszczególnych znaków których być nie powinno.
I jeszcze raz podziękowania dla Matrixa który mnie tej metody nauczył.
Grzegorz
Kwarc
Dobrze, spróbuję tej waszej metody, brzmi świetnie ;-).
A co powinienem zrobić z poleceniami wait? Przecież nie dołożę teraz kwarcu...
może tak
Weź jakąś zmienną i zrób INCR.Na przykład co 100 obiegów pętli głównej coś zrób.Procek zrobi parę pętli co kilka ms a ty w tym czasie zrobisz co innego.Lub skorzystaj z Timera i przerwań.
Grzegorz