Arduino‘ nun olmadığı zamanlarda PIC kullanarak yaptığım bir Kayan Yazı Uygulaması siznle paylaşmak istiyorum. Belki bir kaç noktayı başka projeleriniz de kullanarak kendinize fayda sağlayabilirsiniz.

Kayan yazı 4 katmandan oluşur.
1. İşlemci katmanı
2. Sürücü katmanı
3. Transistör katmanı
4. Matris LED katmanı

Teknik özellikler:
1. 6×24 matrisli ekrana sahiptir
2. 14 karakterlik hafızası vardır
3. belli bir hızda kayma yapar
4. sadece alfabedeki karakterler girilebilir (ç,i,ğ,Ģ,ü,ö,q,w,x hariç)

Hafızaya veri yükleme:
Kayan yazının ilk enerji verildiğinde hafıza boştur. hafızaya klavyeden karakter yüklemek içim yapılması gerekenler;
1. enerji ve klavye bağlantısı yapılır
2. “klavye algılama anahtarı” “1” konumuna alınır
3. reset butonuna basılır
4. ilk olarak “klavye algılama anahtarı” algılanıp led 2 saniye boyuca yanacaktır
5. led söndügü zaman kalvye ye 3 karakter/saniye (saniyede 3 tuşa basma hızı) hızla yazılabilir
6. yazım işlemi 14 karakterle sınırlıdır
7. yazım işlemi bittikten sonra “enter” tuşuna basılır
8. yazım iĢlemi hafızaya alınana kadar 4 tane led yanar
9. ledler söndükten sonra kayam işlemi kısır döngü olarak devam eder
1. 10.klavye algılama anahtarı 0 konumuna alınır

Artık enerji kesilse bile bilgi hafızadan silinmez. Enerjiyi verdiğinizde hafızada önceden ne yazılmış ise onu kaydırır. Tekrar yazılmak istenirse yukarıdaki işlem tekrarlanır.

Kayan Yazi Uygulaması

Kayan Yazi Uygulaması

Kay_islemci.dsn

Bu katman işlemci katmanıdır. Klavye girişi ve güç girişi bu katmanda yapılır. Klavyeden girilen bilgiler 16F628A tarafından okunur ve gerekli hesaplamalar yapılarak “kay_sürücü” katına gönderilir.

Kayan Yazi Pic Devresi

Kayan Yazi Pic Devresi

Kay_sürücü.DSN

Bu katman lojik kapılardan oluşan sürücü katıdır. işlemciden gelen bilgiler sıralı bir şekilde LED lere gitmesi için 1 den 24 e kadar sırayla matris sürücü katına gönderilir.

Kayan Yazi Kapı Devresi

Kayan Yazi Kapı Devresi

Kay_matris_sürücü.DSN

Bu katman LED leri süren transistörlerden oluşur. Sürücü katından gelen sinyaller transistörleri tetikleyerek LED lerin yanmasını sağlar.

Kayan Yazi Sürücü Devresi

Kayan Yazi Sürücü Devresi

Kay_matris.DSN

Bu katman LED lerden oluşur ve gösterge katıdır. Sinyallerin LED ler tarafından ışığa dönüştürüldüğü katmandır.

Kayan Yazi Led Devresi

Kayan Yazi Led Devresi

Kayan Yazı Uygulaması Pic Program Mantığı

Pic programı ilk enerji verildiğinde klavye algılama anahtarını kontrol eder.eğer anahtar “1” konumunda ise klavye fonksiyonuna dallanarak klavyeden girilen bilgileri okur ve eproma yazar. Daha sonra “enter” tuşuna basılınca program eproma yazılan değerleri ekranda yazdırmak için ekrana_yaz fonsiyonuna dallanır. Ekrana yazma fonksiyonu kısır döngü olarak çalışır. Eğer ilk açılışta klavye algılama anahtarı “0” konumundaysa program direk epromdan okuma fonksiyonuna dallan arak mevcut karakterleri okur ve komut beklemeksizin ekrana yazdırma fonksiyonuna dallanarak kısır döngü olarak çalışmaya devam eder. Pic in eprom hafızası sınırlı olduğundan 14 karaktere kadar hafıza işlemi gerçekleştirilebilir.

Harf kodları picin içine yazılımsal olarak yüklenmiştir. Dolasıyla istenilen karakterler aşağıdaki tablodaki gibi oluşturularak yüklenebilir.

Kayan Yazı Tarama Sistemi

Kayan Yazı Tarama Sistemi

Kayan Yazı Karakter Kodlaması

Kayan Yazı Karakter Kodlaması

