avatar_haberlesme

Buton hakkında bilgi

Başlatan haberlesme, 22 Nisan 2013, 23:10:22

haberlesme

Ete hocam tek bir buton birden çok işte kullanmanın yolu nedir ? örn:saat uygulamasında mod tuşu ayar menüsüne gidiyor ayardan sonra set ediyor sırasıyla dakika saniye ye kadar gidiyor rica etsem açıklayabilir misiniz

ete

If buton=0 then ayar
....
....
AYAR:
Whıle buton=0:wend
...
If buton=0 then
Saat=saat+1:if saat>23 then saat=0
Sure=0
While buton=0
Sure=sure+1
If sure>100 then dak_ayar
Wend
...
...
Dak_ayar:
While buton=0:wend
...
...
If buton=0 then
Dak=dak+1:ıf dak>59 then dak=0
Sure=0
While buton=0
Sure=sure+1
If sure>100 then kayıt
Wend
....
Gördüğün gibi tek butonla bütün ayar işini yaptım. Aralarda pause ile gecikme vermek gerekebilir. Yalnızca mantığı göstermek istedim. Butona kısa basıp bırakırsan dağer artışı yapacak , uzun basarsan başka bir ayara (sec işlemi ) atlayacak sonunda kayıt yapıp ayar menüsünden çıkacak.
Her konum değiştiğinde butonun bırakılmasını bekleyeceksin yoksa işler karışır. 
Ete

haberlesme

Anladım hocam siz tek butonla ayar işlemini bitirdiniz bana bunun sadece arttır azalt butonlarım oldugu için saat ayarını onaylayıp dakika ayarına yani ssadece set işleminde kullanıcam.Bide hocam elinizde ds1307 ile yapılmış sadece saatin bulunduğu bir uygulama var ise bas dosyasını koyabilir misiniz diğer örneklerde tarih ısı gibi özellikler oldugundan biraz karışık geliyor sade bir programda komut akışını takip etmek istiyorum.

ete

Her taraf buton örneği ile dolu zaten. Ds1307 yi yalnız başına hiç kullanmadım.
Onuda diğer programların içinden çekeceksin artık.
Ete

haberlesme

Çok teşekkürler hocam saati okuyup lcd de gösterme işini hallettim ama ayar menüsü olayını yapamadım birtürlü saat ayarını ekranda göremiyorum saat durmuyor birtürlü RTC ile ilgili yazınıza bakıyorum ayar menüsüne girişte CH bitini 1 yapıyorum ama arttır azalt olayını yaptıramadım artık uğraşıcam.teşekkürler hocam

ete

Ayar menüsü ayrı bir alt program şeklinde olmalı. Orada ekrana saati koyarsın (SAAT:DAK şeklinde)
Gidip RTC yi okumaz ve okuduğunu ekrana vermez isen o saat nasıl çalışacak sorarım sana saat durmuyor diyorsun. Ayar esnasında RTC okuması yapmayacaksınki saat dursun değilmi?
Sonra ;
- IF ARTIR=0 THEN SAAT=SAAT+1
  IF SAAT>23 then saat=0
- IF AZALT=0 THEN SAAT=SAAT-1:IF SAAT=255 then SAAT=23
GOSUB EKRAN (Artırılmış yada azaltılmış değerleri ekrana vermek için)
Pause 100   'tuş gecikmesi
  IF SEC=0 then DAK_AYAR 'sec tuşuna basılırsa dakika ayarına gidersin
GOTO SONRA
İşte basitçe ayar işlemi budur. Aynı şeyleride dakika için yaparsan bal gibi olur. Biraz kafayı çalıştırmak yeterli olacak.
Ete

haberlesme

Çok teşekkürler hocam yardımlarınız zaten inanın tüm amaç kafayı çalıştırıp anlayarak yapmak yoksa sizin birton çalışan programlarınız var bu programları anlamadan direk kopyala yapıştır ortaya çıkarıp ben bişeyler yaptım demek içime sinmiyor.dediklerinizi yapmaya çalışacağım hocam çok teşekkürler.

haberlesme

Hocam dediklerinizden yola çıkarak bişeyler yaptım en azından ayar kısmı çalışıyor.Ama şöyle bir sorunum var rtcden bilgileri okuyorum ayar menüsünden rtc ye yazıyorum pc saatini baz aldıgı için isis ekranında yeni saati görüyorum ama lcd de 02 ise saat 0  sayısı 8 diye görünüyo müsait zamanınız da bir inceler misiniz hocam.

ete

RTC üzerine sağ tıkla açılan properties ekranında bir kutucuk olması lazım. O kutucuk işaretli ise RTC PC saatin ile senkron çalışır.
Kutuya tıklayıp seçimi kaldırırsan seninayarınla çalışır.
Bir kere tıklarsan seçim işareti soru işaretine dönecek. Tekrar tıkla kutu boşalacaktır.

