Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

CCS C De 2 tuşa aynı anda basma

Başlatan teknik40, 20 Kasım 2014, 11:42:40

teknik40

Merhaba
benim bir sorum olacak
2 adet butonumuz var herbiri ayrı işlem yapıyor ikisine aynı anda basınca 3. bir işlem yapmasını istiyorum
şöyle birşey yazdım ama olmadı

if((input(pin_a1)) &&(input(pin_a2)))
{
Yapılacak işlem
}
bu şekil yaptım fakat çalışmadı pin_a1 butonunun işlemini yaptı
bu konuyla alakalı bilgisi olan var mı?

serhat1990

Her biri ayrı bir işlem yaparken 3. bir işlem için bu fonksiyonu eklerseniz tüm fonksiyonlar için gerekli koşul sağlanmış olacaktır. Yani 3 tane fonksiyon var. 1. butona basılıysa 1.fonksiyon , 2.butona basılıysa 2.fonksiyon , iki butona birden basılıysa 3.fonksiyon yapılacak. Burada şuna dikkat etmek gerek hepsi sizin yazdığını gibi sorgularsanız 2 butona birden basılı olsa bile 1.fonksiyon ve 2.fonksiyonun koşulu sağlanmış olacaktır. O yüzden şöyle bir mantık uygulamanız daha iyi olacaktır. Tekil durumları sorgularken diğerinin basılı olmaması koşulunuda dikkate almalısınız.

İyi çalışmalar dilerim.

if((buton1) && (!buton2))
{
fonksiyon1
}

if((buton1) && (!buton1))
{
fonksiyon2
}

if((buton1) && (buton2))
{
fonksiyon3
}

homer380

portların durumunu öğrenip ona göre işlem yapmanız daha mantıklı yani porta=%00000001 (porta=1 ise), porta=%00000010 (porta=2 ise) ve porta=%00000011(porta=3 ise)  şeklinde bir mantık sizin işinizi fazlasıyla görür.

select case porta:

case 1:
komutlar
case 2:
komutlar
case 3:
komutlar
endselect

kendinize göre uyarlarsınız.

haydarpasamikro

2 butona hiçbir zaman aynı anda basamazsınız. Aynı anda bastım deseniz bile aralarında milisaniyeler mertebesinde zaman farkı olabilir. Bu sebeple biraz farklı yöntemler kullanmak gerek. Mesela 1. butona basıldıktan sonra 2.butonu bir timeout süresi boyunca beklemek. Basılmışsa 2 butonda basılı işlemini yapmak gerek. Bunun için bir timer kesmesi kullanmak kullanışlı olabilir.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

teknik40

Soruma cevap veren serhat1990,homer380 ve haydarpasamikro ya teşekkürler.
İtiraf edeyim sorunu çözemedim :)
onun yerine butonun birine uzun basmak suretiyle 3 komutu kullandım.

vitruvius

Aşağıdaki kodda ilk butona basınca led1, ikinciye basınca led2, ikisine birden basılınca led3 yanıyor. Böyle bir şey mi istediğiniz?

#include <16F877A.h>
#fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOPUT, NOWRT,NODEBUG, NOCPD
#use delay(clock=4000000)

#use fast_io(b)
#use fast_io(d)

#define  button1  pin_b0
#define  button2  pin_b1

#define  led1     pin_d0
#define  led2     pin_d1
#define  led3     pin_d2


void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);   

   set_tris_b(0x0F);
   set_tris_d(0x00);
   
   output_d(0x00);
   
   while(1)
   {
      if(((input(button1)) &&  ((input(button2)))))
      {
         output_low(led1);
         output_low(led2);
         output_high(led3);
      }
      
      else if (input(button1))
      {
         output_high(led1);
         output_low(led2);
         output_low(led3);
      }
      
      else if (input(button2))
      {      
         output_low(led1);
         output_high(led2);
         output_low(led3);
      }
      
      else if (((input(button1)) &&  ((input(button2)))) == 0)
      {
         output_low(led1);
         output_low(led2);
         output_low(led3);         
      }
   }
}

rugan035

Alıntı yapılan: vitruvius - 25 Kasım 2014, 03:01:52
Aşağıdaki kodda ilk butona basınca led1, ikinciye basınca led2, ikisine birden basılınca led3 yanıyor. Böyle bir şey mi istediğiniz?

#include <16F877A.h>
#fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOPUT, NOWRT,NODEBUG, NOCPD
#use delay(clock=4000000)

#use fast_io(b)
#use fast_io(d)

#define  button1  pin_b0
#define  button2  pin_b1

#define  led1     pin_d0
#define  led2     pin_d1
#define  led3     pin_d2


void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);   

   set_tris_b(0x0F);
   set_tris_d(0x00);
   
   output_d(0x00);
   
   while(1)
   {
      if(((input(button1)) &&  ((input(button2)))))
      {
         output_low(led1);
         output_low(led2);
         output_high(led3);
      }
      
      else if (input(button1))
      {
         output_high(led1);
         output_low(led2);
         output_low(led3);
      }
      
      else if (input(button2))
      {      
         output_low(led1);
         output_high(led2);
         output_low(led3);
      }
      
      else if (((input(button1)) &&  ((input(button2)))) == 0)
      {
         output_low(led1);
         output_low(led2);
         output_low(led3);         
      }
   }
}


Verdiğiniz kodlar proteusta çalışıyor devreyi kurup denedim. Soran arkadaş gerçekte breadboard üzerine kurup denerse sonucu görmüş oluruz.

SBTECH

Alıntı yapılan: haydarpasamikro - 20 Kasım 2014, 20:12:17
2 butona hiçbir zaman aynı anda basamazsınız. Aynı anda bastım deseniz bile aralarında milisaniyeler mertebesinde zaman farkı olabilir. Bu sebeple biraz farklı yöntemler kullanmak gerek. Mesela 1. butona basıldıktan sonra 2.butonu bir timeout süresi boyunca beklemek. Basılmışsa 2 butonda basılı işlemini yapmak gerek. Bunun için bir timer kesmesi kullanmak kullanışlı olabilir.

external interrupt ile yaptığınızda böyle bir uygulamayı dediğiniz durum oluşabilir ama buton okuma fonksiyonunu 200-250 ms ne bir çağırırsanız aynı anda basmış gibi oluyorsunuz, bu şekilde bir çözümle benzer bir durumu çözmüştüm pic ile.. bilginize..
Elektronik ilimdir..

ibrahim0420@hotmail.com

peki bu and kapılırını kullanarak 4 buton ile 4 led kontrolü yada daha fazlası yapılabilirmi

kudretuzuner

Merhaba,
Arkadaşların da yazdığı gibi PIC sıra ile iş yapar önce 1 işlem sonra 2.işlem gerçekleşir.PORT Pin kontrollarını da EXOR ile karşılaştırarak istediğiniz gibi kontrol ederek 3.işlemi yaptırabilirsiniz.
Amatör