Proton da Menü oluşturma

Başlatan devrim35, 18 Şubat 2011, 10:33:56

devrim35

Arkadaşlar bende menü oluşturmak için ne yapmam gerektiğini bilmiyorum.Aşağıdaki linkteki açılan konu benim istediğim tarzda ama picbasicde yazılmış.ben proton kullanıyorum ..bunun proton da yazılmış olan kodları varmı veya bu konuda bana yardım edebilirmisiniz...
Bir soru daha var aklımda İf kullandığım vakit 1 den fazla şartım olursa bunu nasıl protonda yazabilirim??
Örnek
Dim X As PortC.1
Dim Y As PortC.3
Dim Z As PortC.0

X=1 iken Y=0 iken Z=1 iken "Merhaba" yaz..gibi..
Yardımlarınız için teşekkür ederim..

https://www.picproje.org/index.php?topic=28667.0

ibrsel

if X=1 And Y=0 and Z=1 Then Print at 1,1,"MERHABA"

ete

Öncelikle belirteyim verdiğin linkte  zaten protonda yazılmış örnek var.
İkincisi programlama mantığını öğrenmek yerine kopyalama mantığı ile hareket ederseniz her şeyi sormak zorunda kalırsınız.
Ben şahsen böyle sorular görünce üzülüyorum. O kadar basitki işin mantığı . Buraya açıklıyorum.
IF bir şart komutudur.
IF A=1 THEN B=1 şeklinde bir komut dizisinde A=1 ise B=1 yapılır değilse kesinlikle B ye dokunulmaz.
Şimdi şart komutunu ikiye çıkartalım.
IF A=1 ve B=2 THEN C=3   Burada A=1 ve B=2 ise ancak C=3 yapılır. A ve B den her hangi biri verilen şarta uymaz ise C nin değeri değişmez.
Bu ifadeyi şöylede yazabilirdik;
IF A=1 THEN
    IF B=2  THEN  C=3
ENDIF
Burada da durum değişmiyor. Önce A=1 mi ona bakılır. Değilse satırların tamamı atlanarak B ye bile bakılmaz. A=1 ise bu sefer B=2 mi ona bakılır ve şayet B=2 ise C=3 yapılır. B=2 değil ise C ye dokunulmadan bu komut atlanır.

Şart sayısı istediğiniz kadar artırılabilir.
IF A=1 ve B=2 THEN C=3  ifadesinin program kodları ile yazımında yalnızca ve ifadesini AND ile değiştirmek yeterli olacaktır.
Şimdi gelelim senin örneğine;
"X=1 iken Y=0 iken Z=1 iken "Merhaba" yaz..gibi.."
IF X=1 and Y=0 and Z=1 THEN
    LCDOUT $fe,$02,"Merhaba"
ENDIF
şeklinde yazılırsa iş hallolacak. Bir başka şekilde;
IF X=1 THEN
   IF Y=0 THEN
      IF Z=1 THEN
          LCDOUT $fe,$02,"Merhaba"
      endif
    endif
endif
Bu şekilde de yazılırsa sonuç doğru olacaktır.
Gördüğün gibi çok zor değil ama nedense bu mantığı yürütmekte zorlanıyorsun. Çünki merdivenleri atlayarak yukarı çıkmak istiyorsun.

