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.
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.
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.
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.
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 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ı 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