Problem z programem LCD 16x4


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ł




Portret użytkownika matrix

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.

Portret użytkownika Pablo201_5

Fusebity

A co z Fusebitami? Są dobrze ustawione ? Pierwszy raz pracuje z tym procesorem i nie mam z nim żadnego doświadczenia...

Portret użytkownika matrix

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.

Portret użytkownika gosc

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.

Portret użytkownika matrix

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:

 cls
 home
  lcd "Pierwsza linia 1"
  locate 2,1
  lcd "Druga linia    2"
  locate 3,1
  lcd " Trzecia linia 3"
  locate 4,1
  lcd " Czwarta linia 4"
 
do
loop
end

Jeśli to prawidłowo zapisze Ci cały lcd to szukaj problemu który opisalem.

Portret użytkownika glecki

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

Portret użytkownika Pablo201_5

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ł

Portret użytkownika matrix

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.

Portret użytkownika Pablo201_5

Eliminacja

Na co mam zamienić te komendy? Kod to 98% flash'a wiec trochę tego jest... ;-(

Portret użytkownika matrix

Re: Problem z programem LCD 16x4

Użyj timera. Wstaw kod, pokaż co co Ty tam nakombinowaleś?

Portret użytkownika glecki

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

Portret użytkownika gosc

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

Portret użytkownika matrix

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.

Portret użytkownika gosc

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?

Portret użytkownika matrix

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ć.

Portret użytkownika glecki

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

Portret użytkownika gosc

Kwarc

Dobrze, spróbuję tej waszej metody, brzmi świetnie ;-).

A co powinienem zrobić z poleceniami wait? Przecież nie dołożę teraz kwarcu...

Portret użytkownika glecki

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