Menü yaratma işleminin çoğunluğunu ekran düzeni teşkil eder.
Elinde 2 satırlık eran var ise;
1. Satıra diyelimki "Volum Artır"
2. Satıra diyelimki "Volum Azalt"
yazdırdın.
Hemen ardından Kursörü yeniden 1. satırın sonuna aldın. (LCDOUT $fe,$8A komutu bunu yapacaktır)
İşte bu konumda ;
IF ARTIR =0 then GOSUB VOLUM_ARTIR  demen işini çözecektir. Yani bu satırda iken şayet artır tuşuna basılmış ise git volumu artır
değilse bu satır atlanacak ve hemen altına bu seferde 2. satırı test eden bir satır yazacaksın.
LCDOUT $fe,$CA bu komut kursorü 2. satırın sonuna alacak
IF AZALT=0 then GOSUB VOLUM_AZALT  şeklinde bir komutlada volumu azaltacaksın.
Bu aşamada yeniden başa dönerek 1. satırı ve ardından 2. satırı test edebilirsin.
Bu komutların arasına birde satırlardan ayrılmak için;
IF SEC=0 then RETURN gibi bir komut koyarsan bir başka tuşa basarak bu menü seçeneğinden çıkmış olursun.
Bunlar gördüğün gibi çok basit işler. Biraz kafa çalıştırmakla işi aşabilirsin.

Kolay Gelsin
Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ibrsel

Sayın @ETE hocam..İnanın gönüllerde taht kutuyorsunuz..Özveri içerisinde bu kadar açıklayıcı mesajlar yazarak arkadaşlara yardımcı oluyor ayrıca insanların mikrodenetleyicilerden korkmadan severek uğraşmalarında bir tetikleyici oluyorsunuz..Bende sizin derslerinizle çalışmaya başlamış bir öğrenciniz olarak  Sonsuz teşekkür ediyorum..  Allah Razı olsun..
..İyi çalışmalar..

devrim35

Yardımlarınız için teşekkür ederim...
Kusura bakmayın hocam yeniyim bu konuda :)..Örnek olmadan anlayamıyorum :)..Anlattığınız menü oluşturmayı anlayamadım ama örnekleyerek açıklarsanız pratiğini bende yapar daha iyi pekiştiririm...Tşk ederim..

ibrsel

Bir değişkeni kontrol ederek kendi menu düzenlemenizi yapabilirsiniz..Basitçe örnek vereyim ..
dim m as byte  '' m isminde bir değişken tanımla
      m=0           '' bu değişkenin ilk değeri 0 olsun
basla:
   if ayar=1 then  '' ayarla butonuna basıldığında 
       m=1             '' m değişkenini 1 yap.. İlk menu seçeneğimiz olacak
       goto menu 
  endif
goto basla

menu:
  while m=1    '' m=1 olduğu sürece döngüde kal
      print at 1,1,"MENU 1"  
      if ayar=1 then m=2    '' ayar butonuna basıldığında 2. menu ayarına geç
  wend
  while m=2
      print at 1,1,"MENU 2"  
      if ayar=1 then     '' ayar butonuna basıldığında menuden çık
        m=0
        goto basla
  wend

goto menu

omereliusuk

If MENUPIN=0 Then
AMENU=AMENU+1 
If AMENU>4  Then AMENU=1
GoSub ARKSONDUR
EndIf


Cursor 1,3 :Print "ZAMANI AYARLA" 
Cursor 2,3 :Print "DiGER AYARLAMALAR"
Cursor 3,3 :Print "SiSTEMi CALISTIR"
Cursor 4,3 :Print "BASLANGIC AYARLARI"
X=AMENU :GoSub KEYS


If AMENU=1 And ENTER=0 Then  '1. MENU ZAMAN AYARLAMALARI
SAYI=0  :GoSub ARKSONDUR :Cls :DMENU=1 :GoTo MENU1:EndIf
If AMENU=2 And ENTER=0 Then  '2. MENU DIGER AYARLAMALAR
SAYI=0  :GoSub ARKSONDUR:Cls:DMENU=1:GoTo MENU2:EndIf

If AMENU=3 And ENTER=0 Then 'SISTEMI ÇALIŞTIR
GoSub ARKSONDUR
Cls
'TEKKULLAN=$AA 
GoTo EPROM
EndIf

If AMENU=4 And ENTER=0 Then  '3. MENU BASLANGIC AYARLARI
SAYI=0  :GoSub ARKSONDUR:Cls:DMENU=1:GoTo MENU3:EndIf 
GoTo ANAMENU
End

