Bir Butona 2 görev vermek (kodlar içerde)

Başlatan sirhadim, 20 Şubat 2019, 15:49:14

sirhadim

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ı?

sirhadim


sinus



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.

sadogan

#18
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.

sirhadim

değerli görüş ve bilgilerinizi aktardığınız için hepinize teşekkür ederim. kendimi geliştiricem inşallah

serkan

@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

sirhadim

çok teşekkür ederim. ilk fırsatta inceleyip deneyeceğim emeğinize sağlık ::ok