tek butonla 3 tane ledi ayrı ayrı yakıp söndürme

Başlatan Recep METE, 04 Ekim 2013, 11:03:28

Recep METE

   Arkadaşlar aşağıda verdiğim kodlarda tek butonla  tek ledi yakıp söndürüyorum.Ancak benim istediğim yine tek buton olacak önce b0'daki ledi yakıp söndürecek sonraki basmada  b1'deki led yanıp sönecek son olarak b2'deki led yanıp sönecek.Aynı işlem butona bastıkça sürecek.Bunun için aşağıda yazdığım kodda ne gibi eklemeler yapabilirim.Yardımcı olursanız memnun olurum.

#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay(clock=4000000)
#use fast_io(a) // Port yönlendirme komutları A portu için geçerli
#use fast_io(b) // Port yönlendirme komutları B portu için geçerli

int1 x; // 1 bitlik x adında tamsayı tipinde bir değişken tanımlanıyor.

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0x01);    // RA0 ucu giriş olarak ayarlandı.
   set_tris_b(0x00);    // RB0 portu tümüyle çıkış olarak ayarlandı.
   
   output_b(0x00);
while(1)
  if(input(pin_a0))
  {output_toggle(pin_b0);
  delay_ms(15);
  while(input(pin_a0));}
 

  }}
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

musti463

sayıcı mantığı kullan for döngüsü oluştur.sayıcı 1 ise 1.led,2 ise 2.led 3 ise 3.led diye.sayıcı 3 olunca,sayıcıyı sıfırla
Mustafa Emir SADE

Recep METE

#2
Kendim başardım :) tek bir buton ile 3 tane ledi sırayla açıp kapatıyor.Önce b0 buton kullanarak yanıp sönüyor sonra b1 ve b2.Başardım.Kodları gönderiyorum.


#include <16f877.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay(clock=4000000)
#use fast_io(a) // Port yönlendirme komutları A portu için geçerli
#use fast_io(b) // Port yönlendirme komutları B portu için geçerli
int i=1;


/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0x01);    // RA0 ucu giriş olarak ayarlandı.
   set_tris_b(0x00);    // RB0 portu tümüyle çıkış olarak ayarlandı.
   
   output_b(0x00);

  
   while(1) // Sonsuz döngü 

if(input(pin_a0)==1)

{i++;

if(i==2)
output_high(pin_b0);
delay_ms(15);
while(input(pin_a0)==1);


if(i==3)
output_low(pin_b0);
delay_ms(15);
while(input(pin_a0)==1);

if(i==4)
output_high(pin_b1);
delay_ms(15);
while(input(pin_a0)==1);


if(i==5)
output_low(pin_b1);
delay_ms(15);
while(input(pin_a0)==1);


if(i==6)
output_high(pin_b2);
delay_ms(15);
while(input(pin_a0)==1);


if(i==7)
output_low(pin_b2);
delay_ms(15);
while(input(pin_a0)==1);

if(i==7){i=1;}

}
   

}


mesaj birleştirme:: 04 Ekim 2013, 20:11:43

Buda "toggle" kullanarak 3 tane ledi buton kullanarak önce sırayla yakıyor sonrada sırayla söndürüyor.

#include <16f877.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay(clock=4000000)
#use fast_io(a) // Port yönlendirme komutları A portu için geçerli
#use fast_io(b) // Port yönlendirme komutları B portu için geçerli
int i=1;


/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0x01);    // RA0 ucu giriş olarak ayarlandı.
   set_tris_b(0x00);    // RB0 portu tümüyle çıkış olarak ayarlandı.
   
   output_b(0x00);

  
   while(1) // Sonsuz döngü 

if(input(pin_a0)==1)

{i++;

if(i==2)
output_toggle(pin_b0);
delay_ms(15);
while(input(pin_a0)==1);


if(i==3)
output_toggle(pin_b1);
delay_ms(15);
while(input(pin_a0)==1);



if(i==4)
output_toggle(pin_b2);
delay_ms(15);
while(input(pin_a0)==1);

if(i==4){i=1;}

}
   

}
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

yusuf3101