KEYS:
Select Case X
Case 0  :Cursor 1,1 :Print "  "     :Cursor 2,1:Print "  "     :Cursor 3,1:Print "  "     :Cursor 4,1:Print "  "
Case 1  :Cursor 1,1 :Print ">>"     :Cursor 2,1:Print "  "     :Cursor 3,1:Print "  "     :Cursor 4,1:Print "  "
Case 2  :Cursor 1,1 :Print "  "     :Cursor 2,1:Print ">>"     :Cursor 3,1:Print "  "     :Cursor 4,1:Print "  "
Case 3  :Cursor 1,1 :Print "  "     :Cursor 2,1:Print "  "     :Cursor 3,1:Print ">>"     :Cursor 4,1:Print "  "
Case 4  :Cursor 1,1 :Print "  "     :Cursor 2,1:Print "  "     :Cursor 3,1:Print "  "     :Cursor 4,1:Print ">>"
EndSelect
Return


ARKSONDUR:
For W=1 To 200
DelayMS 2
Next
Return

devrim35

Alıntı yapılan: ibrsel - 18 Şubat 2011, 20:38:48
Bir değişkeni kontrol ederek kendi menu düzenlemenizi yapabilirsiniz..Basitçe örnek vereyim ..
dim m as byte  '' m isminde bir değişken tanımla
      m=0           '' bu değişkenin ilk değeri 0 olsun
basla:
   if ayar=1 then  '' ayarla butonuna basıldığında 
       m=1             '' m değişkenini 1 yap.. İlk menu seçeneğimiz olacak
       goto menu 
  endif
goto basla

menu:
  while m=1    '' m=1 olduğu sürece döngüde kal
      print at 1,1,"MENU 1"  
      if ayar=1 then m=2    '' ayar butonuna basıldığında 2. menu ayarına geç
  wend
  while m=2
      print at 1,1,"MENU 2"  
      if ayar=1 then     '' ayar butonuna basıldığında menuden çık
        m=0
        goto basla
  wend

goto menu

Hocam  yaptığını anladım ama ayar butonun basdığım zaman 2 ileriye gidiyor..yanii menu 1 yazısı çıkıyor ayar butonun basıyorum ve menu 3 e geçiyor,menu 2 nin saliselik görüntüsünü görüyorum.Acaba Delayms komutu ile  butonun geçme süresini azcık mikrosaniye olarak arttırmalımıyım..

devrim35

Alıntı yapılan: omereliusuk - 18 Şubat 2011, 23:20:18
If MENUPIN=0 Then
AMENU=AMENU+1 
If AMENU>4  Then AMENU=1
GoSub ARKSONDUR
EndIf


Cursor 1,3 :Print "ZAMANI AYARLA" 
Cursor 2,3 :Print "DiGER AYARLAMALAR"
Cursor 3,3 :Print "SiSTEMi CALISTIR"
Cursor 4,3 :Print "BASLANGIC AYARLARI"
X=AMENU :GoSub KEYS


If AMENU=1 And ENTER=0 Then  '1. MENU ZAMAN AYARLAMALARI
SAYI=0  :GoSub ARKSONDUR :Cls :DMENU=1 :GoTo MENU1:EndIf
If AMENU=2 And ENTER=0 Then  '2. MENU DIGER AYARLAMALAR
SAYI=0  :GoSub ARKSONDUR:Cls:DMENU=1:GoTo MENU2:EndIf

If AMENU=3 And ENTER=0 Then 'SISTEMI ÇALIŞTIR
GoSub ARKSONDUR
Cls
'TEKKULLAN=$AA 
GoTo EPROM
EndIf

If AMENU=4 And ENTER=0 Then  '3. MENU BASLANGIC AYARLARI
SAYI=0  :GoSub ARKSONDUR:Cls:DMENU=1:GoTo MENU3:EndIf 
GoTo ANAMENU
End

