Menü geçişlerini yapamıyorum

Başlatan erdemefe, 22 Şubat 2015, 02:49:43

erdemefe

Arkadaşlar Merhaba,

Başladığım bir projede kontrol olarak sadece butonlu bir encoder, çıktı olarak da 4x20 LCD kullanıyorum. Bu nedenle butona birden fazla görev eklemem lazım. Butona bir kere basınca ayar menüsünde encoder ile ileri geri gezmek, ilgili menüdeyken butonla menu içine girip ayarları yapmak ayar ekranında da butona basılı tutulduğunda da menüye geri dönmek istiyorum. İşte tam burada sorun yaşıyorum. butona basılı tutunda MENU_SEC etiketinde de butonun durumunu kontrol ettiği için aynı yere geri dönüyor. WHILE SW=0 : WEND gibi birşey yazınca da butona basıldığında etiket içerisinde beklediği için tekrar butona basıldığında menuye geçmiyor.

Kodlardaki ART=1 olursa encoder bir tık hareket etti demek, YON=0 ise sağa, YON=1 ise sola demek, CLS etiketi ekranı temizliyor.

Şu anda sadece bir tane menü yapmaya çalışıyorum, AYAR1 etiketinde butona kısa basılırsa  flagi 1 ya da 0 yaparak, farklı değişkenlerin değerlerini ayarlıyorum. O kısımda sorun yok tek sorun AYAR1 etiketinde butona fazla basılı tutulursa MENU_SEC etiketine dönmede bu konuda yardımlarınızı rica ederim

MENU_SEC:
IF YON=0 AND ART=1 THEN
MENU=MENU+1 : IF MENU=5 THEN MENU=0
ART=0 : GOSUB CLS
ENDIF
IF YON=1 AND ART=1 THEN
MENU=MENU-1 : IF MENU=255 THEN MENU=4
ART=0 : GOSUB CLS
ENDIF

SELECT CASE MENU
CASE 0
GOSUB MENU0
CASE 1
GOSUB MENU1
IF SW=0 THEN : GOSUB CLS : GOTO AYAR1
CASE 2
GOSUB MENU2
CASE 3
GOSUB MENU3
CASE 4
GOSUB MENU4
END SELECT   
GOTO MENU_SEC
'-------------------------------------------------------------------------------
MENU1:
LCDOUT $FE,$80," KARISTIRICI DONME"
LCDOUT $FE,$C0,"   HIZI AYARLARI"
LCDOUT $FE,$D4,"      ",1,"  OK  ",2
RETURN
'-------------------------------------------------------------------------------
AYAR1:
LCDOUT $FE,$80,"   DONME HIZI(%)"

IF SW=0 THEN
WHILE SW=0
CNT=CNT+1 : FOREND=1250 : GOSUB DELAY
    IF CNT>1000 THEN CNT=0 : GOSUB CLS : GOTO MENU_SEC
WEND
TOGGLE MENU_F
ENDIF

IF MENU_F=0 THEN
LCDOUT $FE,$C0,0,"ALT KRS=%",DEC3 DUTYA
LCDOUT $FE,$94," UST KRS=%",DEC3 DUTYB
    IF YON=0 AND ART=1 THEN
    DUTYA=DUTYA+1 : ART=0 : IF DUTYA=101 THEN DUTYA=100
    ENDIF
    IF YON=1 AND ART=1 THEN
    DUTYA=DUTYA-1 : ART=0 : IF DUTYA=255 THEN DUTYA=0
    ENDIF
ELSE
LCDOUT $FE,$C0," ALT KRS=%",DEC3 DUTYA
LCDOUT $FE,$94,0,"UST KRS=%",DEC3 DUTYB
    IF YON=0 AND ART=1 THEN
    DUTYB=DUTYB+1 : ART=0 : IF DUTYB=101 THEN DUTYB=100
    ENDIF
    IF YON=1 AND ART=1 THEN
    DUTYB=DUTYB-1 : ART=0 : IF DUTYB=255 THEN DUTYB=0
    ENDIF
ENDIF

GOTO AYAR1
'-------------------------------------------------------------------------------

ete

Yazdıklarını çok fazla anlamlı bulamadım. Bu nedenle onları çözmek yerine olması gerekeni açıklayacağım.
Bu işte temel mantık şöyle olmalı. Bir menü alt programına girdik diyelim. Elimizde 4 adet menü seçeneği var.  Encoder yalnızca yalnızca bu seçenekler arasında dolaşmanı sağlamalı. Sağa çevirdikçe seneklerde aşağı doğru hareket edip seçenek değiştirmeli, sola çevirdikçe tersini yapmalı. Bir seçenekte durduğun zaman butona basılarak o seçenek seçilmelidir. Buton yalnızca seçeneği seçmene yardımcı olacaktır. Diyelim ki 2 nolu seçenektesin ve butona bastın. Otomatikman program 2 nolu seçenek menüsüne atlayacaktır. Burada butona hala basılıyormu kontrol edeceksin. Zira basarak geldin. Butona , burada ikinci bir görev verecek isek basma kontrolü yapılması gerekiyor.
Buraya kadar her şey normal gözüküyor. Şimdi menüden çıkma konusuna geri dönelim.
4 konumlu menü seçeneklerinde dolaşırken buton bize seçme işini yaptıracak idi. Aynı zamanda fazla basarak menüden çıkma fonksiyonunuda kullanacak isek o zaman basma kontrolü yapılan yerde birde sayaç çalıştırmakta yarar var. Şöyle olmalı,
If sec=0 then
Sayac=0
While sec=0
  Sayac=sayac+1
  If sayac=1000 then CIKIS
Wend
Select case menu
Case ...
...
..
Endif

Böylece butonu çabuk bırakırsan (sayaç değeri 1000 olmadan) program ilgili menü seçeneğine atlayacak uzun basarsan yani sayac=1000 olduğunda program menüden çıkışa gidecektir.
Böylece istediğin olur herhalde.
Ete

Powered by EzPortal