13 Temmuz 2016 Çarşamba

GRAFİK LCD EKRANLI ŞİFRELİ KİLİT

     Merhabalar... 
     Projemizde grafik lcd göstergeli, 4x4 keypadli bir şifreli kilit yapacağız. PIC16F877A ile sürdüğümüz 128x64 grafik lcd ile kullanıcı için şık tasarımlı bir menü hazırlayacağız.Projemizde  KS0108 kontrolörlü Winstar  marka WG12864C model glcd kullanacağız.




    WG12864C model grafik lcd'nin pin konfigürasyonu ve açıklamaları tabloda belirtilmiştir.


     128x64 glcd nin sayfa düzeni aşağıdaki gibidir. 
    MikroC de GLCD kütüphanesine ait fonksiyonlarının bir kısmı yukarıda ki düzene göre çalışmaktadır. Bu fonksiyonları MikroC PRO for PIC derleyicisinin Glcd kütüphanesinden inceleyebilirsiniz.
     Şimdi tuş takımı (keypad) hakkında bilgi verelim. Kontrol sistemlerinde dış dünyadan insanlar tarafından veri girişi genellikle tuş takımı ile yapılır. Piyasada hazır tuş takımları bulunmaktadır. Biz de projemizde aşağıdaki gibi hazır 4x4 matris tuş takımı kullandık.

     Tuş takımında hangi tuşa basıldığının tespiti tarama yöntemi ile yapılır. Aşağıda 4x4 keypad satır ve sütun bağlantıları görülmektedir. Tarama yöntemimizde sütunları çıkış, satırları da giriş olarak tanımladık. Programcı isterse sütunları giriş, satırları da çıkış olarak tanımlayabilir. Fakat bu durum tarama programında değişiklikler yapmakla birlikte programcının isteğine bağlıdır.


        Klavye tarama programının yapılabilmesi için tuş takımının satır ve sütunlarının elektriksel potansiyel düzeylerinin bilinmesi gereklidir. Biz devremizde satırlara 10K pull-up dirençleri bağladık. Yani satırları 10K dirençler üzerinden 5V düzeyine çektik. Bu durumda satırlar devamlı olarak lojik 1 düzeyindedir. Hangi tuşa basıldığını tayin etmek için mikrodenetleyiciden gönderilen verilerle önce sütunlardan biri lojik 0 diğerleri lojik 1 yapılır. Sonra satırlar okunur, hangi giriş lojik 0 ise o sütuna ait satırdaki tuşa basılmış demektir. Tuşlara hangi değerlerin verileceği programcının isteğine bağlıdır. Bizim bağlantımıza göre 4. sütun lojik-0 diğer sütunlar lojik-1 iken, 4.sütunda bulunan 3. sıradaki tuşa basıldığında 3.satırda lojik-0 bilgisi okunur. Böylece basılan tuş bulunabilir. Tabi ki 4.sütunda değil de diğer sütunlardaki tuşlara basılmışsa algılama yapılamaz. Bu nedenle her bir sütun sıra ile lojik-0, diğer sütunlar lojik-1 yapılarak tüm satırlar okunur. Bu şekide tuş takımını tarama işlemi gerçekleştirilir.

     Şifreli kilit projemizin devre şeması yukarıda ki gibidir. Şemadan da görüleceği üzere devremiz de PIC16F877A, Grafik LCD, 4x4 keypad, röle, buzzer ve diğer elemanlar bulunmaktadır. Keypadin herhangi bir tuşuna basıldığında buzzer çalışacak ve led yanacaktır. Şifre doğru girildiğinde röle çekecek ve bir müddet çekili kaldıktan sonra bırakılacaktır. Ayrıca kişi istediği takdirde  cihazın şifresini değişetirebilir.
     Projemizin mikrodenetleyici programı aşağıdadır.
// Glcd module connections
const code char kilitacik[1024];
const code char kilitkapali[1024];
const code char tick[1024];
char GLCD_DataPort at PORTB;
sbit GLCD_CS1 at RD2_bit;
sbit GLCD_CS2 at RD3_bit;
sbit GLCD_RS  at RD4_bit;
sbit GLCD_RW  at RD5_bit;
sbit GLCD_EN  at RD6_bit;
sbit GLCD_RST at RD7_bit;

sbit GLCD_CS1_Direction at TRISD2_bit;
sbit GLCD_CS2_Direction at TRISD3_bit;
sbit GLCD_RS_Direction  at TRISD4_bit;
sbit GLCD_RW_Direction  at TRISD5_bit;
sbit GLCD_EN_Direction  at TRISD6_bit;
sbit GLCD_RST_Direction at TRISD7_bit;
// End Glcd module connections

char txt1[]={"*SifreliKilit*"};
char txt2[]={"Enter'aBasiniz"};
char txt3[]={"Sifre Giriniz"};
char txt4[]={"SifreDegistir"};
char txt5[]={"##eski##"};
char txt6[]={"##yeni##"};

#define buzzer PORTD.B0
#define ROLE   PORTD.B1
      
unsigned short syc=0,latch=18,i=0,al,x,j=0,sendsyc=16;
unsigned short sifresirasyc=10,t,tmr1_syc=0;
char sifre[7];
char deneme[7];
char yenisifre[7];
unsigned short kullanicisifre[6];
unsigned short izci_sifre=0;
char karek[3];

          //  '1', '2', '3', 'A'
          //  '4', '5', '6', 'B'
          //  '7', '8', '9', 'C'
          //  '*', '0', '#', 'D'
char tus_krs[ ]={'A','B','C','D','3','6','9','#','2','5','8','0','1','4','7','*'} ;
bit kont_bit;
bit izci;

//Timer1
//Prescaler 1:8; TMR1 Preload = 3036; Actual Interrupt Time : 500 ms

//Place/Copy this part in declaration section
void InitTimer1(){
  T1CON         = 0x31;
  TMR1IF_bit         = 0;
  TMR1H         = 0x0B;
  TMR1L         = 0xDC;
  TMR1IE_bit         = 1;
  INTCON         = 0xC0;
}

void Interrupt(){
  if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H         = 0x0B;
    TMR1L         = 0xDC;
    tmr1_syc++; //Enter your code here
    if(tmr1_syc==10){tmr1_syc=0; izci=1;  tmr1on_bit=0;}
  }
}

unsigned short tarama(){
    PORTC=0xEF;//0XF7;
    syc=0;
    //if(syc==16) syc=0;
    for(i=0;i<=3;i++){
    //PORTC=PORTC<<1;
    al=PORTA;

    for(x=0;x<=3;x++){
    if(!al.B3){kont_bit=1; sendsyc=syc; return sendsyc;}
    else {syc++; kont_bit=0;}
    al=al<<1;
    }
    PORTC=PORTC<<1;

    }
   sendsyc=16;
}
 void sifreal(){
 sifre[0]=EEPROM_Read(0x00);
 sifre[1]=EEPROM_Read(0x01);
 sifre[2]=EEPROM_Read(0x02);
 sifre[3]=EEPROM_Read(0x03);
 sifre[4]=EEPROM_Read(0x04);
 sifre[5]=EEPROM_Read(0x05);
 }
unsigned short sifre_degis(){

   izci=0;
   tmr1_syc=0;
   InitTimer1();

   Glcd_Fill(0);
   Glcd_Write_Text(txt6,15,0,1);
   Glcd_Write_Text(txt3,5,1,1);
   while(1){
             tarama();
        if(izci){  izci_sifre=1; return izci_sifre;}
        if(kont_bit&&sendsyc!=0&&sendsyc!=1) {
          
          tmr1_syc=0;
          InitTimer1();
          
          buzzer=1;
          Glcd_Write_Char(tus_krs[sendsyc],sifresirasyc,2,1);
          sifresirasyc+=8;
          yenisifre[j]=tus_krs[sendsyc];
          j++;  if(j==6) j=0;


          latch=sendsyc;
          while(kont_bit&&latch==sendsyc){  tarama(); }
          delay_ms(50);
          buzzer=0;
         //**********************

         if(sifresirasyc==58){                       
                               sifresirasyc=10;
                               EEPROM_Write(0x00,yenisifre[0]);
                               EEPROM_Write(0x01,yenisifre[1]);
                               EEPROM_Write(0x02,yenisifre[2]);
                               EEPROM_Write(0x03,yenisifre[3]);
                               EEPROM_Write(0x04,yenisifre[4]);
                               EEPROM_Write(0x05,yenisifre[5]);
                               sendsyc=16;
                               Glcd_Fill(0);
                               Glcd_Image(tick);
                               Glcd_Write_Text("Sifre Kaydoldu",0,0,1);
                               delay_ms(500);
                               Glcd_Fill(0);
                               break;
                               }
         //**********************



         kont_bit=0;
        }
   }
}

