Matris kayan yazı uygulaması

Başlatan _MeRKeZ_, 08 Kasım 2012, 11:59:24

_MeRKeZ_

Merhaba arkadaşlar,

Bir süredir 74hc595 ile kayan yazı devresi üzerinde uğraşıyorum. Net üzerinde çok araştırma yaptım. Az da olsa mesafe katettim. Devremde 8 adet 5x7'lik matris gösterge var. Yazı kaydırma işlemini yapabiliyorum fakat 8 adet matrisi de kullandığımda dalgalanma oluyor. Dalgalanmanın nedenini biliyorum ama sorunu çözemiyorum. Kod öbeğini nette verilmiş bir uygulamanın yardımıyla oluşturdum.

Benim sizden isteğim, bu kodu düzeltmeniz değil, ccs c dilinde yazılmış, çalışan çok basit bir uygulama. Böylece, ben buna göre kendi uygulamamı şekillendirebilirim.

Teşekkür ederim.

Not: İncelemek isteyen olursa diye uygulama dosyalarımı ekledim.

https://hotfile.com/dl/178835491/b819bc7/matris_74hc595_proje.rar.html

xoom

#1


Basit Değil ama sana merak ettiğin herşeyi öğretebilir diye düşünüyorum.. anlamadıgın yer olursa yardımcı olmaya çalışırım..

/**********************************************/

#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] = "****** Kayan Yazı Uygulaması******* ";

//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

Devamı: http://ccspic.com/projeler/ccs-c-ile-kayan-yazi.html#ixzz2BeGBiYpF
Under Creative Commons License: Attribution

_MeRKeZ_

Hocam cevabın için teşekkür ederim. Kodları inceledim ama açıkçası kendi uygulamama uyarlayacak kadar anlayamadım. Eğer mümkün olursa, daha basit bir kod öbeği yazarsan/yollarsan sevinirim

xoom

#3
Anlamadığın yerleri sorsaydın daha iyi olurdu ama yinede daha basit bir kod paylaşayım..
1. Sabit Yazı Uygulaması..
#include <116f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#use fast_io(b)      //port yönlendirme komutları B portu için geçerli
#use fast_io(c)       //port yönlendirme komutları C portu için geçerli

//******matriste gösterilecek karakter bilgileri*****

int A[]={0x03,0x75,0x76,0x75,0x03};
int B[]={0x00,0x36,0x36,0x36,0x49};
int C[]={0x41,0x3E,0x3E,0x3E,0x5D};
int D[]={0x00,0x3E,0x3E,0x3E,0x41};
int E[]={0x00,0xB6,0xB6,0xB6,0xBE};
int arti[]={0x77,0x77,0x41,0x77,0x77};
int cift_ok[]={0x6B,0x5D,0x00,0x5D,0x6B};

