Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: sirhadim - 20 Şubat 2019, 15:49:14

Başlık: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: sirhadim - 20 Şubat 2019, 15:49:14
arkadaşlar yeniyim. 3 butonlu 0-999 ileri geri devresini "pause özellikli" yapmak istedim. 3. buton devrede sayma yapılırken basıldığında "pause" edecek. Aşağıdaki devre çalıştı. ancak sorunum şu ki, aynı butona (3.buton (pin_e2)) tekrar bastığımda sayma işlemi kaldığı yerden devam etsin. bunu yapamadım. nasıl yapabilirim?

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

char dizi[]={63,6,91,79,102,109,125,7,127,111};
char dizi2[]={111,127,7,125,109,102,79,91,6,63};
int x,y,z;


void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   set_tris_b(0);
   set_tris_c(0);
   set_tris_d(0);
   set_tris_e(0b00000111);
   
   output_b(dizi[0]);
   output_c(dizi[0]);
   output_d(dizi[0]);
     
   while(1)
   {
ileri:
      if (input(pin_e0)==1)
      {
      while(1)
      {   
         for(x=0; x<10; ++x)
         {
            for(y=0; y<10; ++y)
            {
               for(z=0; z<10; ++z)
               {
                  output_b(dizi[x]);
                  output_c(dizi[y]);
                  output_d(dizi[z]);
                  delay_ms(100);
               if(input(pin_e0)==1)
               goto ileri;
               if(input(pin_e1)==1)
               goto geri;
               if(input(pin_e2)==1)
               goto pause;
               
               }
            }
         }
      }
      }
geri:
      if (input(pin_e1)==1)
      {
      while(1)
      {
        for(x=0; x<10; ++x)
        {
            for(y=0; y<10; ++y)
            {
               for(z=0; z<10; ++z)
               {
                  output_b(dizi2[x]);
                  output_c(dizi2[y]);
                  output_d(dizi2[z]);
                  delay_ms(100);
               if(input(pin_e0)==1)
               goto ileri;
               if(input(pin_e1)==1)
               goto geri;
               if(input(pin_e2)==1)
               goto pause2;
               }
           }
        }
      }
      }     

pause:
       if(input(pin_e2)==1)
       {
          while(1)
          {
           output_b(dizi[x]);
           output_c(dizi[y]);
           output_d(dizi[z]);
           
           if(input(pin_e0)==1)
           goto ileri;
           if(input(pin_e1)==1)
           goto geri;
          }
       }
                 
pause2:

      if(input(pin_e2)==1)
      {
        while(1)
        {
         output_b(dizi2[x]);
         output_c(dizi2[y]);
         output_d(dizi2[z]);
       
         if(input(pin_e0)==1)
         goto ileri;
         if(input(pin_e1)==1)
         goto geri;
         }
        }
     
}

}

Ayrıca kodlar çok uzun olmuş, farklı döngü ve mantıkla yapabilirsin diyen üstatlardan yardım edenlere çok çok teşekkür ederim.
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: mehmet - 21 Şubat 2019, 17:49:06
Bence;bundan önce "C" bilginizi
biraz gelişririn ve 'goto' komutundan
kurtulun.

Ayrıca bir buton ile led yakıp söndürme
temrini yapmış olmanız lazım.
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: mustafa_cmbz - 21 Şubat 2019, 23:30:50
Şöyle li butona bastığınızda son değişken değerini alıp bir yerlere yazıp hemen ardından farklı bir etikete dallanıp orada while döngüsü ile aynı butona basıldımı diye bakabilirsin basılırsa sayac son degerini yükler ordan sayarsın vs.

Yada aynı döngü içinde buton abasıldığında bir bit' i 1 yaparsın döngü içinde de bu biti kontrol edersün 1 ise saydırmazsın butona bastığında toggle yaparsın aynı biti yani 1 ise 0 olur ve yine aynı döngü içinde baktığın bit 0 olduğunda sayac devam eder vs
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: sirhadim - 22 Şubat 2019, 08:46:50
Alıntı yapılan: mehmet - 21 Şubat 2019, 17:49:06Bence;bundan önce "C" bilginizi
biraz gelişririn ve 'goto' komutundan
kurtulun.

Ayrıca bir buton ile led yakıp söndürme
temrini yapmış olmanız lazım.

