Ccs ile tek buton 4 led

Ferdi898

Üye
Katılım
15 Kas 2020
Mesajlar
3
Puanları
1
arkadaşlar merhaba ;
1 buton kullanarak (input için istediğiniz portun istediğiniz pinini seçebilirsiniz) 4 farklı LED’in durumunu değiştiren bir program yazın. Butona 1 kere basıldığında (output için kullandığınız portun b portu olduğunu varsayalım ancak siz uygulamanızda istediğiniz portu ve pini kullanabilirsiniz) b0-b1-b2-b3 ledleri 2 sn. yansın ve sonrasında sönsün. Butona 2 kere basıldığında b0 ve b2 3 sn. yansın ve sonrasında sönsün. Butona 3 kere basıldığında b1 ve b3 5 sn. yansın ve sonrasında sönsün. Son olarak 4 kere basıldığında b0 ve b3 2 sn. yansın ve sonrasında sönsün.

şeklinde programlama yapıyorum fakat butona bir defa bastığımda yapabiliyorum çoklu işlem tek butonlama yapamıyorum kodum ve proteus devrem ektedir. Bakabilirmisiniz?
 

Ekli dosyalar

  • 1.rar
    16.8 KB · Görüntüleme: 9
Dosyaları bendeki düşük sürüm proteus (ares) ile açamazsam da program mantığı olarak şunu tavsiye edebilirim;
-Öncelikle tuş aralıklarını belirlemelisin, 200 milisaniye saniyede 5 kez sıklıkla demek. Belki bu değeri 300-400 ms ye çıkarmak gerekebilir.
-İkincisi 4 kere karşılaştırmayı en yüksek basma işleminden başlatmak gerekiyor. 4 yoksa 3, 3 yoksa 2, 2 yoksa 1
Not: Kod denenmemiştir, gözden kaçan hatalar olabilir.;)
Kod:
#include <main.h>
#define buton pin_b0
#define led1 pin_d0
#define led2 pin_d1
#define led3 pin_d2
#define led4 pin_d3


int deger=0;

int bas1, bas2, bas3, bas4;

void main()
{

set_tris_b(0x01);   

set_tris_d(0x00);         

output_d(0x00);
output_d(0x01);
output_d(0x02);
output_d(0x03);

while(true) {

  bas1=0;
  bas2=0;
  bas3=0;
  bas4=0;

/* önce tuş fonksiyonunu, kaç defa basıldığını tespit edelim */
  if (input(buton)==1) {
    bas1=1;
    delay_ms(300); /* saniyede 3 kez basılabilecek bir hızda diyelim, sıklık değiştirilebilir */
    if (input(buton)==1) {
      bas2=1;
      delay_ms(300);
      if (input(buton)==1) {
        bas3=1;
        delay_ms(300);
        if (input(buton)==1) {
          bas4=1;
          delay_ms(300);
       }
      }
    }
  }
/* Sonra istenen işlemi yerine getirelim */
  if (bas4==1) {         /* 4 ten başlamanın sebebi yukarıda görüldüğü gibi tuş basma esnasında */
    output_high(led1);   /* tüm bas? değişkenlerine 1 atanıyor, olabilen en büyük yerine getirilmeli */
    output_high(led4);
    delay_ms(2000);
    output_low(led1);
    output_low(led4);
  } else
  if (bas3==1) {
    output_high(led2);
    output_high(led4);
    delay_ms(5000);
    output_low(led2);
    output_low(led4);
  } else
  if (bas2==1) {
    output_high(led1);
    output_high(led3);
    delay_ms(3000);
    output_low(led1);
    output_low(led3);
  } else
  if (bas1==1) {
    output_high(led1);
    output_high(led2);
    output_high(led3);
    output_high(led4);
    delay_ms(2000);
    output_low(led1);
    output_low(led2);
    output_low(led3);
    output_low(led4);
  }

}
 
Anlamadan kopyaladigin kod sana hiçbir şey katmaz. Haa ben dersi geçeyim gerisini boşver diyorsan o ayrı.
 
Anlamadan kopyaladigin kod sana hiçbir şey katmaz. Haa ben dersi geçeyim gerisini boşver diyorsan o ayrı.
kesinlikle haklısınız zaten bir yere kadar getirmiştim yukarıdaki yazdığım kodu görürseniz. Çoklu butonu nasıl tanımlayacağım bunu bir türlü oturtamamıştım. 4 senaryo için 4 ayrı buton basmaması tanımlamış arkadaş ben sadece tek bir değer tanımlamıştım ona göre seçim yapmıştım. Şimdi oturdu kafama. Derslerde şöyle sıkıntılar oluyor :) 4 işlem öğretip bize integral türev almamız isteniyor maalesef. Biraz daha yapılabilir şeyler istenebilir. Düşünceniz için teşekkürler...
 
Sayaç isimli bir değişken tanımlayabilirsiniz. Bu değişken düğmeye her basıldığında artar.

Daha sonra bölümden kalan % işlecini kullanarak düğmeye her basıldığında farklı bir işlem yaptırabilirsiniz.

C:
// ...

void birKezBasildi()
{
    // ..
    // Düğmeye bir kez basıldığında yapılacak işlemleri yap
}

void ikiKezBasildi()
{
    // ...
}

void ucKezBasildi()
{
    // ...
}

void dortKezBasildi()
{
    // ...
}

// ...

int main()
{
    TRISB = 0;    // PORTB çıkış
    TRISD = 0xC0; // b1000 0000 PORTD 7 giriş olsun

    PORTB = 0;    // PORTB üzerindeki tüm LED'ler kapalı

    char sayac = 0;
    char dordeBolumdenKalan = 0;

    while(1)
    {
        // Düğmeye basıldı
        if (PORTDbits.RD7==1)
        {
            ++sayac; // sayacı bir arttır
            dordeBolumdenKalan = sayac % 4;

            if (dordeBolumdenKalan == 1) // Düğmeye bir kez basıldı
            {
                birKezBasildi();
            }
            if (dordeBolumdenKalan == 2)
            {
                ikiKezBasildi();
            }
            if (dordeBolumdenKalan == 3)
            {
                ucKezBasildi();
            }
            if (dordeBolumdenKalan == 0)
            {
                dortKezBasildi();
            }
        }
    }
}
 
Kod güzel yazılmış fakat istenileni vermez. Çünkü burada işler sıra ile gider. Halbuki istenen sıralı değil de rastgele basılması gerekiyor. Sıralı olsa zaten tuşa gerek olmaz, sıra ile yanarlar.

İlave; aklıma gelmişken benzer bir işlem yurt dışından satın aldığım otomatik far düğmesinde de var. 0, auto, park ve far konumları arasında hızlı bir şekilde düğmeyi çevirerek 8-10 çeşit fonksiyon ayarlanabiliyor.
1605474058135.png
 
Son düzenleme:
Kodu denemedim. Ama burada sorulan işlemi yapacağını tahmin ediyorum.

Nasıl rastgele? Uygulamada rastgelelikle ilgili bir şey göremiyorum.
 
yeni baslayanlarin yaptığı en büyük düşünsel hata işlemcinin insan gibi yavaş davrandığını ve bazen durduğunu düşünmeleridir. Oysa işlemci saniyede milyonlarca işlem yapar ve durmaz.
 
Son düzenleme:

Yeni mesajlar

Forum istatistikleri

Konular
129,702
Mesajlar
929,087
Kullanıcılar
452,406
Son üye
catarb

Yeni konular

Geri
Üst