Ete

haberlesme

Hocam dediğinizi yaptım ama şimdide saat 06 diyelim ayar menüsünde onu 09 yapıyorum rtc yaz dedikten sonra 89 olarak çıkıyo saatin oldugu kısım zamanınız varsa üstte pbp dosyası var bakabilirseniz memnun olurum.

haberlesme

Hocam programa  bakabildiniz mi ?

ete

Baktım. Tabiiki hatalar var.
Hata-1:
SEC butonu ile bir yere gider ve orada yeniden SEC butonu kontrolü yapman gerekirse birinci gidişte SEC butonunun bırakılmasını beklemen gerekir. Aksi halde program birinci giilen yerde hemen SEC bıtonuna basılmış farzeder hatta ondan sonra gidilen yerde de SEC botnunun basıldığını algılayabilir.
Daha açık anlatımla,
SEC butonuna bastın henüz bırakmadın. Program hemen AYAR menüsüne atladı. Orada bir kaç satır aşağıda ,
IF SEC=0 THEN GOTO DAK_AYAR diy ebir komut var. Sen daha sec butonunu bırakıncaya kadar program bu komut satırını görür ve dakika ayar menüsüne atlar. Orada da IF SEC=0 THEN PROGRAM_YAZ komutu mevcut ve onuda görerek daha sen elini sec butonundan çekinceye kadar program tekrar geldiği yere döner.
O halde ne yapmak lazım. Her gidilen yerde SEC butonunu bırakıncaya kadar beklemek gerekiyor.
Birinci gidilen yer AYAR menüsü oraya,
WHILE SEC=0:WEND  komutunu yazarsan Sec butonu bırakılıncaya kadar program orada bekler.
Dolayısıyla saat ayarını yaparsın. SOnra SEC tuşuna basıp dakika ayarına geçersin. Bu sefer de dakika ayarında,
WHILE SEC=0:WEN şeklinde bir komut olması lazımki orada da benzer olaylar olmasın.
Sonunda dakika ayarınıda yaparsın ve SEC butonuna basarak ayarları kayıt edersin.

Hata-2:
Kestirmeden gidip kayıt işini direk Goto Zaman_YAZ komutu ile halletmeye çalışmışsın. Peki hiç düşündünmü ZAMAN_YAZ alt programından nasıl geriye dönülüyor. Satırların sonuna birde GOTO ZAMAN_OKU yazmışsın. buda programı Zaman Oku etiketine atlatıyor. Ama oradan dönüş maalesef RETURN komutuile yapılıyor. Peki Retürn ile dönmek için oraya Gosub ile gelmek gerekir idi. Sen ne ile geldin? GOTO AYAR komutu ile geldin ama RETURN ile dönüyorsun. İşte bu komut hatası stack taşmasına sebep olur ve program bir müddet sonra sapıtıp kilitlenir.  O halde ne yapmak gerek. Goto ile gidilen yerden goto ile dönmek gerekir deyip, Kayıt adı altında bir alt program yaratmak en doğrusu olur.
Dakika ayarından programı KAYIT etiketine göndermek ve orada , Gosub Zaman_Yaz ardından Gosub Zaman Oku ve ardından SEC tuşuna hala basılıyormu kontrol edip sonra programı BASLA etiketine göndermek gerekirdi.

Hata-3:
Zaman Yaz kısmında Saat.7=1 şeklinde bir komut var. BU saat değerini 128 artırır. Bunu istemeyiz o nedenle saat değerin kayıt yapıldıktan sonra 92 falan gösteriyor. Onu silersen düzelecektir. Saat değeri 23'ü aşamaz öyle değilmi?

Programın düzelmiş hali aşağıdadır.
BASLA:
    IF  SEC=0 THEN GOTO AYAR
    GOSUB ZAMAN_OKU
    GOTO BASLA       

   
AYAR:
     WHILE SEC=0:WEND
     PAUSE 50
AYARBIR:     
    SN=0
    IF ARTIR=0 THEN SAAT=SAAT+1
    IF SAAT>23 then saat=0
    IF AZALT=0 THEN SAAT=SAAT-1
    IF SAAT=255 then SAAT=0 
    Pause 200
    lcdout $FE,$81,"SAAT:",DEC2(SAAT),":",DEC2(DAK),":",DEC2(SN)
    IF SEC=0 THEN GOTO DAK_AYAR
    GOTO AYARBIR

   
DAK_AYAR:
    WHILE SEC=0:WEND
    PAUSE 50
   
