bir tusa birden çok komut atamak

Başlatan ywzslm, 09 Eylül 2008, 01:58:35

ywzslm

pic basic pro da tek tus kullanarak 2 yada daha fazla komutu nasıl oluşturabilirim
örnek olarak;tusa bir defa basılınca portb=%00001111 de ki ledler yanıcak,iki defa basılınca portb=%00001010 da ki ledler yanacak,üç defa basılınca portb=%00001100 da ki ledler, olarak ama tek giriş pini kullanmak istiyorum yardım ederseniz sevinitim.
şimdiden yardımı geçen herkese çok teşekkürler
olgulardaki olgunluk biziz

ywzslm

bunun üzernde çalıştım olmadı aynı mantık diyebilirz

TRISA=255
TRISB=%00000000

SYMBOL TUS0=PORTA.0
SYMBOL TUS1=PORTA.1

SYMBOL LED0=PORTB.0
SYMBOL LED1=PORTB.1
SYMBOL LED2=PORTB.2
SYMBOL LED3=PORTB.3


BASLA:
SAYI   VAR   BYTE
PORTB=0
SAYI=0
IF TUS0=1 then SAYI=SAYI+1
IF TUS1=0 THEN SAYI=SAYI-1
PAUSE 100

PROGRAM1:
PORTB=%00001111
PAUSE 50

PROGRAM2:
PORTB=%00001100
PAUSE 50

PROGRAM3:
PORTB=%00000011
PAUSE 50

GOTO BASLA
END
olgulardaki olgunluk biziz

OG

Ya "şu kadar süre içinde kaç defa basılmış" olarak bakacaksın ya da tuş basma aralıklarını referans alacaksın ki arkası gelecekmi anlasın. Aşağıdaki 3 sn içindeki basma sayısına göre



;;;; yaklaşık 3. sn içindeki basma sayısına bakan program örneği ;;
define OSC 4
trisb=0
trisa=255

'cmcon=7

tus var porta.1 ' Porta.1 ile gnd arası 1K direnç bağlı ve +5V ile porta.1 arasında buton bağlı

tus2 var porta.0 ' Porta.0 ile gnd arası 1K direnç bağlı ve +5V ile porta.0 arasında buton bağlı (opsiyonel, çıkışı sıfırlamak için)


basilan var byte
x var byte
x2 var byte

basilan=0
portb=0
x2=0


Basla:     
    basilan=0
    x2=0    
    if tus2=1 then portb=0 ' çıkışı sıfırlamak için 
    if tus=0 then Basla

arttir:
    basilan=basilan+1
arttir2:    ' buton hala basılı ise bekler
    pause 30
    x2=x2+1
    if x2>100 then cikis_ver
    if tus=1 then arttir2



for x=x2 to 100  ' 3sn içinde (30x100=3000ms)
    if tus=1 then gosub arttir3
    pause 30
next

cikis_ver:
    if basilan=1 then portb=%00001111
    if basilan=2 then portb=%00001010
    if basilan=3 then portb=%00001100

bekle:   ' buton hala basılı ise bekler
    pause 50
    if tus=1 then bekle

Goto Basla




arttir3:
    basilan=basilan+1
arttir4:    ' buton hala basılı ise bekler
    pause 30
    x=x+1
    if x>100 then cikis_ver
    if tus=1 then arttir4
return
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ywzslm

çok teşekkür ederim gecenin bu saatinde sizide yordum tüm yorumları değerlendireceğim
olgulardaki olgunluk biziz

OG

FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ywzslm

söylediğiniz gibi hazırladım devreyi fakat bir türlü olumlu sonuç alamadım acaba bir kod hatası mı yapıyorum yoksa herhangi bir devre elemanı hatası mı anlamadım üst tusa bir kere basıldığında herhangi bir değişiklik meydana gelmiyor


proteus dosyası; http://rapidshare.com/files/143750238/arast__305_r.rar.html

şimdiden emeği geçen herkese teşekkür ederim
olgulardaki olgunluk biziz

OG

http://rapidshare.com/files/143753555/arast__305_r.zip

FREKANS 1MHz de kalmış. Üstteki dosyaya bakın.

Üst tuş ışığı söndürmek için.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ete

Aslında çok basit bir programı zora sokmuşsun. Programında bazı hatalar var. Onları düzeltince çalıştı. kod aşağıdadır.

Ete


Basla:
      if tus2=1 then ' çıkışı sıfırlamak için
         portb=0
         basilan=0
      endif
      if tus=1 then 
         basilan=basilan+1
         while tus=1:wend
         pause 100
         if basilan>3 then basilan=0
      endif