Kayan Yazı Uygulaması Pic Programı
//pic klavye bağlantılı kayan yazı uygulaması 
//13.04.2007
//www.kaizen40.com

//   teknik özellikler:
//   1. 6x24 matrisli ekrana sahiptir
//   2. 14 karakterlik hafızası vardır
//   3. belli bir hızda kayma yapar
//   4. sadece nümerik karakterler girilebilir (ç,i,ğ,ş,ü,ö,q,w,x hariç) 
//
//   hafızaya veri yükleme:
//   kayan yazının ilk enerji verildiğinde hafıza boştur. hafızaya klavyeden karakter yüklemek
//   içim yapılması gerekenler;
//
//   1. enerji ve klavye bağlantısı yapılır
//   2. klavye algılama anahtarı 1 konumuna alınır
//   3. reset butonuna basılır
//   4. ilk olarak klavye algılama anahtarı algılanıp led 2 saniye boyuca yanacaktır
//   5. led söndügü zaman kalvye ye 3 karakter/saniye hızla yazılabilir
//   6. yazım işlemi 14 karakterle sınırlıdır
//   7. yazım işlemi bittikten sonra "enter" tuşuna basılır
//   8. yazım işlemi hafızaya alınana kadar 4 tane led yanar
//   9. ledler söndükten sonra kayam işlemi kısır döngü olarak devam eder
//   10.klavye algılama anahtarı 0 konumuna alınır
//
//   artık enerji kesilse bile bilgi hafızadan silinmez. enerjiyi verdiğinizde hafızada 
//   önceden ne yazılmış ise onu kaydırır. tekrar yazılmak istenirse yukarıdaki işlem tekrarlanır

#if defined (__PCM__)
#include <16F628A.h>
#use delay(clock=4000000)
#fuses NOWDT,PUT,NOLVP,NOBROWNOUT,MCLR,INTRC_IO,NOPROTECT
#endif
#byte PORTA = 0x05
#byte PORTB = 0x06

// veri adresini tanımladım
#bit b_0 = 0x63.0
#bit b_1 = 0x63.1
#bit b_2 = 0x63.2
#bit b_3 = 0x63.3
#bit b_4 = 0x63.4
#bit b_5 = 0x63.5
#bit b_6 = 0x63.6
#bit b_7 = 0x63.7

char harf[67] = {};   // karakter kodlarının tutlduğu yer 

char veri=0, clk=0, mev_veri=0, hafiza=0, i=0, harf_nerde=0, indis=0;
char a=0, b=0, c=0, d=0, x=128, y=0, kaydirma=0, tarama_kez=0, t_sure=10, kay_saklayicisi=1;   // t süre ilk dongüde sorun cıkmasın diye 10 yazıldı
char bekleme=1, k_hiz=150;         // bekleme = vrinin nekadar süre yanık kalacagının belirler
                                   // k_hiz = kayma hızını yani 1 sutundan diger sutuna geçiş süresini belirler

