3 buton hangisi önce basarsa o led yansın

Başlatan Elektrik2012, 25 Ocak 2014, 15:47:16

Elektrik2012

3tane buton 3 tane led var hangi buton önce basılırsa O led yanıcak ben biraz uraştım ama bir türlü programı yazamadım.Çok fazla programlama bilgim yok öğrenmeye çalışıyorum.Şöyle düşündüm hangi buton önce basarsa O kod işlesin ve Döngüden çıksın diye düşündüm.Break komutu ile olabilirmiş ama kullanamadım Yardımcı olurmusunz Teşekkürler Şimdiden
Benimprogramım :)
#include <16f84a.h> //Mikrodenetleyici seçilir
#fuses XT,NOWDT,NOPROTECT,PUT //Sigortalar seçilir
#use delay (clock=4M) //Denetleyici frekansı
#define buton1 pin_a0   //Yarışmacı1 Butonu
#define buton2 pin_a1   //Yarışmacı2 Butonu
#define buton3 pin_a2  // Yarışmacı3 Butonu
#use fast_io(a)
#use fast_io(b)

void main()
{
output_b(0x00);// B portu sıfırlandı
set_tris_a(0x01);//Ra0 pini giriş 
set_tris_b(0x00);//B portu komple çıkış

output_high(pin_b5); //Buzzer öter Sistem Devreye girdi
delay_ms(3000);//3sn Buzzer ötsün
output_low(pin_b5);//Buzzer sustu Sistem devrede
output_b(0x00);
while(1)
{
if(input(buton1)==1)
output_high(pin_b0);






if(input(buton2)==1)
output_high(pin_b1);


if(input(buton3)==1)
output_high(pin_b2);

}
}

z

#1
Bu sekilde yaparsan yarismacilara mikrosaniye farkla haksizlik yapmis olursun.

Butonlari tek tek değil tek komutla hepsini birden oku.

Eger 100, 010 yada 001  seklinde basis varsa ilk basan 1 kisi vardir.

Yok 110, 011, 101, 111 gibi durumlar varsa birden fazla kisi ayni anda basmis demektir. (Yazilimda bu bile haksizlik)

Butonlarin bagli oldugu portu A degiskenine oku. Eger 000 okuyorsan tekrar tekrar port okumaya devam et.

if (A==0b100) {1. yarismaci once basti}
if (A==0b010) {2. yarismaci once basti}
if (A==0b001) {3. yarismaci once basti}

Aksi takdirde birden fazla kisi ayni anda basmis demektir. Bu durumu ayrica ele al.

Kimin ilk bastigi belli olduguna gore ilgili ledi yak ardindan tekrar baslat butonuna basilmayi bekle. Basildiginda ledler sonsun ve en basa don.

Mantik bu sekilde olmali.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Elektrik2012

#2
Öncelikle Teşekkür ederim   :D haklısınız haksızlık olucak Program aşağı dogru inreken Zaman kaybı olcak :) Dediginizi anlıyamadım Kafam iyice karıştı Bir örnek kod ile gösterebilirmisiniz? :)

z

#3
Atiyorum A0, A1 ve A2 pinlerine buton bagli olsun.

Sen

if(input(buton1)==1)
output_high(pin_b0);

if(input(buton2)==1)
output_high(pin_b1);

if(input(buton3)==1)
output_high(pin_b2);

yazmissin.

Diyelimki buton2 ye ilk basildi. Bu esnada da buton1 e basildi

sen ilk buton1 e basildiysa b0 ledini yakiyorsun. Haksizlik burada.

Soyle yap

        Butonlar=0;
        while(Butonlar==0)
            {
               Butonlar=PortA  ;  Bu yazima karsilik gelen komutu bilmiyorum belki boyledir belki baska, dogrusunu arastirir bulursun. 
               Butonlar = Butonlar & 0x07;  // ilgisiz bitleri maskeledik

//            Simdi sorgulama yaparsin

               if(Butonlar==1) output_high(pin_b0);
               else if(Butonlar==2) output_high(pin_b1);
               else if(Butonlar==4) output_high(pin_b2);
               else {Gecersiz, birden fazla butona basilmis kim once basmis anlasilamadi}
           }
      while(1); // sonsuz dongude kal


// Reset butonuna basilmasini bekle

Mantigi verdim, kodlamayi buna gore yaparsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Elektrik2012


z

Haksizligi anladiysan tamam. Yoksa senin yazdigin sekilde de yaparsin ama kul hakki yememek lazim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Elektrik2012

Aynen öyle bende öyle düşünüyorum.Birde günah işlemeyelim.Ben öğrenciyim 16 yaşındayım Biraz benim için zor oluor.Programlama :) Tekrar Çok teşekkürler