//sütun seçme fonksiyonları

      int sutunsec (char s)
    {
            switch (s)
         {
           case 0: return(0x10);break;   //1. sütun aktif ,diğerleri pasif
           case 1: return(0x08);break;   //2.
           case 2: return(0x04);break;   //3. 
           case 3: return(0x02;break;     //4.
           case 4: return(0x01);break;   //5.
        }
     }

// matrise veri gönderme fonksiyonu
void matris_karakter_gonder(char k[], int tekrar)
{
   int i,j;   //değişkenler tanımlanıyor
  for(i=0;i<tekrar;i++)   //karakterin matris led de görülmesi için tekrar döngüsü
   {
      for(j=0;j<5;i++)         //tarama işlemi gerçekleştiriliyor
      {
      output_c(sutunsec(j));    //sütun seç ve c portuna sütun değerini gönder
      output_b(k[j]);   //gösterilecek harfin satır bilgisini B portuna gönder
      delay_ms(10);
       }
    }
}

// ***********Ana program fonksiyonu*************

void main()
{
   setup_psp(psp_disabled);
   setup_timer_1(t1_disabled,0,1);
   setup_adc_ports(no_analogs);
   setup_adc(adc_off);
   setup_CCP1(ccp_off);
   setup_CCP2(ccp_off);

set_tris_b(0x00);
set_tris_c(0x00);

  while(1)
  {
   matris_karakter_gonder(A,25);
   matris_karakter_gonder(B,25);
   matris_karakter_gonder(C,25);
   matris_karakter_gonder(D,25);
   matris_karakter_gonder(E,25);
   matris_karakter_gonder(arti,25);
   matris_karakter_gonder(cift_ok,25);
  }
}


2. Kayan Yazı Uygulaması..

#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection

#use delay(clock=4000000)


int b,i,a; //döngüler için gerekli değişkenler
signed kayma;
int yazi_sutun;//yazının sütün sayısı
int matris_sutun; //matris sutun

char metin[]={
0×81, 0×42, 0×24, 0×18, 0×81, 0×42, 0×24, 0×18, // sola çift ok
0×00,
0×03, 0×07, 0×0E, 0xFC, 0xFC, 0×0E, 0×07, 0×03, //y
0×00,
0xFC, 0xFE, 0×13, 0×11, 0×11, 0×13, 0xFE, 0xFC, //a
0×00,
0×83, 0xC3, 0xE3, 0xF3, 0xDB, 0xCF, 0xC7, 0xC3, //z
0×00,
0xFF, 0xFF, 0×18, 0×3C, 0×66, 0xC3, 0×83, 0×00, //k
0×00,
0×00, 0×00, 0×88, 0xFB, 0xFB, 0×88, 0×00, 0×00, //i
0×00,
0×18, 0×24, 0×42, 0×81, 0×18, 0×24, 0×42, 0×81, // sağa çift ok
};

char kayan8; //kayan adında 16 elemanlı sahte dizi oluşturuldu.


void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

yazi_sutun=62;//yazinin toplam sutun sayısı belirleniyor
//yazi1_sutun=64; //diğer yazının sutun sayısı belirleniyor
matris_sutun=8;//kullanılan matrisin sutun sayısı


for(;;)// sonsuz döngü oluşturluyor
{

    for(kayma=-8;kayma<yazi_sutun;kayma++) // sütün sayısı kadar kayma işlemi gerçekleştiriliyor.
  {
      for(b=0;b<matris_sutun;b++)  //kayan adlı dizinin elemanlarını döngü  //sayesinde buluyoruz.
    {     
       kayan[b]=metin[kayma+b]; // kaydırma işlemi hesaplanıyor
          if(kayma+b<0)  // şartlar
           kayan[b]=0;
            if(kayma+b>yazi_sutun)
             kayan[b]=0;
    }

      for(a=0;a<30;a++) //tarama sayısı
    {
        for(i=0;i<matris_sutun;i++) //bulunan değerler teker teker portlara gönderiliyor.
     { 
         output_a(i);
         output_b(kayan[i]);
         delay_us(6000); //kayma hızı
         
  }   //kaydırma işlemi sonu
   }  // portlara gönderme sonu
    } //tarama sayısı sonu
}     //sonsuz döngü sonu
}      // ana program sonu


Not: Daha basiti olmaz yinede anlamazsan anlamadığın kısımı sorarsan yardımcı olmaya çalışırım..

_MeRKeZ_

#4
Hocam, cevabın için teşekkür ederim. Mantığını anladığımı düşünüyorum. Yalnız bir şey daha isteyeceğim. Ben uygulamamda 74hc595'i kullanırken 8 matrise de aynı anda bir şey yazdığımda dalgalanma oluyor. O yüzden aynı port çoğullama mantığıyla sanırım yazım kaysa da dalgalanma devam edecek. Eğer mümkünse, 74hc595'in matris kayan yazı devresinde kullanabileceğim, mantığını anlayabileceğim bir port çoğullama kod öbeği yollarsan çok sevinirim hocam. Teşekkür ederim.

Not: Ben uygulamamda daha önce yazılmış bir fonksiyonu kendi çalışmama uyarlanmış halini kullanıyorum ama o işlevin (fonksiyonun) tam mantığını anlamadığım için üzerinde değişiklik yapamıyorum. Örneğin, o işlevde sadece 1 tane74hc595 kullanılmış. Ben 8 tane kullandım ama bu işlev benim için uygulamama uygun olmadığı için iyi bir sonuç alamadım

brkatr

xoom  merhaba paylasımların ıcın oncelıkle tesekkurller bende kayan yazı ustunde bıraz bırseyler ogrenmeye calısyorum   rs232  kısmı benı bıraz kasıyor sımdı bu gırdıgın karakter kodlarını tam anlayamadım  ,  bılgısayardan gırılen metının karakterleını mı tanımladın oraya  oyle ıse needen bole bırsey yapıyoruz dırek rs232 le bagladıgımız zaman  ornegın hyperterminal tarzı bır program bunu hex koduna cevırmıyor mu  bılgılendırırsen benı bu konuda sevınırım  sımdıden tesekkurler.

Powered by EzPortal