DAKBIR:   
    IF ARTIR=0 THEN DAK=DAK+1
    IF DAK>59 THEN DAK=0
    IF AZALT=0 THEN DAK=DAK-1
    IF DAK=255 THEN DAK=0
    PAUSE 200
    lcdout $FE,$81,"SAAT:",DEC2(SAAT),":",DEC2(DAK),":",DEC2(SN)
    IF SEC=0 THEN KAYIT
    GOTO DAKBIR

KAYIT:
      LCDOUT $FE,1
      GOSUB ZAMAN_YAZ
      GOSUB ZAMAN_OKU
      WHILE SEC=0:WEND
      PAUSE 50
      GOTO BASLA
     
               
ZAMAN_OKU:
    I2CRead RTC_DTA,RTC_CLK,$D0,$00,[SN,DAK,SAAT,HGUN,GUN,AY,YIL,TEMP]
    BOS=((sn>>4) & $0F)*10+(SN & $0F):sn=BOS
    BOS=((DAK>>4) & $0F)*10+(DAK & $0F):DAK=BOS
    BOS=((SAAT>>4) & $0F)*10+(Saat & $0F):SAAT=BOS
    BOS=((GUN>>4) & $0F)*10+(GUN & $0F):GUN=BOS
    BOS=((AY>>4) & $0F)*10+(AY & $0F)  :AY=BOS
    BOS=((YIL>>4) & $0F)*10+(YIL & $0F):YIL=BOS
    lcdout $FE,$81,"SAAT:",DEC2(SAAT),":",DEC2(DAK),":",DEC2(SN)
    LCDOUT $FE,$C0,"TARIH:",dec2(gun),"/",dec2(ay),"/",dec2(YIL)
    RETURN
           
     
ZAMAN_YAZ:
        TEMP=(SN DIG 1)<<4+SN DIG 0:SN=TEMP
        TEMP=(DAK DIG 1)<<4+DAK DIG 0:DAK=TEMP
        TEMP=(SAAT DIG 1)<<4+SAAT DIG 0:SAAT=TEMP
        TEMP=(GUN DIG 1)<<4+GUN DIG 0:GUN=TEMP
        TEMP=(AY DIG 1)<<4+AY DIG 0:AY=TEMP
        TEMP=(YIL DIG 1)<<4+YIL DIG 0:YIL=TEMP
        MEM=$10
        I2CWrite RTC_DTA,RTC_CLK,$D0,$00,[SN,DAK,SAAT,HGUN,GUN,AY,YIL,MEM]
        PAUSEUS 10
        return     

Ete

haberlesme

Hocam yine sizi uğraştırdım çok teşekkür ederim.Burdan sonra tarih ayarını yapma kısmını kendim yapacağım.Size sadece sormak istedigim ayar menüsüne geçince saat ayardan ayar yaptıgın kursorün altında çizgi yada yakson şeklinde nasıl yapabilirim ayar menüsüne geçildigi belli olması amacıyla

ete

Kursör kullanmanın prensibi şöyle;
- Kursörü yazılacak yere getir   "......12:35:00......" şeklindeki bir yerleşimde saat ayarı yapacak isek kursör 2 nin altına getirilmelidir. Diyelimki 1. satırdayız o halde2 karekterinin adresi  $86 dır.
LDOUT $fe,$86
- bu aşamadan sonra altı çizgili kursörü aktive et. KOmutu lcdout $fe,$0E dir.  O halde yukarıdaki komutun peşine bunu yazmamız gerekecek ,  LDOUT $fe,$86, $FE,$0E
- Kursörü görebilmek amacı ile 120 ms lik bir gecikme koyarız.
LDOUT $fe,$86, $FE,$0E:Pause 120
- Daha sonra kursörü kapatıp bir 120ms lik gecikme daha koyarak kapanmış halini görürüz. Komut lcdout $fe,$0C dir.
LDOUT $fe,$86, $FE,$0E:Pause 120:LCDOUT$FE,$0C:PAUSE 120   komut satırının son hali bu oldu.
- Bu aşamadan sonra artır azalt komutlarını verip değişen değeri ekrana yazdırırsın.
Şayet yanıp sönen değilde sabit çizgili kursor kullanmak istersen, aynı şekilde kursörü yazı yazılaak yere getirirsin.
Ardından kursörü açarsın. (LCDOUT $FE,$0E) işin bitince kapatırsın (LCDOUT $FE,$0C)

Ete


haberlesme

Hocam çok teşekkürler o kısmıda hallettim şimdi tek iş aynılarını tarih ayar kısmınada uygulamaktaa bunu bitirip çalışır hale getirince artık bir üst seviye 7 seğmentde göstermeyi denicem hocam.Hocam işin içine 7 Seg girince mantık lcd kısmını 595 aktar kısmı alıyor.geriside tablodan deger almak oluyo hrlde.

Powered by EzPortal