Binler basamağı olan sayılarda yüzler basamağında 299'a kadar işlem yapıyor

Başlatan Recep METE, 19 Nisan 2014, 20:51:00

Recep METE

Arkadaşlar yaptığım çalışmada
if(sifre==6299 && e==14)
output_high(pin_b0);
keypadle girdiğim sayılarda yüzler basamağında 299'a kadar sayılarla işlem yapıyor. 299'u geçince duruyor.Birde binler basamağı kaç olursa olsun çalışıyor.Örneğin 7299'a kadar sayılarla çalışyor.7300'de ve yukarısında işlem yapmıyor.8299'a kadar sayılarla çalışıyor.8300'de duruyor.9299 a kadar sayılarlaçalışıyor,9300'de çalışmıyor.v.b.Bu sayıları0000'dan - 9999'a kadar nasıl çalştırtabilirim.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

kantirici

değişken tipleri bu sayıları tutmaya yetiyor mu? Ayrıca programı gömek lazım.

Recep METE

Alıntı yapılan: kantirici - 19 Nisan 2014, 21:26:57
değişken tipleri bu sayıları tutmaya yetiyor mu? Ayrıca programı gömek lazım.


Hocam, değişkenler:
  unsigned int8  tus,e,a,b,c,d;
  
  unsigned  int16 sifre=0;


Kodlar:
  
 #include        <16f877.h>
 #fuses          XT,NOWDT,NOPROTECT
 #use            delay(clock=4000000)
 #include        <lcd.c>
 #use            fast_io(c)  
 #use            fast_io(b)             
 #use            fast_io(d)
 #use            fast_io(a)
 #use            fast_io(e)

 
 
 #define         sut1 pin_B4                                       
 #define         sut2 pin_B5                      
 #define         sut3 pin_B6  
 
 
 #define         sat1 pin_B0
 #define         sat2 pin_B1                
 #define         sat3 pin_B2                    
 #define         sat4 pin_B3  
 
 
 #define         m1 pin_a0
 #define         m2 pin_a1
 #define         ea pin_a2
 #define         eb pin_a3
#define buton_ileri pin_e0
#define buton_geri  pin_e1
#define buton_stop  pin_e2
 

 
 #define buzzer      pin_c0   
 #define use_portd_lcd TRUE
            
 
  unsigned int8  tus,e,a,b,c,d;
  
  unsigned  int16 sifre=0;

 void tus_al()// yazılım bu fonksiyona geldiğinde buradan bir
 {            // tus değeri almadan bu fonksiyondan çıkmaz
 don:
 output_low(sut1);output_high(sut2);output_high(sut3);
 if(input(sat1)==0){tus=1;goto brk;}
 if(input(sat2)==0){tus=4;goto brk;}
 if(input(sat3)==0){tus=7;goto brk;}
 if(input(sat4)==0){tus=15;goto brk;}

 output_high(sut1);output_low(sut2);output_high(sut3);
 if(input(sat1)==0){tus=2;goto brk;}
 if(input(sat2)==0){tus=5;goto brk;}
 if(input(sat3)==0){tus=8;goto brk;}
 if(input(sat4)==0){tus=0;goto brk;}                        

 output_high(sut1);output_high(sut2);output_low(sut3);
 if(input(sat1)==0){tus=3;goto brk;}
 if(input(sat2)==0){tus=6;goto brk;}
 if(input(sat3)==0){tus=9;goto brk;}      
 if(input(sat4)==0){tus=14;goto brk;}
 
 
 goto don;  
 brk:
 while(!input(sat1));
 while(!input(sat2));          
 while(!input(sat3));
 while(!input(sat4));                           
 output_high(buzzer);delay_ms(100);output_low(buzzer); 
 }   

 

 void main()
 {            
  set_tris_b(0b00001111);//keypad baglı    
 set_tris_c(0b00000000); 
 set_tris_a(0b00000000); 
 set_tris_d(0b00000000);
 set_tris_e(0b00000111);
 port_b_pullups(true);//*** CMOS girişler voltaja hassastır , en ufak voltajı 0-1 olarak kabul edebilirler.
 //Bunun önüne geçmek için pull-up yada pull-down direnci ile hat 0'a yada 5V'a çekilir ve stabil hale getirilir.
 output_a(0x00);                            
 output_b(0x00); 
 output_c(0x00); 
 output_d(0x00); 
 output_e(0x00); 

 output_high(ea);
 output_low(eb);

 lcd_init();   // LCD hazırlanıyor
 basla:

 printf(lcd_putc,"\fsifre:");
 delay_ms(500);

  all:
 


 tus_al();
 a=tus;
 lcd_gotoxy(9,1);
 printf(lcd_putc,"*");
 if(tus==14||tus==15) {goto basla;}
 delay_ms(300);
 
 tus_al();
 b=tus;
 lcd_gotoxy(10,1); 
 printf(lcd_putc,"*");
 if(tus==14||tus==15) {goto basla;}
 delay_ms(300);
 
 tus_al();
 c=tus;
 lcd_gotoxy(11,1); 
 printf(lcd_putc,"*");
 if(tus==14||tus==15) {goto basla;}
 delay_ms(300);
  
 tus_al();
 d=tus;
 lcd_gotoxy(12,1);
 printf(lcd_putc,"*");
 if(tus==14||tus==15) {goto basla;}
 delay_ms(300);
 
 tus_al();
 e=tus;

 if(tus==15) {goto basla;}
 delay_ms(300);
  
 
 sifre=((a*1000)+(b*100)+(c*10)+(d*1));

 if(sifre==8299 && e==14)
 
 
 
  {
   lcd_gotoxy(1,1);
  printf(lcd_putc,"\f   DOGRU SIFRE");
  printf(lcd_putc,"\n  PROJE CALISTI");
  delay_ms(300);
    
 
  while(1) // Sonsuz döngü
   {
      if (input(buton_ileri)) // İLERİ Butonuna basılsı ise
      {
         output_high(m1); // L298 Input1 girişi lojik-1
         output_low(m2);  // L298 Input2 girişi lojik-0
      }

      if (input(buton_geri)) // GERİ Butonuna basılsı ise
      {
         output_low(m1);  // L298 Input1 girişi lojik-0
         output_high(m2); // L298 Input1 girişi lojik-1
      }
      if (input(buton_stop)) // HIZLI STOP Butonuna basılsı ise
      {
         output_low(m1); // L298 Input1 girişi lojik-0
         output_low(m2); // L298 Input1 girişi lojik-0
         // Hızlı stop için burada her iki girişte lojik-1 olabilirdi.
         // Önemli olan Hızlı Stop için, her iki girişin aynı seviyede olması
      }

   }
  
  }
  
  else
  {
  
   lcd_gotoxy(1,1);
  printf(lcd_putc,"\f  YANLIS SIFRE");
  printf(lcd_putc,"\nTEKRAR DENEYINIZ");
  delay_ms(1000);
  
  goto basla;
  
 }}
  
 
 
 