KEYS:
Select Case X
Case 0  :Cursor 1,1 :Print "  "     :Cursor 2,1:Print "  "     :Cursor 3,1:Print "  "     :Cursor 4,1:Print "  "
Case 1  :Cursor 1,1 :Print ">>"     :Cursor 2,1:Print "  "     :Cursor 3,1:Print "  "     :Cursor 4,1:Print "  "
Case 2  :Cursor 1,1 :Print "  "     :Cursor 2,1:Print ">>"     :Cursor 3,1:Print "  "     :Cursor 4,1:Print "  "
Case 3  :Cursor 1,1 :Print "  "     :Cursor 2,1:Print "  "     :Cursor 3,1:Print ">>"     :Cursor 4,1:Print "  "
Case 4  :Cursor 1,1 :Print "  "     :Cursor 2,1:Print "  "     :Cursor 3,1:Print "  "     :Cursor 4,1:Print ">>"
EndSelect
Return


ARKSONDUR:
For W=1 To 200
DelayMS 2
Next
Return
Açıklamalı olarak yapsaydınız daha iyi olurdu :)...Yinede emeğiniz için sağolun..

ete

Devrim35,

İlk mesajında şart komutlarının nasıl kullanılacağını sormuş olduğun için bende onları detaylı açıklamak ihtiyacını duymuş idim.
Sonra konu başlığına bakarak da basitçe menü nasıl oluşturulur anlatmış idim.
Normal şartlarda biraz programlama bilgisi olan bir kişi bu açıklamalar ile kendi menüsünü oluşturabilirdi. Ancak zorlandığını görüyorum.
Bunun sebebi programlama bilginin yetersiz olması elbette. Sorarak bir yere kadar ilerlersin ama bu yaptığın merdiven basamaklarını üçer beşer atlamak oluyor. Bu ise yerinde tutunmanı güçleştiriyor. Burada her kes sen anlayasın diye her şeyi en ufak detayına kadar yazamaz. Bunu istemek insafsızlık olur. Sorman güzel bir şey ama sürekli örnek istemen güzel değil.!!!!
Yapman gereken şu, Yayınladığım dersler var ya onları yükle toplam 13 ders. Basitten zora doğru  anlatım var. Hemen hemen piclerin bütün özelliklerini örnek programlarla açıklayan dersler bunlar. 1. dersten itibaren oturup çalışacaksın. Yaklaşık 5-6. derslerden sonra artık açıklananları daha kolay anlayacaksın.  Derler PBPro ya göre verilmiştir ama Proton ile çok yakındır komutları. Kolaylıkla adapte edebilirsin kendine.
Tavsiyem oturup en kısa sürede çalışmaya başlaman ve kendini geliştirmen olacaktır.
O zaman genel anlamda menü nasılyapılır diye sormayacak daha spesifik olarak Menü oluşturmada şöyle yazdım ama böyle çıkıyor gibi sorular soracaksın ve bunlarada cevaplar alıp kendini daha kolay geliştirebileceksin.

Derslerin Linkini veriyorum;
http://www.4shared.com/file/JeKE5aho/BASIC-DERS.html 
veya 
http://www.upload.gen.tr/d.php/www/orkhzl2q/BASIC-DERS.rar.html

Daha spesifik sorularını bekliyoruz.

Kolay Gelsin
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ibrsel

#10
Alıntı YapHocam  yaptığını anladım ama ayar butonun basdığım zaman 2 ileriye gidiyor..yanii menu 1 yazısı çıkıyor ayar butonun basıyorum ve menu 3 e geçiyor,menu 2 nin saliselik görüntüsünü görüyorum.Acaba Delayms komutu ile  butonun geçme süresini azcık mikrosaniye olarak arttırmalımıyım..

Öncelikle ETE hocamın dediği gibi sitede bulunan Basic derslerini inidirip çalışmanı öneririm..İşin mantığını oaradan okuyup,proteusta uygulayarak çok çabuk kavrarsın..Ben de dahil bir çok arkadaşımız O dersler ile programlama mantığını geliştirmiştir..

