CCS C ile yapıp çalıştırdığım bu kayanyazı devresini verdiğm kodlarını inceleyerek kendinize uyarlayabilirsiniz.
Benim yaptığım devre yukarıdakiyle neredeyse aynı olup shift register olarak tpic6b595 kullandım ama 74595 ilede devre çalışacaktır.
Devreye ilk enerji verildiÄŸinde çiersine default olarak verilen yazı dizisini kaydırmaya baÅŸlayacaktır. Yazıyı deÄŸiÅŸtirmek isterseniz terminal programı ile haberleÅŸmeyi baÅŸlatmak için “EL” harflerini yazıp enter’a basmanız gerekli
Daha sonra terminal ekranına “Karakter sayisini giriniz.” diye bir uyarı gelecektir. Buraya göndereceiÄŸiniz yazı dizisinde yer alan karakter sayısını boÅŸluklarla girmeniz gereklidir. EÄŸer yazınız 10 karakterden küçükse örneÄŸin 7 ise terminale 07 olarak giriniz. Karakter sayısını girip enter’a bastığınızda yazı hemen kaymaya baÅŸlayacaktır.
Yapacaklara kolay gelsin
/**********************************************/
/* www.ccspic.com */
/*********************************************/
#include <18F452.h>
#fuses HS,NOWDT,PUT,NOPROTECT,BROWNOUT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=N, bits=8)
#define PIN_RCLK PIN_D3 // RCLK —-> Pin 12
#define PIN_SCLK PIN_D4 // SRCLK —> Pin 13
#define PIN_SER_IN PIN_D2 // SER —–> Pin 3
//Kaydırılacak Karakter sayısı
long s1_char_size=22;
char s1[240];
long i;
// Default mesaj
char const msg_default[22] = ” www.ccspic.com”;
//Karakter tablosu 1
char const ascii1[32][5] = {
{0,0,0,0,0}
{0,0,95,0,0}
{0,7,0,7,0}
{20,127,20,127,20}
{36, 42, 127, 42, 18}
{39, 21, 107, 84, 114}
{54, 73, 86, 32, 80}
{0, 11, 7,0,0}
{0, 28, 34, 65,0}
{0, 65, 34, 28,0}
{42, 28, 127, 28, 42}
{8, 8, 62, 8, 8}
{0, 88, 56, 0,0}
{8,8,8,8,8}
{0, 96, 96, 0,0}
{32, 16, 8, 4, 2}
{62, 81, 73, 69, 62}
{0, 66, 127, 64,0}
{114, 73, 73, 73, 70}
{34, 65, 73, 73, 54}
{24, 20, 18, 127, 16}
{39, 69, 69, 69, 57}
{60, 74, 73, 73, 48}
{1, 113, 9, 5, 3}
{54, 73, 73, 73, 54}
{6, 73, 73, 41, 30}
{0, 54,54,0,0}
{0, 91, 59, 0,0}
{8, 20, 34, 65,0}
{20, 20, 20, 20, 20}
{65, 34, 20, 8,0}
{2, 1, 81, 9, 6}
};
//Karakter tablosu devamı
char const ascii2[32][5] = {
{50, 73, 121, 65, 62}
{124, 18, 17, 18, 124}
{65, 127, 73, 73, 54}
{62, 65, 65, 65, 34}
{65, 127, 65, 65, 62}
{127, 73, 73, 65, 65 }
{127, 9, 9, 1, 1}
{62, 65, 73, 73, 58}
{127, 8, 8, 8, 127}
{0, 65, 127, 65, 0}
{32, 64, 65, 63, 1}
{127, 8, 20, 34, 65}
{127, 64, 64, 64, 64}
{127, 2, 12, 2, 127}
{127, 2, 4, 8, 127}
{62, 65, 65, 65, 62}
{127, 9, 9, 9, 6}
{62, 65, 81, 33, 94}
{127, 9, 25, 41, 70}
{38, 73, 73, 73, 50}
{1,1,127, 1, 1}
{63, 64, 64, 64, 63}
{7, 24, 96, 24, 7}
{127, 32, 24, 32, 127}
{99, 20, 8, 20, 99}
{3, 4, 120, 4, 3}
{97, 81, 73, 69, 67}
{0, 127, 65, 65,0}
{2, 4, 8, 16, 32}
{0, 65, 65, 127,0}
{4, 2, 1, 2, 4}
{64, 64, 64, 64, 64}
};
//Karakter tablosu devamı
char const ascii3[31][5] = {
{0, 0, 7, 11,0}
{32, 84, 84, 84, 56}
{127, 40, 68, 68, 56}
{56, 68, 68, 68,0}
{56, 68, 68, 40, 127}
{56, 84, 84, 84, 24}
{8, 126, 9, 9, 2}
{8, 84, 84, 84, 60}
{127, 8, 4, 4, 120}
{0, 68, 125, 64,0}
{32, 64, 68, 61,0}
{127, 16, 40, 68,0}
{0, 65, 127, 64, 0}
{124, 4, 120, 4, 120}
{124, 8, 4, 4, 120}
{56, 68, 68, 68, 56}
{124, 20, 20, 20, 8}
{8, 20, 20, 20, 124}
{124, 8, 4, 4, 8}
{72, 84, 84, 84, 36}
{4, 63, 68, 68,0}
{60, 64, 64, 32, 124}
{28, 32, 64, 32, 28}
{60, 64, 48, 64, 60}
{68, 40, 16, 40, 68}
{12,80, 80, 80, 60}
{68, 100, 84, 76, 68}
{0, 8, 54, 65,0}
{0,0,119,0,0}
{0, 65, 54, 8,0}
{2,1,2,4,2}
};
//Girilen sayı kadar karakter diziye alınır
void get_line1(void)
{
for(i=0; i
{
if(kbhit())
{
s1[i]=getc();
delay_cycles(2);
printf(”%C”,s1[i]);
delay_us(1);
}
else
i -= 1;
}
}
//Mesajdaki karakter sayısı bulunur
void ext_isr()
{long MSD, LSD;
int a;
MSD=0;
LSD=0;
do
{
delay_cycles(2);
printf(”\f\r\n Karakter sayisini giriniz.”);
MSD=getc();
delay_cycles(2);
delay_us(1);
}while(!isamoung(MSD,”0123456789″));
do
{
LSD=getc();
delay_cycles(2);
delay_us(1);
}while(!isamoung(LSD,”0123456789″));
s1_char_size = 10*(MSD-48) + (LSD-48);
delay_cycles(2);
get_line1();
enable_interrupts(INT_RDA);
}
//Seri Port Kesmesi
#INT_RDA
void RDA_isr(void)
{int m,n;
m=getc();
n=getc();
if(m == ‘E’ && n == ‘L’)
{disable_interrupts(INT_RDA);
ext_isr();}
delay_ms(300);
}
void main(void)
{
int char_index; // karakter indeksi
int col_index; //karakterdeki kolon indeksi
int x = 0;
long MSD, LSD;
int32 delaycount;
int16 startposition;
enable_interrupts(INT_RDA);
enable_interrupts(global);
delay_ms(100);
startposition = 0;
//
for(i=0; i
s1[i] = msg_default[i];
delay_ms(100);
do
{
//delaycount mesajın kayma hızını ayarlar
//buradaki 5 mesajın ekranda 5 kez gösterir yazı sonra
//bir karakter kayar
delaycount=5;
while (delaycount)
{
// Karakterin kaçıncı sütunu taranacak bulunur
col_index = startposition % 6;
// Dizideki kaçıncı karakter bulunur
char_index = startposition / 6;
// Bulunan karakter nosu dizi sınırları içerisinde
// değilse başa dön
if (char_index >= s1_char_size)
{
startposition = 0;
char_index = 0;
col_index = 0;
}
//Karakter değişkene alınır
x = s1[char_index];
// Taramaya başlanacağından ilk sütuna 1 olur
// yani aktifleÅŸir daha sonra bu 1 bilgisi
// shift registerde kaydırılarak diğer sütunlar
// sırasıyla kaydırılır
output_high(PIN_RCLK);
output_high(PIN_SCLK);
output_high(PIN_SER_IN);
output_low(PIN_SCLK);
delay_us(1);
output_high(PIN_SCLK);
output_low(PIN_SER_IN);
// Burası taranacak sütun sayısını belirler.
//Benim yaptığım devrede 48 sütun olduğundan i<48 burada yer almıştır
//Siz kendi yaptığınız devrede kaç sütun kullanacaksanız onu yazınız.
for (i=0;i<48;i++)
{
output_b(0);
// Shift register verileri çıkışlara verilir
output_low(PIN_RCLK);
delay_us(1);
output_high(PIN_RCLK);
delay_us(1);
// İlk yüklenen "1" 595ler arası dolaştırılır
output_low(PIN_SCLK);
delay_us(1);
output_high(PIN_SCLK);
delay_us(50);
// Sütun indeksi 5 olursa sıradaki karaktere geçilir
if (col_index == 5)
{//Geçerli karakter bitti demektir
col_index = 0; // Sütunu sıfırlar
char_index++; // Sonraki karakktere geçer
if (char_index >= s1_char_size) //Dizide karakter bittiyse
char_index = 0; // Başa döner
x = s1[char_index];
}
else
{
// Geçersiz karakter gelirse ekranda boşluk gösterilir
if ( x < 32) //Ascii numara 32den küçük olanlar karakter değildir
output_b(0);
// Sırası gelen karakter ekrana yazdırılmak için önceden tanımlanmış
// Karakter dizileri içinde aranır.
// s1[]'in ascii1[] dizisinde olup olmadığı kontrol edilir
else if( x < 64)
output_b(ascii1[x-32][col_index]);//İçinde ise
// s1[]'in ascii2[] dizisinde olup olmadığı kontrol edilir
else if( x < 96 )
output_b(ascii2[x-64][col_index]);
// s1[]'in ascii3[] dizisinde olup olmadığı kontrol edilir
else if( x < 128)
output_b(ascii3[x-96][col_index]);
//Ekranda gösterme işlemi tamamlanır
// Karakterin sonraki sütununa geçlir.
col_index++;
}
// Ekranda gösterme zamanıdır.
// Kısa tutulursa parlaklı azalır hızlı kaydırır
// Uzun tutulursa yazı bulanık akar
delay_us(250);
} // for döngüsü sonu
// for döngüsünün kaç kere tekrarlanacağı bir kez azaltılır
delaycount--;
}
//Başlangıç notası bir sütun kaydırılır
startposition++;
} while(1); // do-while döngüsü sonu
}// Program sonu



musa Eyl 6, 2008
kod hata veriyor
admin Eyl 7, 2008
program içinde yer alan tek tırnak ve çift tırnakları programın editöründe tekrar yaznınız hata kodlama farkından kaynaklanmakta
espirik Eki 9, 2008
arkadaşlar karakter tablosundan sonra gelen ilk for döngüsünde şunu ekleyerek deneyin.
for(i=0; i<s1_char_size; i++)
ben yaptım devre çalışıyor. sadece porttan bilgi gönderemedim henüz ona da uğraşıyorum.
espirik Eki 9, 2008
aynı durum bir yerde daha var arkadaşlar.
for (i=0; i
şeklinde bi satır. bunu da
for (i=0; i<s1_char_size; i++)
şeklinde tamamlamanız lazım. kolay gelsin
admin Eki 12, 2008
Arkadaşların da farkettiği üzere programda bazı satırlar çıkmamış
Bunun nedeni kodların okunabilirliÄŸini artırmak için kullanılan “google pretty print” plug inidir. ÖBu plug in kodda kullanılan bazı iÅŸaret ve sembolleri php diliyle karıştırarak göstermemekte veya baÅŸka fonksiyonlar atamaktadır. Dikkatinize..
Ganesh Eki 19, 2008
i getting all the LEDs are glowing ,please help me what is the error.
Ganesh Eki 20, 2008
Where i have to adjust the speed of Scrolling