cikis_ver:
      if basilan=0 then portb=0
      if basilan=1 then portb=%00001111
      if basilan=2 then portb=%00001010
      if basilan=3 then portb=%00001100

      pause 50

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

ywzslm

çok teşekkür ederim sayenizde birşeyler daha öğrendim ellerinize sağlık
olgulardaki olgunluk biziz

erkan614


707yunus

portb=0
basla:
     if  (portb=0 && tus=1) then portb=%00001111
     if (portb=%00001111 && tus=1)  then portb=%00001010
     if (portb=%00001010 && tus=1) then portb=%00001100

goto basla

ywzslm

Alıntı yapılan: "707yunus"portb=0
basla:
     if  (portb=0 && tus=1) then portb=%00001111
     if (portb=%00001111 && tus=1)  then portb=%00001010
     if (portb=%00001010 && tus=1) then portb=%00001100

goto basla

kod için teşşekür ederim kodu biraz açıklar mısın özeliklede && işareti ve anlamını
olgulardaki olgunluk biziz

Tagli

Belli süre içinde basmayı dikkate almayan bir program. Düğmeye her basışta bir sonraki duruma geçiyor. "tus" değişkeni düğmenin girdisini okuduğun değişken. && işareti AND anlamına geliyor ama kod yarım gibi (sanırım sadece örnek olması açısından bir kısmı verilmiş), IF'li kısımlarda en son olarak 0'a geri dönme durumunun da olması gerekir. Programın yaptığı şey şu: Eğer düğmeye basılmışsa PORTB'nin eski durumuna bak, ona göre PORTB'ye yeni bir değer ver. Tüm durumlarda && tus=1 kullanıldığına göre bu şartı döngünün başında ayrı olarak kontrol etmek programın verimini arttıracak ve derlenen asm kodunun da kısalmasını sağlayacaktır. Gerçi basit bir uygulamada fazla verime gerek yoktur o da ayrı mesele...
Gökçe Tağlıoğlu

ywzslm

şu an için uğraştığım projenin son hali ve kodaları şu şekilde:


kodlar;

TRISB=0
TRISB=255

tus var porta.0  
SYMBOL LED1=PORTB.0
SYMBOL LED2=PORTB.1
SYMBOL LED3=PORTB.2
SYMBOL LED4=PORTB.3
SYMBOL LED5=PORTB.4
SYMBOL LED6=PORTB.5
SYMBOL LED7=PORTB.6
basilan var byte

basilan=0
portb=0

BASLA:
     if tus=1 then
        basilan=basilan+1
        while tus=1:wend
        pause 50
        if basilan>4 then basilan=0
     endif
CIKIS_VER:
     if basilan=0 then portb=0
     if basilan=1 then
   HIGH LED1
   PAUSE 25
   HIGH LED2
   PAUSE 25
   HIGH LED3
   PAUSE 25
   HIGH LED4
   PAUSE 25
   HIGH LED5
   PAUSE 25
   HIGH LED6
   PAUSE 25
   HIGH LED7
   PAUSE 25
   ENDIF
     if basilan=2 then
   HIGH LED7
   PAUSE 25
   HIGH LED6
   PAUSE 25
   HIGH LED5
   PAUSE 25
   HIGH LED4
   PAUSE 25
   HIGH LED3
   PAUSE 25
   HIGH LED2
   PAUSE 25
   HIGH LED1
   PAUSE 25
   endif
     if basilan=3 then
   PORTB=%1111111
   PAUSE 25
   PORTB=%1010101
   PAUSE 25
   PORTB=%0101010
   PAUSE25
   PORTB=%0000000
   PAUSE 25
   ENDIF
     if basilan=4 then
   PORTB=%0000000
   endif      
pause 50

   GOTO BASLA
END

proteus dosyası;http://rapidshare.com/files/143961849/TEK_TUS_B__304_R_DEN__OK_KOMUT.rar.html

ve yardımlarınızla geliştirmeye devam etmekteyim
olgulardaki olgunluk biziz

OG

Alıntı yapılan: "ete"Aslında çok basit bir programı zora sokmuşsun. Programında bazı hatalar var.  
Evet 3sn de işi bitirme için zorlama var. Bütün süre 3 sn, bu süre içinde kaç defa basarsa ona göre sonuçlanır, bir kere bassın ve 3 sn boyunca basılı tutsa bile bu süre sonunda 1 basış gibi. Program çalışıyor.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.