Gelelim verdiğim örneğe;
Ben sadece mantığını basitçe anlamaya çalışmıştım..Butona basma beklemesini istediğiniz gibi verebilirsiniz.. Ben genelde 100ms gibi bir değer kullanıyorum..
  if ayar=1 then   '' ayar butonuna basılmış ise 
    delayms 100   '' 100 ms bekle
    m=2                '' menu değişkenini 2 olarak ata.. 2. menüye geçiş için
  endif


şeklinde düzenleme yapabilirsin..

yada ; butona basıldığı sürece beklesin,buton bırakılınca işlem yapsın isteresen aşağıdaki mantığı kullanabilirsin..

  
Dim b as byte               '' butonun bırakıldığını anlama değişkeni   
Dim m as byte              '' menu değişkeni
Symbol ayar=portb.0   '' ayar butonu hangi porta bağlı ise ..
  b=0 : m=0 
''----------------------------------
Basla:
    print at 1,1,"MENU SECiMi"  
   Gosub Buton_kontrol
Goto Basla
''----------------------------------
Buton_kontrol:
  while ayar=1  ''' ayar butonuna basılı olduğu sürece döngüde kal
       b=1
   wend
   if b=1 then 
      b=0 
      m=m+1
      Goto menu
   endif
Return
''----------------------------------
menu:
    while m=1           '' m=1 olduğu sürece 1. Menude kal
        print at 2,1," MENU <1>"
        Gosub Buton_kontrol   
    wend
    while m=2        '' m=2 olduğu sürece 2. Menude kal
        print at 2,1," MENU <1>"
        Gosub Buton_kontrol   
    wend
    if m>=3 then    '' m 3 ise veya 3 den büyükse m yi 0 la basa dön.
       m=0 : b=0
       Goto Basla
   endif
goto menu

omereliusuk

hocam eksikleri tamamlayın
sistem çalışır. eksikten kastım byte tipi değişken eksiği varsa + goto menu1 mesela oraya
menu1:
goto anamenu

menu2:
goto anamenu

menu3:
goto anamenu
leri ekleyin bir deneyin.

maksat çalıştığını ve mantığını görmekse eğer çok  zamanınızı almaz kanısındayım.

bu menüye bayağı uğraşmıştım. gayette verimli çalışıyor. direkt kestim yapıştırdım çünkü


devrim35

Arkadaşlar sağolun yardımlarınız için..Ete hocam verdiğiniz kaynağı indirdim ve kaç gündür okuyorum ve çok yardımcı oluyor..Ayrıca bir sürü döküman var bende ama dediğim gibi sizinki daha anlaşılır..while..wend case..select bu komutları anlıyorum artık ve daha önceki problemimi bu komutları anladıktan sonra çözdüm..Takdir edersinizki sorularımda ona göre artacaktır  :) ..Özellikle komutlar üzerine çünkü ben proton+ kullanıyorum sizinki picbasic ile.. mesela internetten de araştırdım ama ders6 da bulunan saat projesindeki "timer,wdt,dahili oslatörü kullanma" gibi komutlarını proton+ da yazamadım..doğal olarakta projeyi teori dışında anlayamadım.. bu konuda yardımcı olurmusunuz??..teşekkür ederim..


ete

Bahsini ettiğin komutlar FUSE yani sigorta ayarları diye isimlendiriliyor. Bütün derleyiciler de vardır ancak kullanım şekli yada yazım şekli farklıdır.
Proton da sigorta yada Fuse yada Config (Configurasyondan gelir)  ayarlarına bakıver.

Ete


Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

devrim35

#14
Eyvallah ete hocam....

Proton plus kullanan arkadaşlar için belki lazım olabilir..

Config PWRTE_OFF  'power on timer kapalı , WDT_OFF      'watch dog timer kapalı , INTRC_OSC_CLKOUT  'dahili osilatör veya INTRC_OSC_NOCLKOUT 'dahili osilatör devre dışı..