Teşekkür ederim. Led yak söndür yaptım ama burda sayaç var, tek bit yerine ben burda displayde 8 biti (dp dahil) çalıştırıyorum. output_high/low ya da toggle ile led yak söndür yapmışken burda nasıl yapıcam
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: sirhadim - 22 Şubat 2019, 09:03:17
Alıntı yapılan: mustafa_cmbz - 21 Şubat 2019, 23:30:50Şöyle li butona bastığınızda son değişken değerini alıp bir yerlere yazıp hemen ardından farklı bir etikete dallanıp orada while döngüsü ile aynı butona basıldımı diye bakabilirsin basılırsa sayac son degerini yükler ordan sayarsın vs.

bunu denedim. başka bir etikete dallandım ancak pause ettiğim yani diziden yakaladığım random değerleri ben nasıl devam ettiricem. for döngüsü ile programa yediremedim bir türlü. belki de yanlış yazıyordum bilmiyorum. mesela 687 de ileri sayarken pause ettim bunda sorun yok. ama 687 yi veya herhangi yakalanan değeri ileri yada geri saymasına devam ettiremiyorum. devreyi proteusta kurdum çalıştı board da kurdum orda da tamam ama en çok istediğim bu özellik yok

Alıntı yapılan: mustafa_cmbz - 21 Şubat 2019, 23:30:50Yada aynı döngü içinde buton abasıldığında bir bit' i 1 yaparsın döngü içinde de bu biti kontrol edersün 1 ise saydırmazsın butona bastığında toggle yaparsın aynı biti yani 1 ise 0 olur ve yine aynı döngü içinde baktığın bit 0 olduğunda sayac devam eder vs

etmiyor işte hocam yani ettiremiyorum :) baştan başlatabiliyorum ama kaldığı yerden iler geri saydıramıyorum


Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: M.Salim GÜLLÜCE - 22 Şubat 2019, 10:16:22
Alıntı yapılan: mustafa_cmbz - 21 Şubat 2019, 23:30:50Şöyle li butona bastığınızda son değişken değerini alıp bir yerlere yazıp hemen ardından farklı bir etikete dallanıp orada while döngüsü ile aynı butona basıldımı diye bakabilirsin basılırsa sayac son degerini yükler ordan sayarsın vs.

Yada aynı döngü içinde buton abasıldığında bir bit' i 1 yaparsın döngü içinde de bu biti kontrol edersün 1 ise saydırmazsın butona bastığında toggle yaparsın aynı biti yani 1 ise 0 olur ve yine aynı döngü içinde baktığın bit 0 olduğunda sayac devam eder vs
Aslında 1 adet bayrag (Flag) kullanacaksın butona her basıldığında durum değiştirecek. Bayrak kaldır indir...
 :)
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: sirhadim - 22 Şubat 2019, 10:49:31
hm bayrak konusunu daha görmedim teşekkürler.. başlangıçtayım arkadaşlar dediğim gibi, C dilini üni de dersi geçmek için üstün körü görmüştüm, 1.5 aylık çalışmam var daha henüz. hem serdar çiçek in kitabını, hem youtube videoları hem proteus hem C hem breadboard a devre kurulumlarını hem entegrelerin datasheetlerini inceleme vs hepsini bi arada götürüyorum aksilik yok yazılım kısmı zaten zorlayıcı olanı...
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: sadogan - 22 Şubat 2019, 11:56:08
proteus dosyalarını yükleyebilirmisiniz ?
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: mustafa_cmbz - 22 Şubat 2019, 12:18:14
co2_ON_OFF_DURUM     = co2_ON_OFF_DURUM    ^ 1 
geçen şöyle birşeye ihtiyacım oldu örnek olması açısından faydalı olabilir.

sıcaklık nem ve co2 ölçen bir sistemim var co2 sensörünü kullanmak istemediğim zaman kapatmam gerekliydi bunuda şöyle yaptım.

CO2_ON_OFF durum isimli bir byte tanımladım ve buna açılışta 1 verdim kapatmak istediğim zaman ilgili satırda gelip yukarıdaki gibi 1 ile xor işlemine tabi tuttum.kısacası butona bastıkça bu satıra gelip ilgili bytı 1 ile xor yaptığım için sırası ile 1 ise 0  0 ise 1 oluyor. yani toggle yapıyorum.mevcuttaki durumu neyse tersine çeviriyorum..

