FAQ | Points | Add... | Recent posts | Search | Register | Log in


[Atmega8][Bascom] Problem z przyciskami


Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> [Atmega8][Bascom] Problem z przyciskami
Author
Message
Duch__
Poziom 22
Poziom 22


Joined: 12 Dec 2004
Posts: 1948
Location: Opole

Post#1 Post from the author of the topic 11 Jul 2008 09:10   

[Atmega8][Bascom] Problem z przyciskami


Witam. Skleciłem taki o to "fragment" kodu do obsługi zegarka RTC. Wszystko działa [prawie] bardzo dobrze oprócz kilku mało istotnych rzeczy z którymi se poradzę.

Moim głównym problem są przyciski. Narazie mam ich 5 podpiętych z czego każdy odpowiada nastawianiu w górę jednej wartości w zegarze co jest troszkę męczące. Chciałbym to zmniejszyć do 3 przycisków, tak aby np.

S1 służył do wchodzenia do menu / wybierania funkcji z menu;

S2 służył do poruszania się po menu w górę / zwiększania wartości np. godziny, minuty o 1;

S3 służył do poruszania się po menu w dół / zmniejszania wartości np. godziny, minuty o 1.

Zegarek docelowo będzie używany przez dziewczynę, więc musi być przejrzysty.


Oto kod który napisałem:

Code:
'Program do obsługi zegara czasu rzeczywistego RTC PCF8583 Philips za pomoca magistrali I2C

$regfile = "m8def.dat"                                      'Atmega8
$crystal = 8000000                                          'Kwarc 8MHz

Config Lcd = 20 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5

'************************************* I2C **************************************************************

Config Sda = Portc.1
Config Scl = Portc.0

'************************************** 1 wire **********************************************************

Config 1wire = Portc.5                                      'Złącze do obsługi DS18b20

'************************************* Przyciski ********************************************************

Config Pind.0 = Input                                       'Ustawianie godzin
Config Pind.1 = Input                                       'Ustawianie minut
Config Pind.6 = Input                                       'Ustawianie dni
Config Pind.2 = Input                                       'Ustawianie miesiąca
Config Pind.5 = Input                                       'Zatwierdzanie w/w ustawień

Declare Sub Wyslij_do_rtc
Declare Sub Ustaw_czas
Declare Sub Pokaz_czas

Deflcdchar 0 , 8 , 20 , 8 , 3 , 4 , 4 , 4 , 3               'Znak stopnia Celsjusza
Deflcdchar 1 , 32 , 4 , 14 , 21 , 4 , 4 , 4 , 32            ' strzałka góra
Deflcdchar 2 , 32 , 4 , 4 , 4 , 21 , 14 , 4 , 32            ' strzałka dół

Dim Poprzedni_miesiac As Byte                               'dodatkowa zmienna
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 Miesiac As String * 11                                  '"pomocniczy miesiac"
Dim Rok As Word
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 I11 As Integer                                          ' przechowuje poprzednią wartoś temp
Dim I22 As Integer                                          ' przechowuje poprzednią wartoś temp

Set Portd.0
Set Portd.1
Set Portd.6
Set Portd.2
Set Portd.5

S = 0
M = 0                                                       'wartosci poczatkowe zegara i daty
H = 0
Day = 1
Month = 1
Rok = 8

Cls
Cursor Off                                                  'Wyłączam kursor

'*************************************** 1 wire ********************************************************

W = 1wirecount()
Lcd "Ilosc czujnikow:" ; W                                  'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
Wait 3

Cls

Dsid1(1) = 1wsearchfirst()                                  'Znajdź pierwszy czujnik podpięty do portu
Dsid2(1) = 1wsearchnext()                                   'Znajdź następny czujnik podpięty do portu



'**************************************** Pokazywanie czasu **********************************************
Do
Call Pokaz_czas                                             'w pierwszej kolejności zostaje

If Pind.0 = 0 Then
   Wait 2
      If Pind.0 = 0 Then
      Cls
      Gosub Ustaw_czas
   End If
   Cls
End If

Loop


'************************************** I2C Pokazywanie czasu ******************************************************

Sub Pokaz_czas