Sorun:Yazılmış olan program sayıları  1299-2299-3299-4299...9299 'a kadarlığını kullanıyor.Program içinde sifre oluşturduğumda bu sayılara kadar olanları program dikkate alıyor,kullanıyor.Bu sayılardan büyüklerinde programda hatalı bir çalışma oluyor.Bunları  0000'dan -9999'a kadar kullanmak istiyorum ne yapmalıyım.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

kantirici


Kabil ATICI

@semfero
o kadar goto kullanmışsın ki bir an için basic programına bakıyorum zannettim. Örneğin tuş basması için b portu kesmesini kullanabilirsin. Böylece sürekli tuş basıldı mı diye bakmana gerek kalmaz.

Yok onu kullanmam dersen bir ve değil kapısı ile işlemciye giren bacaklardan birer tanesi VE DEĞİL kapısına uygulanır çıkışı da harici kesmeye uygulanır.



tuşları tek tek değişkene eşitlemene gerek yok
e=d;
d=c;
c=b;
b=a;
a=tus;
böylece bir seferde girilen son değere göre değerler kaydırılır.

hani olabilir ya
if(sifre==8299 && e==14)
bunu a,b,c,d değerlerini tek tek bakacak şekilde düzenleyip bir deneyebilirsin..
if(a==8 && b==2 && c==9 && d==9 && e==14)
gibi bir şey oluyor...
ambar7

pwm.c

tuş takımından girilen sayıları toplarken işlem türünü bildirmen gerekiyor yoksa 8 bitlik işlem yapar. bu nedenle 300 sayısını elde edemiyorsun.
işlemi şu şekilde yap bakalım:
sifre=(((int16)a*1000)+((int16)b*100)+(c*10)+(d*1));
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

Recep METE

Alıntı yapılan: pwm.c - 20 Nisan 2014, 00:51:50
tuş takımından girilen sayıları toplarken işlem türünü bildirmen gerekiyor yoksa 8 bitlik işlem yapar. bu nedenle 300 sayısını elde edemiyorsun.
işlemi şu şekilde yap bakalım:
sifre=(((int16)a*1000)+((int16)b*100)+(c*10)+(d*1));


Hocam çok teşekkür ederim, sayenizde sorun giderildi.

mesaj birleştirme:: 20 Nisan 2014, 06:59:32

Alıntı yapılan: ambar7 - 20 Nisan 2014, 00:40:40
@semfero
o kadar goto kullanmışsın ki bir an için basic programına bakıyorum zannettim. Örneğin tuş basması için b portu kesmesini kullanabilirsin. Böylece sürekli tuş basıldı mı diye bakmana gerek kalmaz.

Yok onu kullanmam dersen bir ve değil kapısı ile işlemciye giren bacaklardan birer tanesi VE DEĞİL kapısına uygulanır çıkışı da harici kesmeye uygulanır.



tuşları tek tek değişkene eşitlemene gerek yok
e=d;
d=c;
c=b;
b=a;
a=tus;
böylece bir seferde girilen son değere göre değerler kaydırılır.

hani olabilir ya
if(sifre==8299 && e==14)
bunu a,b,c,d değerlerini tek tek bakacak şekilde düzenleyip bir deneyebilirsin..
if(a==8 && b==2 && c==9 && d==9 && e==14)
gibi bir şey oluyor...


Hocam verdiğiniz bu bilgilerden sonra programı  bu bilgiler ışığında yeniden düzenlemeye karar verdim.Ancak kesmeler üzerine biraz daha araştırma yapmam lazım.Teşekkür ederim.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d