Sonra okuma rutini içinde bu byte ı ıf ile şartlandırıyorum 1 ise sensörü oku 0 ise sensörü okuma gibi...


Sende aynı döngü içinde böyle birşey yapabilirsin.hatta döngü içinde butona basıldığında ilgili byte ı 0 yapıp gosub gibi bir komutla başka bir yere dallanıp bu byte ı devamlı kontrol ederek 1 olduğunda geri dön diye bilirsin.Böylece sayac değişkenini bir yerlere yazmadan geri döndüğünde kaldığın değerden devam edersin.

Tabi bunları kurduğun dönüyü ve c bilmediğimi farz ederek değerlendir gerekirse programı tekrardan buna göre kurgula..

Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: sirhadim - 22 Şubat 2019, 14:27:57
Alıntı yapılan: sadogan - 22 Şubat 2019, 11:56:08proteus dosyalarını yükleyebilirmisiniz ?
(https://i.ibb.co/R2j03vk/Ads-z.png) (https://ibb.co/R2j03vk)
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: sadogan - 22 Şubat 2019, 14:45:27
Resim olarak deyil de proje dosyası olarak bir yere yüklerseniz.
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: serkan - 22 Şubat 2019, 15:32:59
burada xc8 için olanı yükledim.belki fikir verir.  https://www.dosyaupload.com/65a0 (https://www.dosyaupload.com/65a0)
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: kudretuzuner - 22 Şubat 2019, 15:54:35
Merhaba,
Breabordtaki bağlantınız resimdeki gibi ise eksiklik var.Şöyleki RE0-RE1-RE2 leri POZİTİFE çekildi mi diye kontrol ettiğinize göre basılmadığı süre içinde şaseye bağlı olması lazım.asm de BTSSS komutu ile kontrol edebilirsiniz.Benim önerim  RE0-RE1-RE2 leri programınızda giriş olarak ayarlayın (ki muhtemelen öyledir CCS C bilmiyorum) butonlarla pinlerin şaseye çekilip çekilmediklerini kontrol edin(zaten isis de dikkat ederseniz pinler sağlıklı çalışmayıp gri gözükmektedir)Böylece RE2 butonunun şaseye çekilip çekilmediğini kontrol ederek sonuca varırsınız.
KOD olarak

BUTON_3_KONTROL
BTFSC PORTE,2;****porte,2 şaseye çekildi mi? çekilmedi ise SAY'a atlar sayma devam eder şaseye çekildi ise GOTO BUTON_3_KONTROL komutuna atlar ;BUTON_3_KONTROL'a  gider döngü böyle devam eder.
GOTO_SAY;*********
CALL BEKLE;*********BUTON SPARKINI ENGELLEME İÇİN GECİKME
GOTO BUTON_3_KONTROL;******buton basılı ise tekrar yukarı döner ve BUTON_3_KONTROL dan porte,2 nin şasede olup olmadığını kontrol eder.
SAY
Bu kod parçacığı buton sürekli basılı olup olmadığını kontrol eder.Bıraktığınız anda SAY'a atlar ve seymaya devam eder.isiste deneyin problem olursa tekrar yazışalım.Kolay gelsin.
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: M.Salim GÜLLÜCE - 22 Şubat 2019, 17:53:36
Alıntı yapılan: kudretuzuner - 22 Şubat 2019, 15:54:35Merhaba,
Breabordtaki bağlantınız resimdeki gibi ise eksiklik var.Şöyleki RE0-RE1-RE2 leri POZİTİFE çekildi mi diye kontrol ettiğinize göre basılmadığı süre içinde şaseye bağlı olması lazım.asm de BTSSS komutu ile kontrol edebilirsiniz.Benim önerim  RE0-RE1-RE2 leri programınızda giriş olarak ayarlayın (ki muhtemelen öyledir CCS C bilmiyorum) butonlarla pinlerin şaseye çekilip çekilmediklerini kontrol edin(zaten isis de dikkat ederseniz pinler sağlıklı çalışmayıp gri gözükmektedir)Böylece RE2 butonunun şaseye çekilip çekilmediğini kontrol ederek sonuca varırsınız.
KOD olarak

BUTON_3_KONTROL
BTFSC PORTE,2;****porte,2 şaseye çekildi mi? çekilmedi ise SAY'a atlar sayma devam eder şaseye çekildi ise GOTO BUTON_3_KONTROL komutuna atlar ;BUTON_3_KONTROL'a  gider döngü böyle devam eder.
GOTO_SAY;*********
CALL BEKLE;*********BUTON SPARKINI ENGELLEME İÇİN GECİKME
GOTO BUTON_3_KONTROL;******buton basılı ise tekrar yukarı döner ve BUTON_3_KONTROL dan porte,2 nin şasede olup olmadığını kontrol eder.
SAY
Bu kod parçacığı buton sürekli basılı olup olmadığını kontrol eder.Bıraktığınız anda SAY'a atlar ve seymaya devam eder.isiste deneyin problem olursa tekrar yazışalım.Kolay gelsin.
yani özet olarak buton giriş portlarında olması gereken pull-down dirençleriniz eksik.
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: sirhadim - 22 Şubat 2019, 18:31:11
evet ben isis'te pull down dirençlerini kullanmadım ama boardda 4.7k dirençlerim butonu basılmasdığı sürece e portunun üç pinini de 0 a çekiyor. ayrıca isiste dp pini de boşta ama boardda oarasıda pic e bağlı. o yüzden zaten dizimin elemanları ona göre tanımlandı

char dizi[]={63,6,91,79,102,109,125,7,127,111};
char dizi2[]={111,127,7,125,109,102,79,91,6,63};

boardda dirençler şaseye bağlı yani.. o iş tamam... ama acaba isis te dirençler bağlı değil diye böyle bir eksiklik isiste sorun teşkil eder mi? çünkü ben çalışmadı diye şuan sizlerden yardım istediğim kısım için yazdığım (ama çalışmayan) kodları programımdan sildim. dikkat ederseniz en üstteki amatör yazılımımda yardım talep ettiğim kısımlar için kod yok!

Üstatlarım amacım benim yazılımımı incelemeniz ve talep ettiğim kodu yazmam yönünde direk bana formülü söylemeniz.. bahsettiğiniz çoğu şeyi sadece sadece anlamaya çalışıyorum.

mesela ben de goto deyimini kullanmanın yazılımcılar tarafından uygun görülmediğini duyuyordum. ancak bu şekilde yazmadan dallandıramadım. mesela bi videoda hocamız

if(input(pin_e2)==1)
break;

yazıp döngüden direk çıkıp istediği if seçeneğine geliyordu. aynısını ben yazdım benimki yemedi. videoda int,char vs tarzında değişkenleri anlatan hocamız void main() içinde bunları tanıtabilirken ben void içinde tanıtınca derleyici error veriyordu bende bunları ön işlemci komutları kısmında ("#define" yazılan alanda) yazıyordum. burdaki kodlarımda da böyle yaptım. ben CCS C 4 versiyonu kullanıyorum o 5 i kullanıyordu. acaba derleyicinin eski sürümlerinde hata mı var? bunlar hep soru benim için.
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: sirhadim - 22 Şubat 2019, 18:56:21
burada e portunu giriş b,c,d çıkış yaptım ve devreye enerji gelince display lerim 000 la başladı.

set_tris_b(0);
set_tris_c(0);
set_tris_d(0);
set_tris_e(0b00000111);

output_b(dizi[0]);
output_c(dizi[0]);
output_d(dizi[0]);

ileri butonuna basıyorum ileri sayıyor, tekrar basınca bitmesini beklemeden baştan başlıyor, geri butonuna basarsam saymayı bitirmeden döngüden çıkıp geri etiketine, 3. butona basarsam pause etiketine dallanıyor, burası tamam.

while(1)
   {
ileri:
      if (input(pin_e0)==1)
      {
      while(1)
      {   
         for(x=0; x<10; ++x)
         {
            for(y=0; y<10; ++y)
            {
               for(z=0; z<10; ++z)
               {
                  output_b(dizi[x]);
                  output_c(dizi[y]);
                  output_d(dizi[z]);
                  delay_ms(100);
               if(input(pin_e0)==1)
               goto ileri;
               if(input(pin_e1)==1)
               goto geri;
               if(input(pin_e2)==1)
               goto pause;
               
               }
            }
         }
      }
      }

burda da sorunum yok, yukarıdaki gibi çalışıyor.. bu sefer geri sayıyor. tek fark pause yerine pause2 etiketi yaptım. çünkü programı tek dizi ile yapamadım. geri geri giderken 3. butona basınca pause2 ye gidip sayacı pause luyor.

geri:
      if (input(pin_e1)==1)
      {
      while(1)
      {
        for(x=0; x<10; ++x)
        {
            for(y=0; y<10; ++y)
            {
               for(z=0; z<10; ++z)
               {
                  output_b(dizi2[x]);
                  output_c(dizi2[y]);
                  output_d(dizi2[z]);
                  delay_ms(100);
               if(input(pin_e0)==1)
               goto ileri;
               if(input(pin_e1)==1)
               goto geri;
               if(input(pin_e2)==1)
               goto pause2;
               }
           }
        }
      }
      }   


sorun şurada: ben pause yaptım ya, aynı butona tekrar bastığımda kaldığı yer neresiyse ileri gidiyorduysa ileri gitmeye devam etsin geri gidiyorken bastıysam tekrar bastığımda geri gitmeye kaldığı yerden (örneğin 492 de bastım pause etti tekrar basarsam 491-490....) devam etsin. farklı butonla da yapayım önemli değil. önemli olan burada döngü mantık algoritma kodlar ne olacak? ezber yapmıyorum az örnek gördüm şimdeye kadar bu da yetmedi.

mesela kaldığı yerden devam etsin diye şöyle birşey denedim yaptım çalışmadı.


int x,y,z;
...
...

for(x=dizi[x]; dizi[x]<=dizi[9]; ++dizi[x])
{
   for (y=dizi[y]; dizi[y]<=dizi[9]; ++dizi[y])
   {
       for(z=dizi[z]; dizi[z]<=dizi[9]; ++dizi[z])
      {   
        output_b(dizi[x]);
        output_c(dizi[y]);
        output_d(dizi[z]);

        delay_ms(100);
}}}



burdaki for un kodları yanlış mı?
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: sirhadim - 22 Şubat 2019, 19:08:36
Alıntı yapılan: serkan - 22 Şubat 2019, 15:32:59burada xc8 için olanı yükledim.belki fikir verir.  https://www.dosyaupload.com/65a0 (https://www.dosyaupload.com/65a0)

teşekkürler hocam bu beni biraz aştı :)
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: sinus - 23 Şubat 2019, 11:46:35
(http://bilgisayarkavramlari.sadievrenseker.com/wp-content/uploads/2007/12/sonlu_durum_makinesi_fsm.jpg)

Sonlu durum makinesi çalışmanızı tavsiye ederim. Kodlardan ziyade algoritma kısmında takılıyorsunuz. Bu şekilde yardım almanız zor.

Kolay gelsin.
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: sadogan - 23 Şubat 2019, 13:36:43
Sayı yı hane hane sayıdrıyorsunuz bütünlük yok.
unsinged int16 sayac gibi bir 16 bitli bir değişken tanımlayıp
bu sayac ı artırıp eksiltin.
sayac içeriği hex olacağı içinde hex to dec çevirici programı yazıp displeye gönderin.
Programınız gerçek anlamda ileri geri saymıyor sürekli artırmak yönunde
tablodan ileri ise gerçek değerleri geri olduğunda ise 10 a tamlıyanı alıyorsunuz.
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: sirhadim - 23 Şubat 2019, 20:52:34
değerli görüş ve bilgilerinizi aktardığınız için hepinize teşekkür ederim. kendimi geliştiricem inşallah
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: serkan - 25 Şubat 2019, 16:12:50
@sirhadim bu codları dene.zor olanı sayıyı segmentlere ayırmaktı.

//PIC18F4520 icin E portu butonlar

#define  GERI    PORTEbits.RE0 
#define  ILERI  PORTEbits.RE1    // 
#define  DURDUR  PORTEbits.RE2    //

void delayms(unsigned int count);
void  segment7(long sayi);



void delayms(unsigned int count)
{
    int i,j;                                                                               
    for(i=0;i<count;i++)                                                                   
      {
     for(j=0;j<100;j++);
      }                                                                                   
}




void  segment7( long sayi)   
    {               
  //basamaklara ayir
    long birler,onlar,yuzler,binler,onbinler,yuzbinler,miyonlar;
 miyonlar    =  (sayi/1000000)%10; //99999 port yok kullanilmadi
 yuzbinler  =  (sayi/100000)%10;  //99999 port yok kullanilmadi
 onbinler  =  (sayi/10000)%10;    //99999 port yok kullanilmadi
 binler    =  (sayi/1000)%10;      //9999 port yok kullanilmadi
 yuzler  =  (sayi/100)%10;        //999 tamam 
 onlar  =  (sayi/10)%10;          //tamam 
 birler =  (sayi/1)%10;            //tamam 
 
  if(yuzler==1){delayms(100);PORTB=0B00000110;}   
  if(yuzler==2){delayms(100);PORTB=0B01011011;} 
  if(yuzler==3){delayms(100);PORTB=0B01001111;} 
  if(yuzler==4){delayms(100);PORTB=0B01100110;} 
  if(yuzler==5){delayms(100);PORTB=0B01101101;}     
  if(yuzler==6){delayms(100);PORTB=0B01111101;} 
  if(yuzler==7){delayms(100);PORTB=0B00000111;} 
  if(yuzler==8){delayms(100);PORTB=0B01111111;} 
  if(yuzler==9){delayms(100);PORTB=0B01101111;}     
  if(yuzler==0){delayms(100);PORTB=0B00111111;} 

  if(onlar==1){delayms(100);PORTC=0B00000110;}   
  if(onlar==2){delayms(100);PORTC=0B01011011;} 
  if(onlar==3){delayms(100);PORTC=0B01001111;} 
  if(onlar==4){delayms(100);PORTC=0B01100110;} 
  if(onlar==5){delayms(100);PORTC=0B01101101;}     
  if(onlar==6){delayms(100);PORTC=0B01111101;} 
  if(onlar==7){delayms(100);PORTC=0B00000111;} 
  if(onlar==8){delayms(100);PORTC=0B01111111;} 
  if(onlar==9){delayms(100);PORTC=0B01101111;}     
  if(onlar==0){delayms(100);PORTC=0B00111111;}

  if(birler==1){delayms(100);PORTD=0B00000110;}   
  if(birler==2){delayms(100);PORTD=0B01011011;} 
  if(birler==3){delayms(100);PORTD=0B01001111;} 
  if(birler==4){delayms(100);PORTD=0B01100110;} 
  if(birler==5){delayms(100);PORTD=0B01101101;}     
  if(birler==6){delayms(100);PORTD=0B01111101;} 
  if(birler==7){delayms(100);PORTD=0B00000111;} 
  if(birler==8){delayms(100);PORTD=0B01111111;} 
  if(birler==9){delayms(100);PORTD=0B01101111;}     
  if(birler==0){delayms(100);PORTD=0B00111111;}
  //delayms(8000);

}



void  main()
{
long say=0; char sayi_durdur=2, bayrak=0,yukari_asagisec=0;
  nRBPU = 1;    //portb pullup direnci 0=var 1=yok    PIC18F4520 icin
  CMCON = 0x07;  //  comparator    kapali              PIC18F4520 icin
  ADCON1 = 0xFF; //  analog giris  kapali hepsi dijital PIC18F4520 icin
  TRISA = 0x00;TRISB = 0x00;TRISC = 0x00; TRISD = 0x00;TRISE = 0x07; 
  PORTA=0x00;PORTB=0x00; PORTC=0x00; PORTD=0x00;PORTE=0x00;
  delayms(1500); 
  say=423; segment7(say);
 
  while(1)           
  {     
         
 if(sayi_durdur>1){ //bayrak bir'se sayi durdur 0 olur sayma durur.
 if(yukari_asagisec==0) {say --; if(say<1)say=0;  segment7(say);} 
 if(yukari_asagisec==1) {say ++; if(say>999)say=0; segment7(say);} 
 }   
 
 while(GERI  ==0){delayms(1500); yukari_asagisec=0;}
 while(ILERI ==0){delayms(1500); yukari_asagisec=1;}     
 
 while( DURDUR ==0){delayms(5500);  bayrak++; if(bayrak>1)  bayrak=0;
 if(bayrak==1)sayi_durdur=0; else if(bayrak==0)sayi_durdur=2;} 
  }
}


 simülasyon burada.
https://www.dosyaupload.com/eu0q (https://www.dosyaupload.com/eu0q)
Başlık: Ynt: Bir Butona 2 görev vermek (kodlar içerde)
Gönderen: sirhadim - 01 Mart 2019, 20:15:46
çok teşekkür ederim. ilk fırsatta inceleyip deneyeceğim emeğinize sağlık ::ok