I2cstart
   I2cwbyte 160
   I2cwbyte 0
   I2cwbyte 8                                               ' włącza maskowanie roku i dnia tygodnia
   I2cstop
   I2cstart
   I2cwbyte 160
   I2cwbyte 2
   I2cstart
   I2cwbyte 161
   I2crbyte S , Ack
   I2crbyte M , Ack
   I2crbyte H , Ack
   I2crbyte Day , Ack
   I2crbyte Month , Nack
   I2cstop                                                  'koniec transmisji

S = Makedec(s)
M = Makedec(m)
H = Makedec(h)
Day = Makedec(day)
Month = Makedec(month)

'************** obsluga roku************************
If Poprzedni_miesiac <> Month Then                          'sprawdzamy czy zmienil sie miesiac
   If Month = 1 Then                                        'jesli miesiac zmienil sie na styczen , to zwiekszamy rok
      Incr Rok
   End If
   Poprzedni_miesiac = Month
End If

'***************************************

Miesiac = Lookupstr(month , Miesiace)                       'wybieram miesiac spośród danych



'************************************** 1 wire ***************************************************************
  Do
   1wreset
   1wwrite &H55
   1wverify Dsid1(1)
   1wwrite &HBE
   I1 = 1wread(2)
   '---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid2(1)
   1wwrite &HBE
   I2 = 1wread(2)
   '---------------------------------
   1wreset
   1wwrite &HCC
   1wwrite &H44

 Waitms 751                                                 ' czekaj na konwersję temperatury (normalnie powinno być 750,
                                                             'ale jest ustawione na 751, aby nie kolidowało z odświeżaniem sekund)

   I1 = I1 * 10
   I1 = I1 / 16
   Ss = Str(i1)
   Ss = Format(ss , " 0.0")                                 ' Format wyświetlania temperatury


   I2 = I2 * 10
   I2 = I2 / 16
   Ss = Str(i2)
   Ss = Format(ss , " 0.0")




'*********************** Wyswietlam dane na lcd po zatwierdzeniu ustawień**************************

'Format wyświetlania:
 Locate 1 , 1
 If H < 10 Then
   Lcd "0" ; H ; ":"                                        'godziny
   Else
   Lcd H ; ":"
 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
      Lcd Miesiac ; "/"

 Locate 2 , 8
 If Rok < 10 Then                                           'rok
      Lcd "0" ; Rok
      Else
      Lcd Rok
 End If

   If I1 >= I11 Then                                        'format wyświetlania 1 czujnika ds18b20
   I11 = I1
   If I1 > 0 Then
   Ss = Str(i1)
   Ss = Format(ss , " 0.0")
   Locate 1 , 11
   Lcd Ss ; Chr(0) ; Chr(1) ;
   Else
   Ss = Str(i1)
   Ss = Format(ss , "0.0")
   Locate 1 , 1
   Lcd Ss ; Chr(0) ; Chr(1) ; ""
   End If
   Else
   I11 = I1
   If I1 > 0 Then
   Ss = Str(i1)
   Ss = Format(ss , " 0.0")
   Locate 1 , 11
   Lcd Ss ; Chr(0) ; Chr(2) ;
   Else
   Ss = Str(i1)
   Ss = Format(ss , "0.0")
   Locate 1 , 11
   Lcd Ss ; Chr(0) ; Chr(2) ;
   End If
   End If

   If I2 >= I22 Then                                        'format wyświetlania 2 czujnika ds18b20
   I22 = I2
   If I2 > 0 Then
   Ss = Str(i2)
   Ss = Format(ss , " 0.0")
   Locate 2 , 11
   Lcd Ss ; Chr(0) ; Chr(1) ;
   Else
   Ss = Str(i2)
   Ss = Format(ss , "0.0")
   Locate 2 , 11
   Lcd Ss ; Chr(0) ; Chr(1) ;
   End If
   Else
   I22 = I2
   If I1 > 0 Then
   Ss = Str(i2)
   Ss = Format(ss , " 0.0")
   Locate 2 , 11
   Lcd Ss ; Chr(0) ; Chr(2) ;
   Else
   Ss = Str(i2)
   Ss = Format(ss , "0.0")
   Locate 2 , 11
   Lcd Ss ; Chr(0) ; Chr(2) ;
   End If
   End If