void main()
{
   set_tris_b(0b01000000);      // RB6 klavye algılama için anahtar konuldu
   set_tris_a(0b00111000);      // RA5=MCLR   RA4=clock   RA3=veri hattı
         
//******************** KLAVYE ALGILAMA *****************************************(klavye algılama başarılı)
   if(bit_test(PORTB,6) == 1)            // klavye için RB6 pinine anahtar bağlandı "1" de algılama
   {                                                         
      output_b(0);
      delay_ms(100);
      goto klavye;
   }

//**************************** EEPROMDAKİ VERİYİ HARF DİZİNİNE YAZ *************(eeprom yaz başarılı)
   ekrana_yaz:
   output_b(0x0F);             // eeproma veri yazımı tamamlmandığını görmek için yapıldı
   
   indis=harf_nerde=0;         // harf_nerdeyi ve indisi sıfırla
   do
   {
      i=i+1;
      indis=read_eeprom(i);
      delay_ms(100);
      switch(indis)
      {
         case 28:       // a harfi
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=62;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=5;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=5;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=62;            
            break;
         case 50:         // b harfi
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=63;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=37;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=37;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=26; 
            break;
         case 33:    // c harfi
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=30;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=33;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=33;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=18;
            break;
         case 35:    // d harfi
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=63;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=33;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=33;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=30;
            break;
         case 36:    // e harfi
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=63;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=37;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=37;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=33;
            break;
         case 43:    // f harfi
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=63;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=5;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=5;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=1;
            break;
         case 52:         // g harfi                 
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=30;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=33;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=41;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=26;   
            break;
         case 51:      // h harfi
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=63;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=4;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=4;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=63;   
            break;
         case 67:     // i harfi    
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=61;     
            break;
         case 59:      // j harfi   
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=16;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=32;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=32;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=31;   
            break;
         case 66:      // k harfi   
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=63;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=4;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=10;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=49;   
            break;
         case 75:       // l harfi  
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=63;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=32;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=32;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=32;   
            break;
         case 58:   // m harfi      
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=63;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=2;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=4;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=2;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=63;
            break;
         case 49:    // n harfi     
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=63;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=6;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=24;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=63;   
            break;
         case 68:   // o harfi         
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=30;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=33;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=33;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=30;            
            break;
         case 77:   // p harfi         
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=63;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=9;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=9;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=6;   
            break;
         case 45:    // r harfi     
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=63;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=9;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=25;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=38;   
            break;
         case 27:     // s harfi    
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=18;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=37;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=41;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=18;   
            break;
         case 44:   // t harfi         
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=1;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=1;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=63;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=1;   
            break;
         case 60:   // u harfi         
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=31;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=32;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=32;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=31;   
            break;
         case 42:   // v harfi         
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=15;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=16;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=32;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=31;            
            break;
         case 53:   // y harfi         
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=1;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=2;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=60;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=3;   
            break;
         case 26:   // z harfi         
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=49;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=41;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=37;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=35;   
            break;
         case 73:    // nokta         
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=32;  
            break;
         case 41:   // boşluk
            harf_nerde=harf_nerde+1;   
            harf[harf_nerde]=0;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=0;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=0;
            harf_nerde=harf_nerde+1;
            harf[harf_nerde]=0;
            break;         
      }   
   }while(i != 14);
   
   do
   {      
      harf_nerde=harf_nerde+1;
      harf[harf_nerde]=0;                   // harf dizinindeki bos kalan yerleri sıfırla
   }while(harf_nerde != 67);                // son hücreye gelene kadar sıfırla 
   harf_nerde=0;
   output_b(0);                             // epromdan veri okuma tamamlandı ledi söndür
   goto kay;
   
//******************** KAYMA FONKSİYONU ****************************************(kayma fonksiyonu başarılı)
   kay:
   kaydirma=1;
   while(TRUE)
   {            
      for(tarama_kez=0; tarama_kez<t_sure; tarama_kez++)  // kaydırma hızı, t_sure kaydırma hızını belirler
      {
         switch(kaydirma)      // kaymayı sağlıyor 
         {
            case 1:   y=1;     a=1;  t_sure=k_hiz/y*bekleme; break;   // t_sure = kayma süresini sabitliyor                                   
                      y=d;                 
            case 2:   if(tarama_kez==1)                               // yok etme görevini saglıyor
                      {                                               // y = harf dizinin nereden geri sayacagını belirler
                         y=d=d+1;         
                         a=1;
                      }
                      y=d;   t_sure=k_hiz/y*bekleme;   break;         // a = ilk harf son sütuna ulastıktan sonra
                                  
            case 25:  b=y=25;  c=a=2;t_sure=k_hiz/y*bekleme; break;   // a, 24. sutundan sonra 1 artıcagı için case 25 yapıldı   
            case 26:  if(tarama_kez==1)                               // ilk kez tarama geldiginde deger 1 arttırlacak
                      {                                               // bir sonraki kaydırmaya kadar deger artısı olamayacak
                         y=b=b+1;         
                         a=c=c+1;
                      }
                      y=b;   t_sure=k_hiz/26*bekleme;   break;                                            
         }                 
         for(y=y; y>=a; y=y-1)          // bir tarama tur sayıcısı
         {                              // her seferinde yazılan harfin en son parcasından baslayarak 
            x=x+1;                      // ilk harfe dogru sayar ve her sayma sonunda sutunu 1 kaydırır
            if(x==136){x=192;}          // iki tane 4067 yi birbirine entegre etmek için aradaki yapıldı
            if(x==200){x=1;}          // excel de acıklaması var (sütun tarama işlemi.xls)
            if(x==8){x=64;}
            if(x==66){x=65;}
            
            // ekrana yaz
            output_b(harf[y]);          // veriyi gönder    
            output_a(x);                  // sutunu ac
            delay_ms(bekleme);            
         }
         x=128;
      }      
      kay_saklayicisi=kay_saklayicisi+1;                              // harfi bir sutun kaydır
      if(kay_saklayicisi<=24){kaydirma=2;}                        // kaydırma 1 ile 24. sutunlar arasında ise case 2 ye dallan
      if(kay_saklayicisi==25){kaydirma=25;}                      // kaydırma son sutunu aşmış ise case 25e git = tarama fonku için dizini 1 kaydır
      if(kay_saklayicisi>=26){kaydirma=26; kay_saklayicisi=26;}    // kaydırma son sutunu sürekli aşar, case 26 da kal = sürekli yazı bitene kadar tarama fonku için dizini 1 kaydır
      if(b==78){kaydirma=1; kay_saklayicisi=1; d=b=0;}             // son kelimenin son sutunu cıktıktan sonra yeniden başla            
   }

// *********** KLAVYEDEN VERİYİ OKUMA FONKSİYONU *******************************(veri alımı başarılı)
      klavye:                                
      output_high(PIN_B0);     
      output_high(PIN_A0);     // kalvye yaz komutu geldiginde kırmızı led yanar
      delay_ms(2000);          // ve 2 saniye sonra kırmızı led söndügünde klavyeden yazma işlemine gecilir
      output_low(PIN_B0);      // klavye fonkunda oldumuzu algılamak için sürece yanar
      mev_veri=0;
      
      tekrar:
      if(bit_test(PORTA,4)==0)    // clock palsi -start biti-
      {           
         bekle:
         if(bit_test(PORTA,4)==0){goto bekle;}   // ilk yükselen kenar biti gelene kadar bekle          
         
         clk=clk+1;               // ilk clock pals geldi
         bekle1:
         switch (clk)             // clock palse göre veriyi algılayıp kaydet 
         {            
            case 1:   if(bit_test(PORTA,3)==1){b_0=1;} else{b_0=0;}   break;
            case 2:   if(bit_test(PORTA,3)==1){b_1=1;} else{b_1=0;}   break;
            case 3:   if(bit_test(PORTA,3)==1){b_2=1;} else{b_2=0;}   break;
            case 4:   if(bit_test(PORTA,3)==1){b_3=1;} else{b_3=0;}   break;
            case 5:   if(bit_test(PORTA,3)==1){b_4=1;} else{b_4=0;}   break;
            case 6:   if(bit_test(PORTA,3)==1){b_5=1;} else{b_5=0;}   break;
            case 7:   if(bit_test(PORTA,3)==1){b_6=1;} else{b_6=0;}   break;
            case 8:   if(bit_test(PORTA,3)==1){b_7=1;} else{b_7=0;}   break;            
         }                                       
         mev_veri = veri;         // veriyi mevcut veriye kaydet ardından veriyi sil ki 
                                  // sonraki veriler üst üste binmesin                  
         if(bit_test(PORTA,4)==1){goto bekle1;}   // diger clk gelene kadar sürekli algıla ve yaz
                           
         if(clk == 11)            // son clk mı?
         {clk=0; delay_ms(30);}   // evet clkyı sil ve -uzun çizgi (stop) için bekletme yaptım-
         else {goto tekrar;}      // hayır tekrar veriyi almaya git                         
      }      
      veri = 0;                   // sonraki veriler üst üste binmesin diye siliniyor            
      
      if(mev_veri == 90)          // kay komutu geldiğinde yazılan harflerden 
      {                           // sonraki harf hafizalarının sil ve kaymaya git      
         do
         {                        // boş kalan hafızayı temizle
            hafiza=hafiza+1;
            write_eeprom(hafiza, 0x00);   
         
         }while(hafiza != 14);    // en son kelime hafızasına gelirsen onu da sil ve ekrana yazmaya dallan
         i=hafiza=0;
         output_b(0x05);          // KONTROL İÇİN
         delay_ms(1000);
         goto ekrana_yaz;
      }
      
      //******************** EEPROMA YAZ ***************************************(hafızaya alım basarılı)
      if(mev_veri != 0)         // 14 kelimelik hafızamız mevcut
      {         
         hafiza=hafiza+1;
         if(hafiza==15){hafiza=1;}
         switch (hafiza)
         {
            case 1: write_eeprom(0x01, mev_veri); break;
            case 2: write_eeprom(0x02, mev_veri); break;
            case 3: write_eeprom(0x03, mev_veri); break;
            case 4: write_eeprom(0x04, mev_veri); break;
            case 5: write_eeprom(0x05, mev_veri); break;
            case 6: write_eeprom(0x06, mev_veri); break;
            case 7: write_eeprom(0x07, mev_veri); break;
            case 8: write_eeprom(0x08, mev_veri); break;
            case 9: write_eeprom(0x09, mev_veri); break;
            case 10: write_eeprom(0x0A, mev_veri); break;
            case 11: write_eeprom(0x0B, mev_veri); break;
            case 12: write_eeprom(0x0C, mev_veri); break;
            case 13: write_eeprom(0x0D, mev_veri); break;
            case 14: write_eeprom(0x0E, mev_veri); break;
         }         
         mev_veri=0;
         delay_ms(100);
      }     
      goto tekrar;
}

0 yorum

Bir cevap yazın

Avatar placeholder

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.