CCC C ile Elektronik Kayan Yazı

CCS C ile yapıp çalıştırılan bu kayan yazı devresini verilen kodları inceleyerek kendinize uyarlayabilirsiniz.

Yapılan devre yukarıdaki şemayla neredeyse aynı olup shift register olarak tpic6b595 kullanıldı ama 74595 ile de devre çalışacaktır.
Devreye ilk enerji verildiğinde içersine 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.

/**********************************************/
/*          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
Bu yazı CCS C Örnekleri kategorisine gönderilmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.