End Sub



'************************************ I2C Ustawianie czasu ***********************************************
Sub Ustaw_czas
Do

If Pind.0 = 0 Then
Waitms 100                                                  'zwieksz godzine
Incr H
End If

If Pind.1 = 0 Then
Waitms 100                                                  'zwieksz minute
Incr M
End If

If Pind.6 = 0 Then
Waitms 100                                                  'zwieksz dzien
Incr Day
End If

If Pind.2 = 0 Then
Waitms 100                                                  'zwieksz miesiac
Incr Month
End If

If Pind.5 = 0 Then                                          'zatwierdź wprowadzone dane
Waitms 100
Call Wyslij_do_rtc

For A = 1 To 15
Shiftlcd Left
Waitms 200
Next A

Cls

Exit Sub
End If

If M = 60 Then
M = 0
End If

If H = 24 Then
H = 0
End If

If Day = 32 Then
Day = 1
End If

If Month = 13 Then
Rok = Rok + 1
Month = 1
End If


Miesiac = Lookupstr(month , Miesiace)                       'wybieram miesiac spośród danych



'*********************** Format wyświetlania czasu w ustawieniach**********************************************
Locate 1 , 3
Lcd "Ustaw czas"

Locate 2 , 1
 If H < 10 Then
   Lcd "0" ; H ; ":"                                        'godziny
   Else
   Lcd H ; ":"
 End If
 Locate 2 , 4
   If M < 10 Then
   Lcd "0" ; M                                              'minuty
   Else
   Lcd M
 End If

Locate 2 , 7
   If Day < 10 Then                                         'dni
      Lcd "0" ; Day ; "/"
      Else
      Lcd Day ; "/"
 End If

 Locate 2 , 10                                              'miesiące
      Lcd Miesiac ; "/"

 Locate 2 , 14
 If Rok < 10 Then                                           'rok
      Lcd "0" ; Rok
      Else
      Lcd Rok
 End If

Loop

End Sub

'********************************************************************************************************
Sub Wyslij_do_rtc                                           'Podprogram do zapisywania danych w pcf-ie

S = Makebcd(s)
M = Makebcd(m)
H = Makebcd(h)
Day = Makebcd(day)
Month = Makebcd(month)
Rok = Makebcd(rok)

I2cstart
I2cwbyte 160
I2cwbyte 2
I2cwbyte S
I2cwbyte M
I2cwbyte H
I2cwbyte Day
I2cwbyte Month
I2cwbyte Rok

I2cstop

End Sub



'**************************************************************************************************
Miesiace:

Data " " , "Sty" , "Lut" , "Mar" , "Kwi" , "Maj" , "Cze"
Data "Lip" , "Sie" , "Wrz" , "Paz" , "Lis" , "Gru"

'****************************************************************************************************
Loop
   

Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 11 Jul 2008 09:10   





Back to top
   
pixel7
Poziom 17
Poziom 17


Joined: 29 Jan 2007
Posts: 394
Location: Warszawa

Post#2 11 Jul 2008 13:49helpful post - solution   

Re: [Atmega8][Bascom] Problem z przyciskami


Witam,

tu w LINKU

znajdziesz mój program w którym jest menu 3 przyciskowe.


Pozdrawiam.


ps
Quote:
Zegarek docelowo będzie używany przez dziewczynę, więc musi być przejrzysty.
- to już szowinizm...
Back to top
   
Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> [Atmega8][Bascom] Problem z przyciskami
Page 1 of 1
Similar topics
[Atmega8][Bascom] Problem z uruchomieniem (10)
[ATMEGA8][BASCOM] problem z LCD (4)
atmega8, bascom -problem z timer0 (6)
ATmega8, LCD, Bascom i problem (17)
[BASCOM] Menu z 3 przyciskami - góra, dół i enter. (42)
[ATMEGA8][BASCOM]Problem z termometrem ATmega8 + LCD 16x2 (8)
[Atmega8][C]Problem z Przyciskami!! (13)
[Bascom][atmega8]- Program termometru z przyciskami (12)
[Atmega8][Bascom]Problem sterowania diod led 3 przyciskami (7)
[Atmega8][Bascom] Problem z ADC (4)

Page generation time: 0.12 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed