Şifreli Kilit Sorunu

Başlatan KısaDevre, 23 Aralık 2017, 23:42:08

KısaDevre

Öncelikle herkese merhaba,

Çeşitli sitelerde türkçe ve ingilizce araştırmama rağmen sorunumu bir türlü çözemedim. Uzun zaman olmuştu picle uğraşmayalı devre kurmayalı kusurua bakmayın.

Sorunum,

  Keypad'den girdiğim değeri LCD de okuyamamam. Pull up ve pull down yapmaktan artık mantık aramadan tek tek denedim. Ete hocanın çoğu konuda yazdıklarını da okudum. Fakat hala çözemedim kusura bakmayın bu sorun için.
  Özetlemek gerekirse 16F877A kullanıyorum, B portunda keypad bağlı (dahili pull up için), aynı satırdaki sayıları rast gele veriyor bana. 9 8 7 / 6 5 4 / 3 2 1 bunları o anda hangisi denk gelirse öyle veriyor. Bunun sebebi yanlış pull up yapmam fakat nasıl çözeceğim peki ?
Kod ve şema ektedir yardımcı olabilenlere şimdiden teşekkürler.

Kod yine bu siteden https://www.picproje.org/index.php/topic,52716.0.html

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

 #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 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(0x0F);//keypad baglı    
 set_tris_c(0b00000000); 
 set_tris_d(0b00000000);

port_b_pullups(true);//*** CMOS girişler voltaja hassastır 
                            
 output_b(0x00); 
 output_c(0x00); 
 output_d(0x00); 
 

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

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

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

 if(tus==15) {goto basla;}
 
 sifre=(((int16)a*1000)+((int16)b*100)+(c*10)+(d*1));
delay_ms(300);
 if(sifre==9876 && 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ü
   {

output_high(pin_c1);
delay_ms(100);
output_low(pin_c1);
delay_ms(100);

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



Yanlış olduğunu düşündüğüm proteus ,