Witam
Mam taki programik troszke posklejany ale wyskakuje błąd co robie nie tak .
Mam taki programik troszke posklejany ale wyskakuje błąd co robie nie tak .
label not found [_ENDIFO ]
$regfile = "m8def.dat" 'Atmega8
$crystal = 8000000 'Kwarc 8MHz
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.1 , Db6 = Portc.0 , Db7 = Portb.5 , E = Portc.3 , Rs = Portc.4
'************************************* I2C **************************************************************
Config Sda = Portd.4
Config Scl = Portd.3 'Złącze I2C - każda z lini podciągnięta do zasilania
Config I2cdelay = 100
'************************************* Przyciski ********************************************************
Config Pind.0 = Input 'Zmniejsz / Lewo / Tempmax i min
Config Pind.1 = Input 'Zatwierdź / menu
Config Pind.2 = Input 'Zwiększ / Prawo / LCD OFF i ON
Config Pind.0 = Input 'pin wejscia zapłonu
Config Pind.1 = Input 'pin wejscia swiateł
Config Debounce = 10
'************************************** 1 wire **********************************************************
Config 1wire = Portc.5 'Złącze do obsługi DS18b20 podciągnięte do zasilania przy pomocy rezystora 4k7
'************************* Obsługa Timera do Sterowania podświetlaniem **********************************
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 1 'pinb.1 jest od podświetlania LCD
S1 Alias Pind.0 'Zmniejsz / Lewo
S2 Alias Pind.1 'Zatwierdź / menu
S3 Alias Pind.2 'Zwiększ / Prawo
Zaplon Alias Pind.0
Swiatla Alias Pind.1
Reset Zaplon 'ustawienie stanu niskiego
Reset Swiatla 'ustawienie stanu niskiego
Declare Sub Wyslij 'Zapisuje wartości na PCF8583
Declare Sub Pokaz_czas 'Odczytuje wartości z PC88583 oraz z czujników temperatury
Deflcdchar 0 , 32 , 10 , 21 , 17 , 10 , 4 , 32 , 32 ' Znak serca
Deflcdchar 1 , 8 , 20 , 8 , 32 , 4 , 14 , 21 , 4 ' strzałka w góre
Deflcdchar 2 , 8 , 20 , 8 , 32 , 4 , 21 , 14 , 4 ' strzałka w dół
Deflcdchar 3 , 4 , 5 , 7 , 7 , 15 , 25 , 9 , 15 ' Dom lewy
Deflcdchar 4 , 32 , 16 , 24 , 28 , 30 , 19 , 18 , 18 ' dom prawy
Deflcdchar 5 , 4 , 14 , 27 , 14 , 4 , 1 , 7 , 32 ' Słońce lewe - zmienia sie z księżycem
Deflcdchar 6 , 32 , 32 , 32 , 14 , 31 , 30 , 28 , 32 ' Słońce prawe
Deflcdchar 7 , 6 , 8 , 8 , 6 , 32 , 1 , 7 , 32 ' Księżyć lewy - zmienia się ze słońcem
Deflcdchar 1 , 32 , 32 , 14 , 1 , 15 , 17 , 15 , 1 ' literka "ą"
Deflcdchar 2 , 8 , 10 , 12 , 24 , 8 , 9 , 6 , 32 'literka "ł"
Deflcdchar 3 , 4 , 21 , 21 , 21 , 14 , 31 , 17 , 31 'znak swiateł
Declare Sub Poczatek
'**************************************** Menu **********************************************************
Dim Menutext As String * 13 'Tekst menu. Maksymalnie 13 znaków
Dim J As Byte
Dim Menutext2 As String * 3 'Tekst menu2. Maksymalnie 3 znaków
Dim K As Byte
Dim Ii As Byte
Dim Jj As Byte
Dim Kk As Byte
Dim Ll As Byte
'**************************************dodane******************************************************************
Poczatek:
Cls
Ii = 9
Jj = 2
Do
If Swiatla = 1 Then 'jesli swiatła włączone to pokazuje znak na wyswietlaczu swiateł
Locate 1 , 8 : Lcd Chr(3) 'na pozycji 8 w wierszu pirwszym
Else 'jeslui nie to
Locate 1 , 8 : Lcd " " 'wygaszenie znaku swiateł czyli spacja aby wygasic znak swiateł
End If 'bez nie potrzebnego uzywania cls czyszczenia ekranu, :nie mrugal wyswietlacz
If Zaplon = 1 Then 'jesli właczony jest zapłon to przechodzi do petli i wyswietla napis włącz siatła
Cls
Do
Ii = 9 'początkowa wratosc pozycji na wyswietlaczu
Jj = 2 'początkowa wratosc pozycji na wyswietlaczu
For Kk = 1 To 7 'petla wykonywana 7 razy napis w przesuwany w lewo
Ii = Ii - 1 'zmniejszanie wartości I o 1
If Ii < 2 Then Ii = 2
Cls
Locate 1 , Ii : Lcd " w" ; Chr(2) ; Chr(1) ; "cz"
Locate 2 , Ii : Lcd "swiat" ; Chr(2) ; "a"
Waitms 50
If Swiatla = 1 Then 'jesli swiatła włączone to wyjscie z petli
Cls
Locate 1 , 3 : Lcd "swiat" ; Chr(2) ; "a ok"
Locate 2 , 6 : Lcd "jazda"
Wait 2
Call Poczatek
End If
Next Ll ' do petli L
For Ll = 1 To 7 'petla wykonywana 7 razy napis w przesuwany w prawo
Jj = J + 1 'zwiekszanie wartości J o 1
If J > 9 Then J = 9
Cls
Locate 1 , J : Lcd " w" ; Chr(2) ; Chr(1) ; "cz"
Locate 2 , J : Lcd "swiat" ; Chr(2) ; "a"
Waitms 50
If Swiatla = 1 Then 'jesli swiatła włączone to wyjscie z petli
Cls
Locate 1 , 3 : Lcd "swiat" ; Chr(2) ; "a ok"
Locate 2 , 6 : Lcd "jazda"
Wait 2
Call Poczatek
End If
Next
Loop
End If
Loop
'*************************************koniec*******************************************************************
Dim S As Byte 'deklaracja sekund
Dim M As Byte 'deklaracja minut
Dim H As Byte 'deklaracja godzin
Dim Day As Byte 'deklaracja dni
Dim Month As Byte 'deklaracja miesiecy
Dim Rok As Byte 'deklaracja roku
Dim Poprzedni_miesiac As Byte 'dodatkowa zmienna
Dim A As Byte 'Zmienna od przesuwania ekranu startowego
Dim W As Byte 'Zmienna informująca o ilości czujników DS18b20
Dim Dsid1(8) As Byte 'deklaracja obsługi czujników DS18b20
Dim Dsid2(8) As Byte
Dim I1 As Integer , Ss As String * 6
Dim I2 As Integer
Dim P As Byte 'Moc świecenia podświetlania LCD w %
Dim Pp As Byte 'Przechowuje wartość PWM
Dim C As Byte 'Przechowuje wartość PWM przy uruchamianiu układu
Set Portd.0
Set Portd.1
Set Portd.2
'****************************** wartosci poczatkowe **************************************
S = 0
M = 0
H = 0
Day = 1
Month = 1
Readeeprom Rok , 2 'Czyta zaposaną wartość roku z 2 komórki pamięci EEPROM
'*************************************** Ekran startowy *************************************************************
Cls
Cursor Off
For C = 0 To 150
Pwm1a = C 'Rozjaśnianie LCD od 0 do 100 (50% PWM)
Waitms 4
Next C
Locate 1 , 17
Lcd ">> Duch <<"
Locate 2 , 20
Lcd "2008"
For A = 1 To 13
Shiftlcd Left
Waitms 30 'Schowanie tekstu
Next A
Wait 2
For A = 1 To 13
Shiftlcd Left
Waitms 30 'Schowanie tekstu
Next A
For C = 150 To 0 Step -1
Pwm1a = C 'Ściemnienie LCD od 100 do 0
Waitms 4
Next C
Waitms 500
Cls
Locate 1 , 1
Lcd Chr(0) ; " Zegar serce " ; Chr(0) 'Tekst tytułowy na LCD
Gosub Rozjasnianie 'Idzie do procedury rozjaśniania wyświetlacza
Wait 2
Cls
'koniec pętli głównej programu
'*************************************** 1 wire ********************************************************
W = 1wirecount() 'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
Locate 1 , 1
Lcd "Ilosc czujnikow:"
Waitms 500
Locate 2 , 8
Lcd W 'Wyświetla ilość czujników
Wait 3
Dsid1(1) = 1wsearchfirst() 'Znajdź pierwszy czujnik podpięty do portu
Dsid2(1) = 1wsearchnext() 'Znajdź następny czujnik podpięty do portu
'*************************************** Pętla główna **************************************************
'************************************* od tego miejsca w dół **********************************
Pocz:
Cls
Do
J = 4
K = 1
Call Pokaz_czas 'Pokazuje czas i temperature
Debounce Pind.0 , 0 , Maxmin
Debounce Pind.1 , 0 , Menu 'Naciskając S2 wchodzimy do menu
Debounce Pind.2 , 0 , Display_off
Loop
End
'********************************************************************************************************
Sub Wyslij 'Podprogram do wysyłania danych do pcf-a
S = Makebcd(s)
M = Makebcd(m)
H = Makebcd(h) 'Zamiana wartości dziesiętnych na kod BCD
Day = Makebcd(day)
Month = Makebcd(month)
I2cstart 'Uruchomienie I2C
I2cwbyte 162 'Wybór urządzenia do zapisu
I2cwbyte &H02 'Wybór 2 rejestru do zapisu (sekundy)
I2cwbyte S 'Zapisuje sekundy
I2cwbyte M 'Zapisuje minuty
I2cwbyte H 'Zapisuje godziny
I2cwbyte Day 'Zapisuje dni
I2cwbyte Month 'Zapisuje miesiąc
I2cstop 'Koniec zapisu
End Sub
'************************************** I2C ****************************************************************
Sub Pokaz_czas 'Pokazuje czas
I2cstart
I2cwbyte 162
I2cwbyte &H00
I2cwbyte &H08 ' włącza maskowanie roku i dnia tygodnia
I2cstop
I2cstart
I2cwbyte 162
I2cwbyte &H02
I2cstart
I2cwbyte 163
I2crbyte S , Ack 'Odczytuje sekundy
I2crbyte M , Ack 'Odczytuje minuty
I2crbyte H , Ack 'Odczytuje godziny
I2crbyte Day , Ack 'Odczytuje dni
I2crbyte Month , Nack 'Odczutuje miesiąc
I2cstop 'koniec transmisji I2C
'************************************** 1 wire ***************************************************************
Do
'--------konwersja temp dla wszystkich dsow
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 901 ' czekaj na konwersję temperatury (normalnie powinno być 750,
'ale jest ustawione na 901, aby nie kolidowało z odświeżaniem sekund)
1wreset
1wwrite &H55
1wverify Dsid1(1) 'wysyłamy adres pierwszego czujnika
1wwrite &HBE
I1 = 1wread(2)
'---------------------------------
1wreset
1wwrite &H55
1wverify Dsid2(1) 'wysylam adres drugiego czujnika
1wwrite &HBE
I2 = 1wread(2)
'---------------------------------
I1 = I1 * 10 'Konwersja
I1 = I1 / 16
Ss = Str(i1)
Ss = Format(ss , " 0.0") ' Format wyświetlania
I2 = I2 * 10 'Konwersja
I2 = I2 / 16
Ss = Str(i2)
Ss = Format(ss , " 0.0") ' Format wyświetlania
'poniewaz dane odczytane z PCF-a sa w formacie kodu BCD, zamieniam ich wartosc na wartosc dziesietna:
S = Makedec(s)
M = Makedec(m)
H = Makedec(h)
Day = Makedec(day)
Month = Makedec(month)
'************** obsluga zmiany roku********************************************************
If Poprzedni_miesiac <> Month Then 'sprawdzamy czy zmienil sie miesiac
If Month = 1 And Day = 1 And H = 0 And M = 0 And S = 0 Then 'jesli miesiac zmienil sie na styczen , to zwiekszamy rok
Incr Rok
Writeeeprom Rok , 2
End If
Poprzedni_miesiac = Month
End If
'*********************** Wyświetlanie danych **************************************************
'Format Wyświetlania:
Locate 1 , 1 'godziny
If H < 10 Then 'Jeśli godzina jest mniejsza od 10 np. 7 to
Lcd "0" ; H ; ":" 'dodaj przez 7 zero i wyświetl jako 07
Else
Lcd H ; ":"
End If
Gosub Symbol_dom
Locate 2 , 11
Lcd Chr(6) 'Wyświetlanie Znaku dnia i nocy (chodzi o symbol dworu)
If H >= 6 And H < 21 Then
Locate 2 , 10
Lcd Chr(5)
Else
Locate 2 , 10
Lcd Chr(7)
End If
Locate 1 , 4
If M < 10 Then
Lcd "0" ; M ; ":" 'minuty
Else
Lcd M ; ":"
End If
Locate 1 , 7
If S < 10 Then
Lcd "0" ; S ; 'sekundy
Else
Lcd ; S ;
End If
Locate 2 , 1
If Day < 10 Then 'dni
Lcd "0" ; Day ; "."
Else
Lcd Day ; "."
End If
Locate 2 , 4 'miesiąc
If Month < 10 Then
Lcd "0" ; Month ; "."
Else
Lcd Month ; "."
End If
If Rok > 99 Then
Rok = 0
Writeeeprom Rok , 2
End If
Locate 2 , 7
If Rok < 10 Then 'rok
Lcd "0" ; Rok
Else
Lcd Rok
End If
'format wyświetlania 1 czujnika ds18b20 wraz ze strzałkami
Gosub Warunek1
If I1 > 0 Then
Gosub Format_wyswietlania1
Gosub Wyswietlanie1
Else
Gosub Format_wyswietlania1
Gosub Wyswietlanie1
End If
Else
Gosub Warunek1
If I1 > 0 Then
Gosub Format_wyswietlania1
Gosub Wyswietlanie2
Else
Gosub Format_wyswietlania1
Gosub Wyswietlanie2
End If
'format wyświetlania 2 czujnika ds18b20 wraz ze strzałkami
Gosub Warunek2
If I2 > 0 Then
Gosub Format_wyswietlania2
Gosub Wyswietlanie1;
Else
Gosub Format_wyswietlania2
Gosub Wyswietlanie1
End If
Gosub Warunek2
If I1 > 0 Then
Gosub Format_wyswietlania2
Gosub Wyswietlanie2
Else
Gosub Format_wyswietlania2
Gosub Wyswietlanie2
End If
If H = 23 And M = 59 And S = 59 Then
End If
End Sub
Loop
Format_wyswietlania1:
Ss = Str(i1)
Ss = Format(ss , " 0.0")
Locate 1 , 12
Return
Format_wyswietlania2:
Ss = Str(i2)
Ss = Format(ss , "0.0")
Locate 2 , 12
Return
Wyswietlanie1:
Lcd Ss ; Chr(1)
Return
Wyswietlanie2:
Lcd Ss ; Chr(2)
Return
Warunek1:
Return
Warunek2:
Return
Symbol_dom:
Locate 1 , 10
Lcd Chr(3)
Locate 1 , 11
Lcd Chr(4)
Return
'****************************************************************************************************
Maxmin:
Cls
Do
If H >= 6 And H < 21 Then
Locate 1 , 6
Lcd Chr(5)
Else
Locate 1 , 6
Lcd Chr(7)
End If
Locate 1 , 7
Lcd Chr(6) ; "||"
Lowerline
Locate 2 , 8
Lcd "||"
Gosub Symbol_dom
Gosub Formatss
Locate 2 , 1
Lcd Ss
Gosub Formatss
Locate 1 , 1
Lcd Ss
Gosub Formatss
Locate 2 , 13
Lcd Ss
Gosub Formatss
Locate 1 , 13
Lcd Ss
Debounce S1 , 0 , Pocz
Loop
Formatss:
Ss = Format(ss , "0.0")
Return
'****************************************************************************************************
Menu: '
Cls
Menutext = Lookupstr(j , Menuopisy) 'Wyświetla aktualnie wybraną wartość J i wyświetla ja w postaci tekstowej
Locate 2 , 2
Lcd Menutext
Do
Locate 1 , 1
Lcd " **** MENU **** "
Debounce S3 , 0 , Menuprawo
Debounce S1 , 0 , Menulewo
Debounce S2 , 0 , Menuenter
Loop
Menuenter:
Cls
Select Case J
Case 0
Goto Menuzegar
Case 1 ' W zależności jakie jest J, to wybiera odpowiednie menu.
Goto Podswietlanie
Case 2
Case 3
Case 4
Goto Pocz
End Select
Menuprawo:
'Cls
Incr J 'Wzwiększanie wartości J
If J > 4 Then J = 0
Goto Menu
Menulewo:
'Cls
Decr J
J = J + 1
If J < 1 Then J = 5 'Zmniejszanie wartości J
J = J - 1
Goto Menu
'********************************************* Obsługa ustawiania zegara *********************************************
Menuzegar:
Do
If H > 23 Or M > 59 Then
H = 0 'Procedura zabezpieczająca przed błędem związanym z nieuzasadnionym
M = 0 'wzwiększaniem się godzin i minut ponad 23 godziny i ponad 59 minut
End If
Locate 1 , 3
Lcd "USTAW ZEGAR"
Locate 2 , 6
If H < 10 Then
Lcd "0" ; H ; ":" 'godziny
Else
Lcd H ; ":"
End If
Locate 2 , 9
If M < 10 Then
Lcd "0" ; M 'minuty
Else
Lcd M
End If
Debounce S3 , 0 , Ustawmin
Debounce S1 , 0 , Ustawgodz
Debounce S2 , 0 , Zatwierdz_czas
Loop
Zatwierdz_czas:
Goto Menudata
Ustawmin:
Incr M : If M > 59 Then M = 0
S = 0 'Wziększa wartość minut
Goto Menuzegar
Ustawgodz:
Incr H : If H > 23 Then H = 0 'Wzwiększa wartość godzin
Goto Menuzegar
'********************************************* Obsługa ustawiania dnia i miesiąca *********************************************
Menudata:
If Day > 31 Or Month > 12 Then 'To samo co przy godzinach
Day = 1
Month = 1
End If
Cls
Do
Locate 1 , 4
Lcd "USTAW DATE"
Locate 2 , 6
If Day < 10 Then
Lcd "0" ; Day ; "." 'Format wyświetlania
Else
Lcd Day ; "."
End If
Locate 2 , 9
If Month < 10 Then
Lcd "0" ; Month
Else
Lcd Month
End If
Debounce S1 , 0 , Ustawdni
Debounce S3 , 0 , Ustawmies
Debounce S2 , 0 , Zatwierdz_data
Loop
Zatwierdz_data:
Call Wyslij
Goto Menurok
Ustawdni:
Incr Day : If Day > 31 Then Day = 1 'Wzwiększa wartość Dni
Goto Menudata
Ustawmies:
Incr Month : If Month > 12 Then Month = 1 'Wziększa wartość Miesięcy
Goto Menudata
'********************************************* Obsługa ustawiania roku *********************************************
Menurok:
Cls
Do
Locate 1 , 4
Lcd "USTAW ROK"
Locate 2 , 7
Lcd "20"
Locate 2 , 9
If Rok < 10 Then
Lcd "0" ; Rok ;
Else
Lcd Rok ;
End If
Debounce S1 , 0 , Rokminus
Debounce S3 , 0 , Rokplus
Debounce S2 , 0 , Zatwierdz_rok
Loop
Zatwierdz_rok:
Writeeeprom Rok , 2 'Zapisuje wartość roku do EEPROMA
Goto Menu
Rokplus:
Incr Rok : If Rok > 99 Then Rok = 0 'Wzwiększa wartość Roku od 0 do 99
Goto Menurok
Rokminus:
Rok = Rok + 1
Decr Rok : If Rok < 1 Then Rok = 100 'Zmniejsza wartość roku w przedziale od 99 do 0
Rok = Rok - 1
Goto Menurok
'********************************************* Obsługa podświetlania LCD *********************************************
Podswietlanie:
Readeeprom Pp , 1
Goto Ustaw_podsw
'______________________________________________________________________________
Ustaw_podsw:
Do
Pp = Pwm1a
'Przelicza wartość PWM na procenty
P = Pwm1a / 2
Locate 1 , 2
Lcd "PODSWIETL.LCD"
If Pwm1a >= 200 Then 'Ograniczenie programowe maksymalnego PWM do 200 (normalnie jest 255)
Pwm1a = 200
End If
Locate 2 , 7
If P < 10 Then
Lcd " " ; P
Else 'podświetlanie w procentach
If P < 100 Then
Lcd " " ; P
Else
Lcd P
End If
End If
Locate 2 , 10
Lcd "%"
If S1 = 0 Then
Goto Podswietlanieminus
End If
If S3 = 0 Then
Goto Podswietlanieplus
End If
Debounce S2 , 0 , Zatwierdz_podsw
Loop
Podswietlanieplus:
Incr Pwm1a : If Pwm1a > 200 Then Pwm1a = 200 'Wzwiększa wartość Podświetlania od 0% do 100%
Goto Podswietlanie
Podswietlanieminus:
Pwm1a = Pwm1a + 1
Decr Pwm1a : If Pwm1a < 1 Then Pwm1a = 1 'Zmniejsza wartość Podświetlania w przedziale od 100% do 0%
Pwm1a = Pwm1a - 1
Goto Podswietlanie
Zatwierdz_podsw:
Writeeeprom Pp , 1 'Zapis wartości podświetlania do EEPROM-a
Goto Menu
'********************************************* Obsługa wyłączania LCD *********************************************
Display_off:
Do
Cls
Locate 1 , 6
Lcd "LCD OFF"
Wait 1
Cls
Locate 1 , 5
Lcd ">LCD OFF<"
Waitms 200
Cls
Locate 1 , 6
Lcd ">CD OF<"
Waitms 200
Cls
Locate 1 , 7
Lcd ">D O<"
Waitms 200
Cls
Locate 1 , 8
Lcd "> <"
Waitms 200
Cls
Readeeprom Pp , 1
For C = Pp To 0 Step -1
Pwm1a = C
Waitms 4 'Zciemnianie wyświetlacza od wartości podświetlania (pp) do 0
Next C
Cls
Display Off 'Wyłącza wyświetlanie czegokolwiek na wyświetlaczu
Goto Czekajna
Loop
'********************************************* Obsługa wyłączonego LCD *********************************************
Czekajna:
Do
Debounce S3 , 0 , Display_on 'Jeśli naciśniemy przycisk Menu to przechodzimy do procedury od włączania podświetlania.
Loop
'********************************************* Obsługa włączania LCD *********************************************
Display_on:
Do
Display On
Gosub Rozjasnianie 'Idzie do procedury rozjaśniania wyświetlacza
Locate 1 , 8
Lcd "< >"
Waitms 200
Cls
Locate 1 , 7
Lcd "<D O>"
Waitms 200
Cls
Locate 1 , 6
Lcd "<CD ON>"
Waitms 200
Cls
Locate 1 , 5
Lcd "<LCD ON >"
Waitms 200
Cls
Locate 1 , 6
Lcd "LCD ON"
Wait 1
Goto Pocz
Loop 'Idź na początek programu
'********************************************* Dane *********************************************
Menuopisy:
Data " ZEGAR / DATA" , "PODSWIETL.LCD" , " AUTOR" , " WYJDZ" 'Nazyw menu
Rozjasnianie:
Readeeprom Pp , 1
For C = 0 To Pp
Pwm1a = C
Waitms 4 'Procedura rozjaśniania wyświetlacza od 0 do wartości PP
Next C