#3
programdaki int1 x; değişkenini int sayici=0; olarak değiştir ve aşşağıdaki kodları uygula
birinci kodlarda ledler butona basıtığında yanar birdaha bastığında ise 1 led söner ikinci led yanar fakat sen butana basıp çektiğimde led yansın 1 sn kadar yanık kalsın kendisi sönsün diyorsan ikinci kodlarda da o istediğin var. hadi kolay gelsin.

birinci kodlar
while(1)
{

 if(input(pina0)){ delay_ms(20); while(input(pin_a0); sayici++; }

 if(sayici==0)output_b(0x00); // eğer sayıcı değişkeni değeri 0 ise ledleri söndür
 if(sayici==1)output_b(0x1);  // eğer sayıcı değeri 1 ise pin b0 daki ledi yak
 if(sayici==2)output_b(0x2);  // eğer sayıcı değeri 2 ise pin b1 daki ledi yak
 if(sayici==3)output_b(0x4);  // eğer sayıcı değeri 3 ise pin b2 daki ledi yak
 
 if(sayici==4)sayici=0; // eğer sayıcı değeri 4 ise sayıcı değerine sıfır yükle

}



ikinci kodlar

while(1)
{

 if(input(pina0)){ delay_ms(20); while(input(pin_a0); sayici++; }

 if(sayici==1){ output_b(0x1); delay_ms(1000); output_b(0x00); } 
 if(sayici==2){ output_b(0x2); delay_ms(1000); output_b(0x00); }  
 if(sayici==3){ output_b(0x4); delay_ms(1000); output_b(0x00); } 
 
 if(sayici==3)sayici=0; 

}


mesaj birleştirme:: 04 Ekim 2013, 20:16:55

hadi gözün aydın kardeşim :)

Recep METE

Teşekkür ederim hocam çok faydası oldu. Ancak verdiğiniz ikinci kodda sadece 3. led verilen sürede yanıp sönüyor diğerleri sadece yanık kalıyor verilen sürede sönmüyor.Butonla söndürmezsen sürekli yanık kalıyor.Epey kafa yormama rağmen bir türlü çözemedim.Koda bir el atarsan sevinirim.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

justice_for_all

#5
#include <16f877.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay(clock=4000000)
#use fast_io(a) // Port yönlendirme komutları A portu için geçerli
#use fast_io(b) // Port yönlendirme komutları B portu için geçerli
int i=1;

int8 sayici=0;


/********* ANA PROGRAM FONKSİYONU********/

#int_timer0
void timer_kesme(void)
{
      set_timer0(0);
      if(input(pina0)){ delay_ms(20); while(input(pin_a0); sayici++; }
      
}

void main ()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|T0_8_BIT);
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_timer0(0);

   enable_interrupts(int_timer0);
   enable_interrupts(global);

   set_tris_a(0x01);    // RA0 ucu giriş olarak ayarlandı.
   set_tris_b(0x00);    // RB0 portu tümüyle çıkış olarak ayarlandı.
   
   output_b(0x00);
 
   

   while(1)
   {

        switch(sayici)
       {
             case 1: output_b(0x1); delay_ms(1000); output_b(0x00);break;
             case 2: output_b(0x2); delay_ms(1000); output_b(0x00);break;
             case 3: output_b(0x4); delay_ms(1000); output_b(0x00);break;
             default : output_b(0x0) sayici=0;break;
        }
         
         delay_ms(1000);

   }

}


bu sekilde yaparsaniz butona 2 saniye boyunca basili tutmak zorunda kalmazsiniz.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Recep METE

Hocam çok teşekkür ederim.Çok işime yaradı.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

yusuf3101

Başka pcden girdiğim için kodları denemeden direk buraya yazmıştım. ikinci kodların buton kısmında küçük bi hatam olmuş
alttaki kısmı eskisinden sil bunu yaz oluyo.
if(input(pin_a0)){ delay_ms(20); while(input(pin_a0)); sayici++; }


justice hocam sizede teşekkür ederim switch case modu hiç aklıma gelmemişti uzun zamandır ara verdiğimden bazı şeyleri unutmuşum

Recep METE

#8

