16f877a 3*4 tuş takımı ile şifreli giriş devresi

Başlatan [TR]ahmet, 24 Ağustos 2013, 19:25:39

[TR]ahmet

Uyarı : Devre isis de sorunsuz çalışıyor fakat gerçekte sürekli koşul sağlanmadığı halde koşulun içine giriyor sebebini anlamadım  :)


Üsteki resme göre algoritmasını anlatım. Algoritması çok basit örneğin ilk önce satırlara veya sütunlara 5 volt vereceksiniz buna karar verdikten sonra örneğin bana sutunlar kolay geldi ben sutunları e0,e1,e2 portunu çıkış yaparak 5v verdim satırlarıda kesme kullanmak için b4,b5,b6,b7 portlarına bağladım ben sutunlara 5v verdiğimden dolayı ben bire,ikiye,üçe yanı aynı satırdaki tuşlara basarsam o satırın bağlı olduğu porta 5 volt gidiyor satırlara 5 volt verseydim 1,4,7,* gibi aynı sütunda da olan tuşlara basılınca o sütunun bağlı olduğu satıra 5 volt giderdi  hangi tuşun basıldığını anlamak için şu kodlar işimi görür   
#int_RB
void  RB_isr(void) 
{
if(input(pin_b4))
{

if(bir_sutun)
{
bir_sutun=0;
if(input(pin_b4))
{
if(iki_sutun)
{
iki_sutun=0;
if(input(pin_b4))
{
if(sifre[0]==' ')
{
sifre[0]=3;
}
else if(sifre[1] ==' ')
{
sifre[1]=3;
}
else if(sifre[2]== ' ')
{
sifre[2]=3;
}
else if(sifre[3] == ' ')
{
sifre[3]=3;
}
else
{
sifirla();
}
tusbul();
}
else
{
if(sifre[0]==' ')
{
sifre[0]=2;
}
else if(sifre[1] ==' ')
{
sifre[1]=2;
}
else if(sifre[2]== ' ')
{
sifre[2]=2;
}
else if(sifre[3] == ' ')
{
sifre[3]=2;
}
else
{
sifirla();
}
tusbul();
}
}
}
else
{
if(sifre[0]==' ')
{
sifre[0]=1;
}
else if(sifre[1] ==' ')
{
sifre[1]=1;
}
else if(sifre[2]== ' ')
{
sifre[2]=1;
}
else if(sifre[3] == ' ')
{
sifre[3]=1;
}
else
{
sifirla();
}
tusbul();
}
}
//kirmizi_led=!kirmizi_led;
//delay_ms(100);
//enable_interrupts(INT_RB);
}
else if(input(pin_b5))
{

if(bir_sutun)
{
bir_sutun=0;
if(input(pin_b5))
{
if(iki_sutun)
{
iki_sutun=0;
if(input(pin_b5))
{
if(sifre[0]==' ')
{
sifre[0]=6;
}
else if(sifre[1] ==' ')
{
sifre[1]=6;
}
else if(sifre[2]== ' ')
{
sifre[2]=6;
}
else if(sifre[3] == ' ')
{
sifre[3]=6;
}
else
{
sifirla();
}
tusbul();
}
else
{
if(sifre[0]==' ')
{
sifre[0]=5;
}
else if(sifre[1] ==' ')
{
sifre[1]=5;
}
else if(sifre[2]== ' ')
{
sifre[2]=5;
}
else if(sifre[3] == ' ')
{
sifre[3]=5;
}
else
{
sifirla();
}
tusbul();
}
}
}
else
{
if(sifre[0]==' ')
{
sifre[0]=4;
}
else if(sifre[1] ==' ')
{
sifre[1]=4;
}
else if(sifre[2]== ' ')
{
sifre[2]=4;
}
else if(sifre[3] == ' ')
{
sifre[3]=4;
}
else
{
sifirla();
}
tusbul();
}
}
}
else if(input(pin_b6))
{

if(bir_sutun)
{
bir_sutun=0;
if(input(pin_b6))
{
if(iki_sutun)
{
iki_sutun=0;
if(input(pin_b6))
{
if(sifre[0]==' ')
{
sifre[0]=9;
}
else if(sifre[1] ==' ')
{
sifre[1]=9;
}
else if(sifre[2]== ' ')
{
sifre[2]=9;
}
else if(sifre[3] == ' ')
{
sifre[3]=9;
}
else
{
sifirla();
}
tusbul();
}
else
{
if(sifre[0]==' ')
{
sifre[0]=8;
}
else if(sifre[1] ==' ')
{
sifre[1]=8;
}
else if(sifre[2]== ' ')
{
sifre[2]=8;
}
else if(sifre[3] == ' ')
{
sifre[3]=8;
}
else
{
sifirla();
}
tusbul();
}
}
}
else
{
if(sifre[0]==' ')
{
sifre[0]=4;
}
else if(sifre[1] ==' ')
{
sifre[1]=7;
}
else if(sifre[2]== ' ')
{
sifre[2]=7;
}
else if(sifre[3] == ' ')
{
sifre[3]=7;
}
else
{
sifirla();
}
tusbul();
}
}
}
else if(input(pin_b7))
{

if(bir_sutun)
{
bir_sutun=0;
if(input(pin_b7))
{
if(iki_sutun)
{
iki_sutun=0;
if(input(pin_b7))
{
if(sifre[0]==' ')
{
sifre[0]='#';
}
else if(sifre[1] ==' ')
{
sifre[1]='#';
}
else if(sifre[2]== ' ')
{
sifre[2]='#';
}
else if(sifre[3] == ' ')
{
sifre[3]='#';
}
else
{
if(sifre[0]==1 && sifre[1]==4 && sifre[2]==5 && sifre[3]==3)
{
yesil_led=1;
}
else
{
kirmizi_led=1;
//sifirla();
}
}
tusbul();
}
else
{
if(sifre[0]==' ')
{
sifre[0]=0;
}
else if(sifre[1] ==' ')
{
sifre[1]=0;
}
else if(sifre[2]== ' ')
{
sifre[2]=0;
}
else if(sifre[3] == ' ')
{
sifre[3]=0;
}
else
{
sifirla();
}
tusbul();
}
}
}
else
{
if(sifre[0]==' ')
{
sifre[0]='*';
}
else if(sifre[1] ==' ')
{
sifre[1]='*';
}
else if(sifre[2]== ' ')
{
sifre[2]='*';
}
else if(sifre[3] == ' ')
{
sifre[3]='*';
}
else
{
sifirla();
}
tusbul();
}
}
}
}

  if(input(pin_b4)) // Eğer 1 satıra basıldıysa bu kod işleyecek (Benim devrede birinci satır b4 portuna bağlı ondan dolayı)
  {
birinci_sutun=0;//Birinci sütunu kapatıyoruz
if(input(bin_b4))
{
//eğer buraya girerse basılan tuş birinci sütun da değildir çünkü buraya girmeden önce e0 portu(benim devrede birinci sütuna 5 v veriyor) 0 yaptığımızdan dolayı koşul sağlanmaz 
//üsteki yaptıklarımızı bu sefer ikinci_sutun için yapıyoruz

}
else
{
//basılan tuş bir'dir (input(pin_b5) olsaydı 4 b6 olsaydı 7 b7 olsaydı * olacaktı)
}
  }
bu algoritma pek mantıklı değil fakat benim aklıma başka birşey gelmedi :( elimden geldiği kadar anlatmaya çalıştım anlatımın kötü olabilir ve ayrıca normalde lcd display ile kullanmak lazım fakat ben onu bir türlü kullanmayı beceremediğim dolayı kullanamadım :( eksiklikler için   kusura bakmayın doğru şifre 1453 hex dosyası kesme.hex (main.hex de varda ondan dolayı yazdım gülme  ;) )
Kaynak kodları https://docs.google.com/file/d/0B0McQkYCThIUWmRETXB6M1V3YzA/edit?usp=sharing