void main() {
      ADCON1=0x06;
      TRISC=0X00;
      TRISD.B0=0;
      TRISD.B1=0;
      TRISA=0XFF;
      
      PORTC=0XFF;
      PORTD.B0=0;
      PORTD.B1=0;
      kont_bit=0;
      izci=0;
      
      Glcd_Init();
      Glcd_Fill(0);
      delay_ms(20);
      sifreal();

        
      Glcd_Set_Font(Font_Glcd_Character8x7,8,7,32);   

TKRR:   Glcd_Fill(0);
        Glcd_Write_Text(txt1,0,0,1);
        Glcd_Write_Text(txt2,0,1,1);
        sifreal();
        while(1){ tarama(); if(sendsyc==0) break;   }
        //while(sendsyc!=0/*syc!=1*/){ tarama();  };
        delay_ms(50);

        Glcd_Fill(0);
        Glcd_Write_Text(txt3,5,0,1); //Glcd_Write_Text(txt3,15,0,1);
        kont_bit=0;
        
        j=0;
        izci=0;
        izci_sifre=0;
        tmr1_syc=0;
        sifresirasyc=10;
        InitTimer1();

while(1){

           tarama();
        if(izci){  goto TKRR; }
        if(kont_bit&&sendsyc!=0&&sendsyc!=1) {

           tmr1_syc=0;
           InitTimer1();

           buzzer=1;
           Glcd_Write_Char(tus_krs[sendsyc],sifresirasyc,2,1);
           sifresirasyc+=8;//sifresirasyc+=5;
          
           deneme[j]=tus_krs[sendsyc];
           j++;  if(j==6) j=0;


           latch=sendsyc;
           while(kont_bit&&latch==sendsyc){  tarama(); }
           delay_ms(50);
           buzzer=0;
         //**********************

               if(sifresirasyc==58){                         
                                     sifresirasyc=10;
                                     if(!strncmp(deneme,sifre,6)){
                                     Glcd_Image(kilitacik); 
                                     ROLE=1; buzzer=1;
                                     delay_ms(500);
                                     ROLE=0; buzzer=0; }
                                     else    Glcd_Image(kilitkapali);
                                     delay_ms(1000);
                                     Glcd_Fill(0);
                                     sendsyc=16;
                                     goto TKRR;
                                     }
         //**********************
                         
         kont_bit=0;
        }
        
        

        
        if(kont_bit&&sendsyc==1&&sifresirasyc==10){
           Glcd_Fill(0);
           sifresirasyc=10; j=0;// önemli
           Glcd_Write_Text(txt4,5,0,1);
           delay_ms(500); Glcd_Fill(0);
           Glcd_Write_Text(txt5,15,0,1);
           Glcd_Write_Text(txt3,5,1,1);
           kont_bit=0;
                
           izci=0;
           tmr1_syc=0;
           InitTimer1();
                
           while(1){
                   tarama();
                   if(izci){  goto TKRR; }
                   if(kont_bit&&sendsyc!=0&&sendsyc!=1) {
                   
                   tmr1_syc=0;
                   InitTimer1();
                   
                   buzzer=1;
                   Glcd_Write_Char(tus_krs[sendsyc],sifresirasyc,2,1);
                   sifresirasyc+=8;//sifresirasyc+=5;

                   deneme[j]=tus_krs[sendsyc];
                   j++;  if(j==6) j=0;


                   latch=sendsyc;
                   while(kont_bit&&latch==sendsyc){  tarama(); }
                   delay_ms(50);
                   buzzer=0;
                 //**********************

                  if(sifresirasyc==58){
                                       sifresirasyc=10;
                                       if(!strncmp(deneme,sifre,6)){   sifre_degis();
                                                                       if(izci_sifre){ goto TKRR;}
                                                                       goto TKRR;
                                                                               }
                                       else {   
                                       Glcd_Fill(0);
                                       sendsyc=16;
                                       goto TKRR;}
                                   }
         //**********************



         kont_bit=0;
                }              
                
            }
         }      
     }

}
    Programda mikroC'nin EEPROM  kütüphanesi de kullanılmıştır. Böylelikle kişi cihazın şifresini değiştirdikten sonra devrenin enerjisi kesilse de yani mikrodenetleyici reset alsa da EEPROM'da şifre saklanır. Derleyici içerisinde Tools menüsünde yer alan EEPROM Editor programı ile mikrodenetleyicinin eeprom registerlarına ilk değeri yükleyebilirsiniz.

   Ayrıca programda timer1 donanım kesmesi (interrupt) kullanılmıştır. Timer1, 5 saniyede bir kesme üretecek şekilde şartlanmıştır. Böylece kişi şifrenin herhangi bir hanesini girdikten sonra sıradaki haneyi girmesi için 5 saniye süresi olacak. Eğer 5 sn içinde şifrenin sıradaki hanesi girilmezse program kendini başa alacaktır. Bu sadece şifre girerken değil şifre değiştirirkende uygulanmaktadır. Programı inceleyerek daha detaylı olarak da anlayabilirsiniz.
     Uygulamamızda belirli yerlerde GLCD üzerine aşağıda ki bmp resimler basılmaktadır.

     Bu bmp resimleri GLCD Bitmap Editör programını kullanarak hexadecimal kodlara dönüştürüp ekrana bastık. GLCD Bitmap Editör'e, mikroC PRO for PIC - Tools menüsünden ulaşabilirsiniz.

  Yukarıda GLCD Bitmap Editör arayüzü görülmektedir. Load BMP butonuna tıklayıp hex'e çevireceğiniz bmp resmi seçebilirsiniz. Invert Picture butonuna tıklayarak seçtiğiniz resmin tersini alabilirsiniz. Daha sonra Generated Code penceresinde ki kodu Copy Code To Clipboard butonuna tıklayıp kopyalayıp ardından yeni bir dosya açıp bu kodu içine yapıştırıp .c uzantılı olarak kaydetmeniz gereklidir. Daha sonrada kaydettiğiniz bu dosyayı Project menüsünde yer alan Add File To Project'e tıklayıp projenize eklemeniz gerekmektedir.
  Projemizin isis simülasyon videosu aşağıdadır. İsisde  keypad üzerindeki tuşların düzeni bizimkinden  farklıdır. Yukarıda verdiğimiz devre şemasında ki keypad düzenini dikkate alınız.

    Projemizin kutulanmış hali aşağıdadır. Projenin gerçek uygulama videosu da yakında yayınlanacaktır.

    İlgilenen arkadaşlara kolay gelsin.
    Başarılar...



4 yorum:

  1. demo limit hatası vermektedir.ne yapabilirim

    YanıtlaSil
  2. Eğer kullandığınız mikroc derleyici demo versiyon ise 2K byte dan fazla programı derleyemeye izin vermez. Hatayı bu nedenden dolayı alıyor olabilirsiniz.

    YanıtlaSil
  3. const code char kilitacik[1024];
    const code char kilitkapali[1024];
    const code char tick[1024]; hata veriyor

    const code char kilitacik[1024]= "ENTER PARAMETER:";
    const code char kilitkapali[1024]= "ENTER PARAMETER:";
    const code char tick[1024]= "ENTER PARAMETER:";

    şeklinde yazınca düzeliyor

    YanıtlaSil
  4. Gambling In Las Vegas Has Been A Real Trend - DRMCD
    While many casinos 인천광역 출장샵 have come to 충청북도 출장샵 terms with their games, slot 전주 출장샵 machines have become more popular. Here's 상주 출장안마 a look at their latest 춘천 출장마사지 innovations

    YanıtlaSil