justice_for_all  hocanın göndermiş olduğu  switch-case kullanılarak yapılmış kodun ufak hatalarının giderilmiş isiste çalışır hali,
#include <16f877.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay(clock=4000000)
#use fast_io(a) // Port yönlendirme komutları A portu için geçerli
#use fast_io(b) // Port yönlendirme komutları B portu için geçerli
int i=1;

int8 sayici=0;


/********* ANA PROGRAM FONKSİYONU********/

#int_timer0
void timer_kesme(void)
{
      set_timer0(0);
      if(input(pin_a0)){ delay_ms(20); while(input(pin_a0)); sayici++; }
      
}

void main ()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|T0_8_BIT);
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_timer0(0);

   enable_interrupts(int_timer0);
   enable_interrupts(global);

   set_tris_a(0x01);    // RA0 ucu giriş olarak ayarlandı.
   set_tris_b(0x00);    // RB0 portu tümüyle çıkış olarak ayarlandı.
   
   output_b(0x00);
 
   

   while(1)
   {

        switch(sayici)
       {
             case 1: output_b(0x1); delay_ms(1000); output_b(0x00);break;
             case 2: output_b(0x2); delay_ms(1000); output_b(0x00);break;
             case 3: output_b(0x4); delay_ms(1000); output_b(0x00);break;
             default : output_b(0x0); sayici=0;break;
        }
         
        

   }

}


mesaj birleştirme:: 07 Ekim 2013, 20:48:56

Buda benim yaptığım switch -case'le yapılmış proje.Buna göre bir butonla üç tane ledi(b1-b2-b3'e bağlı) sırayla yakıp söndürüyor.Yukarıdaki switch case çalışmasında bir led sönerken anında 2. led yanıyordu.Bunda sen butona basmadan led  yanmıyor.



/****RECEP METE***********/

#include <16f877.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay(clock=4000000)
#use fast_io(a) // Port yönlendirme komutları A portu için geçerli
#use fast_io(b) // Port yönlendirme komutları B portu için geçerli

int i=0;

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0x01);    // RA0 ucu giriş olarak ayarlandı.
   set_tris_b(0x00);    // RB0 portu tümüyle çıkış olarak ayarlandı.
      output_b(0x00);

   while(1)
   {if(input(pin_a0))
   {delay_ms(5);while(input(pin_a0)==1);i++;
   if(i==7)i=1;
   

        switch(i)
       {
             case 1:if(i==1) output_high(pin_b0);break;

             case 2:if(i==2) output_low(pin_b0);break;

             case 3: if(i==3)output_high(pin_b1);break;
             case 4: if(i==4)output_low(pin_b1);break;
             case 5: if(i==5)output_high(pin_b2);break;
             case 6: if(i==6)output_low(pin_b2);break;
       }          
 }
  
 }

}
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

Recep METE

Bir butonla 3 tane ledi sırayla yakma biri sönerken diğeri hemen yanıyor.Switch-case kullanılarak yapılmıştır.


/****RECEP METE***********/

#include <16f877.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay(clock=4000000)
#use fast_io(a) // Port yönlendirme komutları A portu için geçerli
#use fast_io(b) // Port yönlendirme komutları B portu için geçerli

int i=0;

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0x01);    // RA0 ucu giriş olarak ayarlandı.
   set_tris_b(0x00);    // RB0 portu tümüyle çıkış olarak ayarlandı.
   
   output_b(0x00);

   
   while(1)
   {if(input(pin_a0))
{delay_ms(5);while(input(pin_a0)==1);i++;
if(i==4)i=1;
   

        switch(i)
       {
             case 1:if(i==1)output_b(0x01);break;

             case 2:if(i==2)output_b(0x2);break;

             case 3: if(i==3)output_b(0x04);break;
             
       }          
 }
  
 }

}
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

yusuf3101

nasıl itersen öyle yönlendirebilirsin çıkışları ve girişleri. ister hemen sönsün ister butona basmadan sönmesin vs vs her türlü işte hocam.
tabi bu konudakiler çok ama çok basit şeyler az ilerde bunu farkedeceksiniz çünkü gördüğüm kadarıyla azimlisiniz hocam :)