Gönderen Konu: Yeni P10 Panel Kütüphanesi  (Okunma sayısı 1719 defa)

Çevrimdışı Mucit23

  • Profesyonel Üye
  • *****
  • İleti: 5788
    • www.arectron.com/
Yeni P10 Panel Kütüphanesi
« : 15 Haziran 2017, 05:58:20 »
    Selamlar

    Daha Önce P10 Panel kullanımına dair bir kütüphane paylaşmıştım. Aradan 4 sene geçmiş o kütüphaneyi kullanarak birçok alanda çözümler getirmiştim.
    O zamanlar bir proje gereği hızlıca çözüm gerektiren bir durum olduğu için 2-3 hafta içerisinde panellerin kullanılmasını öğrenip basitçe bir kütüphane yazmaya çalışmıştım. Biraz aceleye geldiği için kütüphane baya eksik kalmıştı aslında.

    Geçen sene bu iş için tekrardan PC başına geçtim kütüphaneyi baştan sona revize ettim diyebilirim.
    Eski kütüphanede en çok
"birden fazla panel eklenmesi durumunda ne tür değişiklikler yapılması gerekiyor?" Sorusunu alınca bu işi kolaylaştırmaya çalıştım. Aslında çözümler çok basitti ama gerekli değişiklikleri yapmak için sisteme biraz hakim olmak gerekiyor. Şuan bu sorunları çözdüm sayılır.

Yapılan değişiklikler şu şekilde;
  • Birden fazla panel eklenmesi için kütüphanede gerekli değişiklikler yapıldı. Basit Tanımlamalarla bu sorun çözülmüş oldu. Bu tanımlamalarla Pixel basma gibi fonksiyonlar otomatikmen kendini ayarlar. Derleme aşamasında bu işlem gerçekleşir.
  • Font dosyaları değiştirildi. Eskiden font dosyalarınıda MikroE Font creator yazılımı ile yapmıştım ama çözünürlük düşük olduğu için bütün font dosyalarını düzenlemem gerekiyordu. Şimdilik ST'nin kendi örnek uygulamalarında kullandığı font dosyalarını kullandım bende. 8x8, 11x12 ve 14x16 şeklinde 3 Adet font dosyası ekledim. Temel işlemler için yeterli olduğu için fazla font dosyası ekleme gereği duymadım. Sonuçta bunlar hep program hafızasından yiyor
  • Text Basma ve Text kaydırma fonksiyonlarını güncelledim. Önceden Pointer CCS'de pointer kullanımını pek çözemediğim için pointerlardan uzak durmuştum. Şimdi o konuları hallettim.

Kütüphanenin Derlenmesi için yapılması gerekenler :


   
  • Kütüphaneye ait P10_Panel_Driver.c Dosyasını projenize ekleyin.
  • Bundan sonra ilk olarak 1 ms Aralıklarla kesme oluşması gerekiyor. Kesme içerisinde Satır tarama işlemlerinin yapılması gerekiyor. Ben CCS için Örnek kesme alt programını vereceğim. Bu kısım aslında eski kütüphane ile aynı.

[/list]
Kod: [Seç]
#int_timer1                      //Timer0 Kesmesi
void Timer1_int(){   
   static int8 int_syc;


   set_timer1(49543);           //1mS Gecikme için Timer kuruluyor..
   switch (int_syc)                 //Her 1mS de Bir bir sonraki satıra Geç
   {
   case 0:
        output_low(PinOE);write_data(int_syc);
        output_low(PinA);output_low(PinB);output_high(PinOE);
        break;
   case 1:
        output_low(PinOE);write_data(int_syc);
        output_high(PinA);output_low(PinB);output_high(PinOE);
        break;
   case 2:
        output_low(PinOE);write_data(int_syc);
        output_low(PinA);output_high(PinB);output_high(PinOE);
        break;
   case 3:
        output_low(PinOE);write_data(int_syc);
        output_high(PinA);output_high(PinB);output_high(PinOE);
        break;
   }   
   int_syc++;if(int_syc>3)int_syc=0;
}

  • Diğer Derleyiciler için bu fonksiyonun düzenlenmesi gerekmektedir. CCS C derleyicisine özgü fonksiyonlar kullanılıyor. 

    P10_Panel_Driver.h Dosyasında panel sayınızı belirtmeniz gerekiyor. Bunun için bazı tanımlamalar ekledim.

    #define P10_Column_Num 2
    #define P10_Line_Num 1

    P10_Line Num parametresi alt alta kaç adet panel var onu belirtmek için kullanılıyor. Alt alta panel eklemek için donanımda biraz değişiklik yapmak gerektiği için şimdilik alt alta panel desteği yok diyelim. Bu yüzden bu parametre sabit olarak 1 olmalı.

    P10_Column_Num parametresi ile P10 Panellerden yan yana kaç adet bağlı olduğunu belirtmeniz gerekiyor 2 adet bağlı ise 2, 5 adet bağlı ise 5 girmeniz gerekiyor.
    ***Panel sayısı ile doğru orantılı olarak RAM kullanım oranı artıyor. Her bir panel için 64Byte alan gerekiyor. Kullanılacak olan panel sayısı ram miktarınız ile orantılıdır. 
  • Parlaklık ayarı için PWM ayarlarını yapmanız gerekiyor. Bunu daha önceki yazımda nasıl yaptığımı anlatmıştım. Eğer PWM kullanmak istemiyorsanız OE pinini doğrudan panele bağlamanız gerekmektedir. Bu şekilde Panel MAX parlaklıkta çalışacaktır. Ama max parlaklıkta tüm ledler yanınca panel 5A'e yakın bir akım tüketmekte. Buda LED lerin Shift Register'ların ve Mosfetlerin aşırı ısınmasına neden oluyor. Bu yüzden paneli genel olarak dimlemek gerekiyor.

Bunun için 7408 gibi bir VE kapısı kullanarak OE sinyali ile PWM sinyalini Modüle edip Panele uygulamıştım.
             _____
PWM__|           \
  OE___| AND    }---- Disp_Enable (OE)
            |_____ /     

Bunun için Panele en az 10KHZ pwm uygulamanız gerekecektir. Düşük frekanslarda panelde kırpışmalar olabilir. PWM ile ilgili ayarlamalarıda kullanıcıya bırakıyorum çünkü donanıma göre çalışma frekansına göre bu ayarlar değişiyor.

Bununla birlikte P10_Panel_Driver.c dosyasındaki P10_Set_Brightness fonksiyonu düzenlenmesi gerekmektedir.
Kod: [Seç]
void P10_Set_Brightness(int8 value){
   set_pwm1_duty((int16)value*4);
}

Ayarlar Bu şekilde Projenizi hatasız bir şekilde derleyebiliyorsanız problem yoktur

Font kullanımını biraz değiştirdim.

Font dosyaları almış olduğum LCD kutüphanesinde struct olarak tanımlanmıştı.

Her font dosyası için font dosyalarının içinde aşağıdaki gibi structlar tanımlı

Kod: [Seç]
sFONT Font14x16 = {
    Font14_Table,
  14, /* Width */
  16, /* Height */
};

Aynı şekilde sFONT türünde P10_Currentfonts değişkeni tanımlı

Program işleyişi sırasında font seçimi yapmak için P10_Currentfonts=Font8x8; şeklinde bir seçim yapmak yeterli oluyor. Yada P10_Currentfonts=Font14x16;

Bu yapı çok hoşuma gittiği için aynısını doğrudan kullandım.

Text Basma işlemi

Text basma işlemi için P10_DisplayShowString fonksiyonunu kullanıyoruz.

void P10_DisplayShowString(unsigned int8  Xpos, unsigned int8  Ypos, char* textptr, unsigned int8  color)

Örnek kullanımı da aşağıdaki gibi;

Kod: [Seç]
P10_Currentfonts=Font14x16;
P10_DisplayShowString(0,0,"P10 Test",0);

Son parametre yazının normal mi yoksa invert olarak mı basılacağını belirtir
Eğer 0 verilirse Yazı normal basılır, 1 verilirse yazı invert olarak basılır.

Text Kaydırma işlemi

Text kaydırma işlemi içinde aşağıdaki fonksiyonu kullanıyoruz.

void P10_DisplayScrollString(unsigned int8  clstart, unsigned int8  clend, unsigned int8  ypos, unsigned int8  speed, char* textptr, unsigned int8  color)

Kaydırma yaparken X ekseninde istediğimiz aralıkta kaydırma yapamıyoruz. clstart ve clend parametreleri hangi aralıkta kaydırma yapılacağını belirliyor.
Bunu bir örnek ile açıklayayım.
Kaydırma işlemini 8 pixel aralıklarla yapabiliyoruz.

Diyelimki 16x64 boyutlarında iki adet P10'dan oluşan bir ekranınız olsun. X ekseni 64 pixelden oluştuğu için bunu 8 eşit parçaya bölebiliriz. Bu sayıya CLN diyelim

Bu durumda clstart kaydırmanın kaydırılacak olan yazının sol kenarı olurken clend sağ kenarını temsil etmektedir.
eğer ekranın tümünde kaydırma yapacaksanız örnek olarak verecek olursam eğer,
clstart = 0 , clend = 7 olmalıdır. clend max CLN-1 değerini alabilir.

Ypos parametresi Y ekseininde yazının nereden başlayacağını belirtliyor.
speed parametresi yazının kaydırılma hızını belirler. 1 ile 10 arası bir değer verebilirsiniz. 10 Değeri max hız dır.
*** Yazı kaydırma fonksiyonunda bazı gecikme fonksiyonları kullanılıyor. Bu yüzden Kullanılacak olan platforma göre bu fonksiyon içerisindeki delay fonksiyonlarıda düzenlenmesi gerekmektedir.

Son olarak örnek kullanım aşağıdaki gibi

Kod: [Seç]
P10_Currentfonts=Font14x16;
P10_DisplayScrollString(0,7,0,8,"P10 Test String!!!",0);

Diğer Fonksiyonlar hemen hemen aynı. İsim değişikliği dışında pek bir fark yok. Problem yaşayanlar olursa yine bu başlık altında yazabilir.
P10_Panel_Driver.c
Kod: [Seç]
/******************************************************************************
*  @file    P10_Panel_Driver.c
*  @author  Ferhat YOL
*  @version V1.3
*  @date    23-Kasım-2016
*  @brief   P10 LED Panel Kütüphanesi www.arectron.com
******************************************************************************/     
#include <P10_Panel_Driver.h>
#include "Font8x8.c"
#include "Font11x12.c"
#include "Font14x16.c"

sFONT P10_Currentfonts;

unsigned int8 display_ram[P10_Adress_Count][4];

void write_data(unsigned int8  row_adr)
{
   unsigned int8  i=0,j=0;
   unsigned int8  k=P10_Line_SR_Number-1;
   while(k!=255)                                   // Bu Döngü ileriye doğru sayarsa panel sağdan
   {j=(16*P10_Column_Num-1)-k;                     // Sola Doğru yüklenir.
     for (i=0;i<4;i++)                             // Satırlar dolduruluyor..
     {
         spi_write(display_ram[j][row_adr]);
         j-=P10_Line_SR_Number;
     }
     k--;
   }
   output_high(LATCH);
   delay_cycles(2);
   output_low(LATCH);
}

/*******************************************************************************
*   Parlaklık Ayar Fonksiyonu                                                  *
*   Parameter:    value (0-100)                                                *
*   Return:                                                                    *
*******************************************************************************/
void P10_Set_Brightness(int8 value){
   set_pwm1_duty((int16)value*4);
}

/*******************************************************************************
*   P10_Clear_Display                                                          *
*   Parametreler: fill                                                         *
*   Return:                                                                    *
*******************************************************************************/
void P10_Clear_Display(unsigned int1  fill){
unsigned int8  i=0,j=0,fdata=0;
   
  if (fill)fdata=0x00; else fdata=0xFF;

  for (i=0;i<4;i++)
  {
    for (j=0;j<P10_Adress_Count;j++)
    {
      display_ram[j][i]=fdata;
    }
  }
}

/*******************************************************************************
*   P10_PutPixel                                                               *
*   Parametreler  Xpos, Ypos, fill                                             *
*   Return:                                                                    *
*******************************************************************************/
void P10_PutPixel(unsigned int8  Xpos,unsigned int8  Ypos, unsigned int8  color)
{
  unsigned int8  y1=0,x1=0;
  unsigned int8  y2=0,x2=0;
  unsigned int8  temp=0;

  y1 = Ypos%4;
  y2 = Ypos/4;
  x1 = Xpos%8;   
  x2 = Xpos/8;
 
  if(color)  //Nokta Koy
  {
    temp=display_ram[(y2*P10_Line_SR_Number)+x2][y1]; //Ram'deki değer ön belleğe alınıyor.
    display_ram[(y2*P10_Line_SR_Number)+x2][y1] = (temp & (255-(128>>x1))); //x'inci bit 0 yapılır
  }
  else     //Noktayı Sil
  {
    temp=display_ram[(y2*P10_Line_SR_Number)+x2][y1]; //Ram'deki değer ön belleğe alınıyor.
    display_ram[(y2*P10_Line_SR_Number)+x2][y1] = (temp | (128>>x1)); //x'inci Bit 1 yapılır   
  }
}

/*******************************************************************************
*   P10_GetPixel                                                               *
*   Parameter:    Xpos, Ypos                                                   *
*   Return: Pixel value                                                        *
*******************************************************************************/
unsigned int8  P10_GetPixel(unsigned int8  Xpos,unsigned int8  Ypos)
{
  unsigned int8  y1=0,x1=0;
  unsigned int8  y2=0,x2=0;
  unsigned int8  temp=0;
  unsigned int8  value=0;
 
  y1 = Ypos%4;
  y2 = Ypos/4;
  x1 = Xpos%8;   
  x2 = Xpos/8;
 
  temp=display_ram[(y2*P10_Line_SR_Number)+x2][y1]; //Ram'deki değer ön belleğe alınıyor.
  value=1-(0x80 & temp<<x1)/128;   //Ram adresindeki bit geri gönderiliyor
  return value;
}
/*******************************************************************************
*   Satır Kaydırma Fonksiyonu                                                  *
*   Parameter:    Line, clstart, clend, ZeroBit                                *
*   Return:    OverFlow                                                        *
*******************************************************************************/
unsigned int8  LineScroll(unsigned int8  Line, unsigned int8  clstart, unsigned int8  clend, unsigned int8  ZeroBit)
{
  unsigned int8  i=0;
  unsigned int8  y1=Line%4; 
  unsigned int8  y2=(Line/4)*P10_Line_SR_Number;
  unsigned int8  OverFlow, Carry;
 
  ZeroBit=1-ZeroBit;

  OverFlow=(display_ram[y2+clstart][y1]/128)&0x01;
 
   for(i=clstart;i<clend+1;i++)
   {
       if(i<7)
       {
         Carry=(display_ram[y2+(i+1)][y1]/128)&0x01;                      //Bir Sonraki Byte'in Tasan Bitini Carry'e yerlestir.
         display_ram[y2+i][y1] = display_ram[y2+i][y1]<<1;                //1 Bit Sola kaydir
         display_ram[y2+i][y1]=(unsigned int8)display_ram[y2+i][y1] | Carry;      //Carry'yi Bir Önceki Byte'in 0. bitine yerlestir Yerlestir
       }
       else
       {
          display_ram[y2+i][y1] = display_ram[y2+i][y1]<<1;               //1 Bit Sola kaydir
       }
    }
 
   if(ZeroBit){                                                           //Sag Taraftan Fonksiyona gönderilen bit ekleniyor..
    display_ram[((y2)+clend)][y1]=(int8)display_ram[((y2)+clend)][y1] | 0x01;
  }else{
    display_ram[((y2)+clend)][y1]=(int8)display_ram[((y2)+clend)][y1] & 0xFE;
  }
  return OverFlow; 
}

/*******************************************************************************
*   P10_DisplayScrollString                                                 *
*   Parametreler:    clstart, clend, ypos, speed, *textptr, color              *
*   Return:                                                                    *
*******************************************************************************/
void P10_DisplayScrollString(unsigned int8  clstart, unsigned int8  clend, unsigned int8  ypos, unsigned int8  speed, char* textptr, unsigned int8  color)
{
  unsigned int8  row=0,clm=0;
  unsigned int16  xbit;
  rom unsigned int8  *saddress;
  unsigned int8  cbit;
  unsigned int8  delay=110-(speed*10);
  unsigned int8  add;
 
  if(P10_Currentfonts.Width>0x08)
  add=0x02;
  else
  add=0x01;
 
  while (*textptr != 0)
  {
    saddress =(unsigned int8  *) &P10_Currentfonts.table[(unsigned int16 )(*textptr-32) * P10_Currentfonts.Height * add]; 
   
    for(clm=1;clm<=P10_Currentfonts.Width;clm++)
     {
       for(row=0;row<P10_Currentfonts.Height;row++)
       { 
          if(P10_Currentfonts.Width>0x08)
          {
           xbit=((unsigned int16)saddress[row*2]<<8) | (saddress[row*2+1]);
           cbit=(xbit>>(16-clm)) & 0x01;
          }
          else
          {
            xbit=saddress[row];
            cbit=(xbit>>(8-clm)) & 0x01;
          }   
          if(color) cbit=1-cbit;
          LineScroll(ypos+row,clstart,clend,cbit);
       }
      delay_ms(delay);
     }
     textptr++;
  }
 
}
/*******************************************************************************
*   P10_DisplayShowString                                                      *
*   Parametreler:    Xpos, Ypos, *textptr, color                               *
*   Return:                                                                    *
*******************************************************************************/
void P10_DisplayShowString(unsigned int8  Xpos, unsigned int8  Ypos, char* textptr, unsigned int8  color)
{
  unsigned int8  refcolumn = Xpos;
  unsigned int8  refrow = Ypos;
   
  while (*textptr != '\0')
  {
    P10_DisplayChar(refcolumn, refrow, *textptr, color);
    refcolumn += P10_Currentfonts.Width;
   
    if(refcolumn>P10_Max_Width) refrow += P10_Currentfonts.Height;

    textptr++;
  }
}

/*******************************************************************************
*   P10_DisplayChar                                                            *
*   Parameter:    Xpos, Ypos, *textptr, color                                  *
*   Return:                                                                    *
*******************************************************************************/
void P10_DisplayChar(unsigned int8  Xpos, unsigned int8  Ypos, char ascii, unsigned int8  color)
{
   unsigned int8  add;
   ascii-=32;
   
   //Eğer Font boyutu 8 den büyük ise Adresi 2 ile çarpıyoruz.
   if(P10_Currentfonts.Width>0x08)add=2;else add=1;
   P10_DrawChar(Xpos, Ypos,(unsigned int8 *)&P10_Currentfonts.table[(unsigned int16) ascii * P10_Currentfonts.Height* add], color);
}

/*******************************************************************************
*   P10_DrawChar                                                               *
*   Parameter:    Xpos, Ypos, *saddress, color                                 *
*   Return:                                                                    *
*******************************************************************************/
void P10_DrawChar(unsigned int8  Xpos, unsigned int8  Ypos, rom unsigned int8  *saddress, unsigned int8  color)
{
   unsigned int8  index = 0, i = 0;
   unsigned int16  shift;
   unsigned int16  xbit;
   
   for(index=0;index<P10_Currentfonts.Height;index++)
   { 
         if(P10_Currentfonts.Width>0x08)
         { 
            xbit=((unsigned int16)saddress[index*2]<<8) | (saddress[index*2+1]);
            shift=0x8000;
         }
         else
         {
            xbit=saddress[index];
            shift=0x80;
         }
         
         for(i=0;i<P10_Currentfonts.Width;i++)
         {
           if(((xbit<<i) & shift)==0x00)
           {
              P10_PutPixel(Xpos+i,Ypos+index,color);
           }
           else
           {
              P10_PutPixel(Xpos+i,Ypos+index,1-color);
           }
         }
    }
}

/*******************************************************************************
*   P10_DrawLine                                                               *
*   Parameter:    x1, x2, y1, y2, fill                                         *
*   Return:                                                                    *
*******************************************************************************/
void P10_DrawLine(unsigned int8  x1, unsigned int8  y1, unsigned int8  x2, unsigned int8  y2, unsigned int8  color)
{
  signed int addx=1, addy=1, P;
  signed int i, dy, dx, diff;
 
   if(x2>x1)
   {
      dx = x2 - x1;
   }else{
      dx = x1 - x2;
      addx = -1;
   }
   if(y2>y1)
   {
      dy = y2 - y1;
   }else{
      dy = y1 - y2;
      addy = -1;
   }

   if(dx >= dy)
   {
      dy *= 2;
      P = dy - dx;
      diff = P - dx;

      for(i=0; i<=dx; i++)
      {
         P10_PutPixel(x1, y1, color);

         if(P < 0)
         {
            P  += dy;
            x1 += addx;
         }
         else
         {
            P  += diff;
            x1 += addx;
            y1 += addy;
         }
      }
   }
   else
   {
      dx *= 2;
      P = dx - dy;
      diff = P - dy;

      for(i=0; i<=dy; ++i)
      {
         P10_PutPixel(x1, y1, color);

         if(P < 0)
         {
            P  += dx;
            y1 += addy;
         }
         else
         {
            P  += diff;
            x1 += addx;
            y1 += addy;
         }
      }
   }   
}

/*******************************************************************************
*   P10_DrawRect                                                               *
*   Parameter:    x1, x2, y1, y2, fill                                         *
*   Return:                                                                    *
*******************************************************************************/
void P10_DrawRect(unsigned int8  x1, unsigned int8  y1, unsigned int8  x2, unsigned int8  y2, unsigned int8  fill, unsigned int8  color)
{
   unsigned int16  i, xmin, xmax, ymin, ymax;

  if(fill)
   {
      if(x1 < x2)
      {
         xmin = x1;
         xmax = x2;
      }
      else
      {
         xmin = x2;
         xmax = x1;
      }

      if(y1 < y2)
      {
         ymin = y1;
         ymax = y2;
      }
      else
      {
         ymin = y2;
         ymax = y1;
      }

      for(; xmin <= xmax; ++xmin)
      {
         for(i=ymin; i<=ymax; ++i)
         {
            P10_PutPixel(xmin, i, color);
         }
      }
   }
   else
   {
      P10_DrawLine(x1, y1, x2, y1, color);
      P10_DrawLine(x2, y1, x2, y2, color);
      P10_DrawLine(x2, y2, x1, y2, color);
      P10_DrawLine(x1, y2, x1, y1, color);
   }     
}

/*******************************************************************************
*   P10_DrawCircle                                                             *
*   Parameter:    x, y, Size, fill                                             *
*   Return:                                                                    *
*******************************************************************************/
void P10_DrawCircle(unsigned int8 x, unsigned int8 y, unsigned int8 size, unsigned int8 fill, unsigned int8 color)
{
   signed int a,b,P;
   a=0;
   b=size;
   P=1-size;
   
   do
   {
      if(fill)
      {
         P10_DrawLine(x-a, y+b, x+a, y+b,color);
         P10_DrawLine(x-a, y-b, x+a, y-b,color);
         P10_DrawLine(x-b, y+a, x+b, y+a,color);
         P10_DrawLine(x-b, y-a, x+b, y-a,color);
      }
      else
      {
         P10_PutPixel(a+x, b+y,color);
         P10_PutPixel(b+x, a+y,color);
         P10_PutPixel(x-a, b+y,color);
         P10_PutPixel(x-b, a+y,color);
         P10_PutPixel(b+x, y-a,color);
         P10_PutPixel(a+x, y-b,color);
         P10_PutPixel(x-a, y-b,color);
         P10_PutPixel(x-b, y-a,color);
      }
     
      if(P < 0)
      P+= 3 + 2*a++;
    else
      P+= 5 + 2*(a++ - b--);
     
  }while(a<=b);
}

P10_Panel_Driver.h
Kod: [Seç]
/******************************************************************************
*  @file    P10_Panel_Driver.h
*  @author  Ferhat YOL
*  @version V1.3
*  @date    23-Kasım-2016
*  @brief   P10 LED Panel Kütüphanesi Fonksiyonlar ve Sabitler
******************************************************************************/
#define P10_Column_Num 2
#define P10_Line_Num 1
#define P10_Max_Width 32*P10_Column_Num
#define P10_Max_Height 16*P10_Line_Num
#define P10_Adress_Count 16*P10_Column_Num*P10_Line_Num
#define P10_Line_SR_Number P10_Max_Width/8

#define PinA     pin_c0
#define PinB     pin_c1
#define PinOE    pin_d1                    //OE=0 Display OFF, OE=1 Display ON
#define LATCH    pin_d0                   //
//      PinSCK   pin_c3                    //Spi Clock Hattı
//      PinData  pin_c5                    //Spi Data Hattı
//      PWM_Pin  pin_c2                    //


//       _____
// PWM__|     \
// OE___| AND  }---- Disp_Enable
//      |_____/     
//
//  P10 Led Board
//      1     2
// OE  --|oo|-- A
// GND --|oo|-- B
// GND --|oo|--
// GND --|oo|-- SCK
// GND --|oo|-- LATCH
// GND --|oo|-- DATA
// GND --|oo|--
// GND --|oo|--
//     15    16

typedef struct _tFont
{   
  rom unsigned int8 *table;
  unsigned int8 Width;
  unsigned int8 Height;
 
} sFONT;

extern sFONT P10_Currentfonts;
extern sFONT Font8x8;
extern sFONT Font11x12;
extern sFONT Font14x16;

extern unsigned int8  display_ram[P10_Adress_Count][4];

void write_data(unsigned int8 row_adr);
void P10_Set_Brightness(int8 value);
void P10_Clear_Display(unsigned int1 fill);
void P10_PutPixel(unsigned int8 Xpos,unsigned int8 Ypos, unsigned int8 color);
unsigned int8  P10_GetPixel(unsigned int8 Xpos,unsigned int8 Ypos);
unsigned int8  LineScroll(unsigned int8 Line, unsigned int8 clstart, unsigned int8 clend, unsigned int8 ZeroBit);
void P10_DisplayScrollString(unsigned int8 clstart, unsigned int8 clend, unsigned int8  ypos, unsigned int8 speed, char* textptr, unsigned int8 color);
void P10_DisplayShowString(unsigned int8 Xpos, unsigned int8 Ypos, char* textptr, unsigned int8 color);
void P10_DisplayChar(unsigned int8 Xpos, unsigned int8 Ypos, char ascii, unsigned int8 color);
void P10_DisplayChar(unsigned int8 Xpos, unsigned int8 Ypos, char ascii, unsigned int8 color);
void P10_DrawChar(unsigned int8  Xpos, unsigned int8  Ypos, rom unsigned int8  *saddress, unsigned int8  color);
void P10_DrawLine(unsigned int8 x1, unsigned int8 y1, unsigned int8 x2, unsigned int8 y2, unsigned int8 color);
void P10_DrawRect(unsigned int8 x1, unsigned int8 y1, unsigned int8 x2, unsigned int8 y2, unsigned int8 fill, unsigned int8 color);
void P10_DrawCircle(unsigned int8 x, unsigned int8 y, unsigned int8 size, unsigned int8 fill, unsigned int8 color);

Kütüphane dosyalarını aşağıdaki linkten indirebilirsiniz.

https://yadi.sk/d/AMf5eJK23K7fSM
« Son Düzenleme: 15 Haziran 2017, 06:00:32 Gönderen: Mucit23 »

Çevrimdışı Murat Mert

  • Profesyonel Üye
  • *****
  • İleti: 1115
  • ANTALYA
Ynt: Yeni P10 Panel Kütüphanesi
« Yanıtla #1 : 15 Haziran 2017, 12:50:29 »

S.A. Paylaşım için Sağol Ferhat.....  ;)
mert07

Çevrimdışı WrtM

  • Kıdemli
  • ****
  • İleti: 217
Ynt: Yeni P10 Panel Kütüphanesi
« Yanıtla #2 : 15 Haziran 2017, 13:50:51 »
Teşekkürler , çok faydalı hocam.

Çevrimdışı gokhangokcen

  • Kıdemli
  • ****
  • İleti: 333
    • Denay Bilişim Teknolojileri-LED aydınlatma sistemleri
Ynt: Yeni P10 Panel Kütüphanesi
« Yanıtla #3 : 15 Temmuz 2017, 12:33:30 »
hocam Font11x12.c dosyasında bir gariplik var derleme yapmıyor. hata veriyor. Text için pointerla alakalı bir hata veriyor. kodu derlemişinizdir mutlaka. acaba nerede hata yapıyorum?


ayrıca //extern unsigned int8  display_ram[P10_Adress_Count][4]; satır hem p10 library.h hemde p10library.c de kullanılmış o yüzdende bir hata veriyordu. gerekli düzeltmeleri yaptıktan sonra pointerla alakalı sıkıntı kaldı. Pointerlar ile çok aram iyi değil. Nasıl bir çözüme gidebilirim?


Kod: [Seç]
#include <18F4620.h>


#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES H4                       //High speed osc with HW enabled 4X PLL
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PROTECT






#include "P10_Panel_Driver.c"




//--------------------------40 pin MCU PIN_diagram
//                        _____________
//MCLR/VPP----------------|1         40|-------RB7/PGD
//RA0/AN0-----------------|2         39|-------RB6/PGC
//RA1/AN1-----------------|3         38|-------RB5
//RA2/AN2/VREF-/CVREF-----|4         37|-------RB4
//RA3/AN3/VREF+-----------|5         36|-------RB3/PGM
//RA4/T0CKI/C1OUT---------|6         35|-------RB2
//RA5/AN4/SS/C2OUT--------|7         34|-------RB1
//RE0/RD/AN5--------------|8         33|-------RB0/INT
//RE1/WR/AN6--------------|9         32|-------VDD
//RE2/CS/AN7--------------|10        31|-------VSS
//VDD---------------------|11        30|-------RD7/PSP7
//VSS---------------------|12        29|-------RD6/PSP6
//OSC1/CLKI---------------|13        28|-------RD5/PSP5
//OSC2/CLKO---------------|14        27|-------RD4/PSP4
//RC0/T1OSO/T1CKI---------|15        26|-------RC7/RX/DT
//RC1/T1OSI/CCP2----------|16        25|-------RC6/TX/CK
//RC2/CCP1----------------|17        24|-------RC5/SDO
//RC3/SCK/SCL-------------|18        23|-------RC4/SDI/SDA
//RD0/PSP0----------------|19        22|-------RD3/PSP3
//RD1/PSP1----------------|20        21|-------RD2/PSP2
//                        |____________|


#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)


#int_timer1                      //Timer0 Kesmesi
void Timer1_int(){   
   static int8 int_syc;




   set_timer1(49543);           //1mS Gecikme için Timer kuruluyor..
   switch (int_syc)                 //Her 1mS de Bir bir sonraki satıra Geç
   {
   case 0:
        output_low(PinOE);write_data(int_syc);
        output_low(PinA);output_low(PinB);output_high(PinOE);
        break;
   case 1:
        output_low(PinOE);write_data(int_syc);
        output_high(PinA);output_low(PinB);output_high(PinOE);
        break;
   case 2:
        output_low(PinOE);write_data(int_syc);
        output_low(PinA);output_high(PinB);output_high(PinOE);
        break;
   case 3:
        output_low(PinOE);write_data(int_syc);
        output_high(PinA);output_high(PinB);output_high(PinOE);
        break;
   }   
   int_syc++;if(int_syc>3)int_syc=0;
}




void main()
{
   set_tris_a(0x00);
   set_tris_b(0x00);
   set_tris_c(0x00);
   set_tris_d(0x00);
   set_tris_e(0x00);
   
   setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_SS_DISABLED);
   setup_adc(ADC_OFF);
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_OFF);
   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_8|T1_CLK_OUT);
   setup_timer_2(T2_DIV_BY_4,249,1);
   enable_interrupts(INT_timer1);
   enable_interrupts(GLOBAL);


   
   output_a(0x00);
   output_b(0x00);
   output_c(0x00);
   output_d(0x00);
   output_e(0x00);
   for(;
      {
      P10_Currentfonts=Font14x16;
P10_DisplayScrollString(0,7,0,8,"P10 Test String!!!",0);
      }


}

verdiği hata : *** Error 90 "main.c" Line 101(36,37): Attempt to create a pointer to a constant

bu arada emekleriniz ve paylaşımlarınız için teşekkür ederim. Ben eski kütüphane ile bir program ayarlamıştım.Eski kütüphanedeki tek sorunum yazı kaydırma fonksiyonu ile alakalı. diğer kısımları düzenledim. Fonksiyonları  ve tanımlamaları parça parça ekledim.
Kod: [Seç]
   
#define Font1H   8
#define Font2H   12
#define Font3H   14
#define Font4H   16
#define Panel     3                        //P10 Panel Sayısı
#define RIGHT     0                        //
#define LEFT      3                        //
#define WIDTH     95
#define HEIGHT    15

unsigned int8 display_ram[48][4];          //Bu Bölge Display Ram Alanını belirtir
 
Text="GOKHAN GOKCEN";
TextToLeftScroll(0,2,7,0);

//sırasıyla bu fonksiyonlara giriyor ve içerikleri şöyle;
void TextToLeftScroll(unsigned int Line, unsigned int Size, unsigned int Speed,int1 fill)
   switch (size)
   {
     case 1:  ScrollTextFont1(Line,Speed,fill);Break;
     case 2:  ScrollTextFont2(Line,Speed,fill);Break;
     case 3:  ScrollTextFont3(Line,Speed,fill);Break;
     case 4:  ScrollTextFont4(Line,Speed,fill);Break;
     default: Break;
   }
}
void ScrollTextFont2(unsigned int Line, unsigned int Speed,int1 fill)
  unsigned int a=0,b=0,i=0,m=0;
  unsigned int cdata=0;
  unsigned int16 delay=speed*20;
  unsigned int16 sayac=0;
  int1 ZeroBit=0;
 
  while(Text[i]!='\0')
  {
    if(Line+Font2H-1>HEIGHT)Break;
    for(b=0;b<16;b=b+2)
    {
       cdata=Font_8x12[Text[i]-32][b];
       for(a=8;a<24;a++)
       {
         if(a==12)a=20;
         ZeroBit=fill-(cdata>>a) & 0x01;
         LineScroll(Line+a,ZeroBit);
       }
       cdata=Font_8x12[Text[i]-32][b+1];
       for(a=0;a<4;a++)
       {
         ZeroBit=fill-(cdata>>a) & 0x01;
         LineScroll(Line+32+a,ZeroBit);
       }
       for(sayac=0;sayac<210-delay;sayac++)
       {
         delay_ms(1);
       }
    }
    i++;
  }
}

 int1 LineScroll(unsigned int Line, int1 ZeroBit)
  unsigned int32 Tam=0;
  unsigned int y1=Line%4;
  unsigned int y2=Line/4;
  int1 OwerFlow;
  ZeroBit=1-Zerobit;
 
  OwerFlow=(display_ram[(y2*8)][y1]/128)&0x01;
  Tam=display_ram[(y2*8)][y1];
  Tam=Tam<<8;
  Tam=Tam+display_ram[(y2*8)+1][y1];
  Tam=Tam<<8;
  Tam=Tam+display_ram[(y2*8)+2][y1];
  Tam=Tam<<8;
  Tam=Tam+display_ram[(y2*8)+3][y1];
 
  Tam=Tam<<1;
  Tam=Tam+ZeroBit;
 
  display_ram[(y2*8)  ][y1]=(int32)(Tam>>24)&0xFF;
  display_ram[(y2*8)+1][y1]=(int32)(Tam>>16)&0xFF;
  display_ram[(y2*8)+2][y1]=(int32)(Tam>>8)&0xFF;
  display_ram[(y2*8)+3][y1]=(int32)(Tam&0xFF);
 
  Return OwerFlow;
}
//Write data fonksiyonu 3 modül için ayarlı
void write_data(unsigned int8 row_adr)
{
int8 i=0,j=0;
int8 k=11;
while(k!=255) // Bu Döngü ileriye doğru sayarsa panel sağdan
{j=47-k; // Sola Doğru yüklenir.
for (i=0;i<4;i++) // Satırlar dolduruluyor..
{
spi_write(display_ram[j][row_adr]);
j=j-12;
}
k--;
}
output_high(LATCH);
delay_cycles(2);
output_low(LATCH);
}


3 modül için kaydırma fonksiyonlarında ne gibi değişiklilik yapacağımı bir türlü kavrayamadım. 3 modül için display ram alanını çıkardım. veriyi display[8][0] dan başlayarak basıyorum ekranda garip veriler çıkıyor.

[size=78%]
[/size]
« Son Düzenleme: 16 Temmuz 2017, 01:18:55 Gönderen: gokhangokcen »
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.  www.denay.com.tr

Çevrimdışı gokhangokcen

  • Kıdemli
  • ****
  • İleti: 333
    • Denay Bilişim Teknolojileri-LED aydınlatma sistemleri
Ynt: Yeni P10 Panel Kütüphanesi
« Yanıtla #4 : 16 Temmuz 2017, 08:32:32 »
##Sorunu çözdüm arkadaşlar.Sıkıntı şuymuş. Ben 7 adet 595'den fazla bir sayıya veri basınca kaydırma fonksiyonundaki kısımda veriler hatalı basılıyormuş. oda şurada;

Kod: [Seç]
if(i<11)                  //buraki 11 değeri 7 olarak belirlenmişti bunu 11 yapınca 3 modül için çalışır vaziyete geldi.
       {
         Carry=(display_ram[y2+(i+1)][y1]/128)&0x01;                      //Bir Sonraki Byte'in Tasan Bitini Carry'e yerlestir.
         display_ram[y2+i][y1] = display_ram[y2+i][y1]<<1;                //1 Bit Sola kaydir
         display_ram[y2+i][y1]=(unsigned int8)display_ram[y2+i][y1] | Carry;      //Carry'yi Bir Önceki Byte'in 0. bitine yerlestir Yerlestir
       }
       else
       {
          display_ram[y2+i][y1] = display_ram[y2+i][y1]<<1;               //1 Bit Sola kaydir
       }
    }



yanıtı sürekli editlemek istemedim.Sıkıntım halen devam etmekte. son olarak şu durumdayım.

main.c

Kod: [Seç]
#include <18F4620.h>

#use delay(clock=40000000)

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES H4                       //High speed osc with HW enabled 4X PLL
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PROTECT



#include "P10_Panel_Driver.c"


//--------------------------40 pin MCU PIN_diagram
//                        _____________
//MCLR/VPP----------------|1         40|-------RB7/PGD
//RA0/AN0-----------------|2         39|-------RB6/PGC
//RA1/AN1-----------------|3         38|-------RB5
//RA2/AN2/VREF-/CVREF-----|4         37|-------RB4
//RA3/AN3/VREF+-----------|5         36|-------RB3/PGM
//RA4/T0CKI/C1OUT---------|6         35|-------RB2
//RA5/AN4/SS/C2OUT--------|7         34|-------RB1
//RE0/RD/AN5--------------|8         33|-------RB0/INT
//RE1/WR/AN6--------------|9         32|-------VDD
//RE2/CS/AN7--------------|10        31|-------VSS
//VDD---------------------|11        30|-------RD7/PSP7
//VSS---------------------|12        29|-------RD6/PSP6
//OSC1/CLKI---------------|13        28|-------RD5/PSP5
//OSC2/CLKO---------------|14        27|-------RD4/PSP4
//RC0/T1OSO/T1CKI---------|15        26|-------RC7/RX/DT
//RC1/T1OSI/CCP2----------|16        25|-------RC6/TX/CK
//RC2/CCP1----------------|17        24|-------RC5/SDO
//RC3/SCK/SCL-------------|18        23|-------RC4/SDI/SDA
//RD0/PSP0----------------|19        22|-------RD3/PSP3
//RD1/PSP1----------------|20        21|-------RD2/PSP2
//                        |____________|

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

#int_timer1                      //Timer0 Kesmesi
void Timer1_int(){   
   static int8 int_syc;


   set_timer1(50536);           //1mS Gecikme için Timer kuruluyor..
   switch (int_syc)                 //Her 1mS de Bir bir sonraki satıra Geç
   {
   case 0:
        output_low(PinOE);write_data(int_syc);
        output_low(PinA);output_low(PinB);output_high(PinOE);
        break;
   case 1:
        output_low(PinOE);write_data(int_syc);
        output_high(PinA);output_low(PinB);output_high(PinOE);
        break;
   case 2:
        output_low(PinOE);write_data(int_syc);
        output_low(PinA);output_high(PinB);output_high(PinOE);
        break;
   case 3:
        output_low(PinOE);write_data(int_syc);
        output_high(PinA);output_high(PinB);output_high(PinOE);
        break;
   }   
   int_syc++;if(int_syc>3)int_syc=0;
}


void main()
{

   
   set_tris_a(0x00);
   set_tris_b(0x00);
   set_tris_c(0x00);
   set_tris_d(0x00);
   set_tris_e(0x00);
   
   setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_SS_DISABLED);
   setup_adc(ADC_OFF);
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_OFF);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DIV_BY_4,249,1);
   enable_interrupts(INT_timer1);
   enable_interrupts(GLOBAL);

   
   output_a(0x00);
   output_b(0x00);
   output_c(0x00);
   output_d(0x00);
   output_e(0x00);
   
   P10_Clear_Display(0);
      char *Str = "Gokhan Gokcen ";
     
            //P10_Currentfonts=Font8x8;
            //P10_DisplayShowString(0,0,str,0);
   
   for(;;)
      {
      P10_Currentfonts=Font11x12;
      P10_DisplayScrollString(0,7,2,3,Str,0);

     
      }

}

P10_panel_driver.c

Kod: [Seç]
/******************************************************************************
*  @file    P10_Panel_Driver.c
*  @author  Ferhat YOL
*  @version V1.3
*  @date    23-Kasım-2016
*  @brief   P10 LED Panel Kütüphanesi www.arectron.com
******************************************************************************/     
#include "P10_Panel_Driver.h"
#include "Font8x8.c"
#include "Font11x12.c"
#include "Font14x16.c"

sFONT P10_Currentfonts;

unsigned int8 display_ram[P10_Adress_Count][4];

void write_data(unsigned int8  row_adr)
{
   unsigned int8  i=0,j=0;
   unsigned int8  k=P10_Line_SR_Number-1;
   while(k!=255)                                   // Bu Döngü ileriye doğru sayarsa panel sağdan
   {j=(16*P10_Column_Num-1)-k;                     // Sola Doğru yüklenir.
     for (i=0;i<4;i++)                             // Satırlar dolduruluyor..
     {
         spi_write(display_ram[j][row_adr]);
         j-=P10_Line_SR_Number;
     }
     k--;
   }
   output_high(LATCH);
   delay_cycles(2);
   output_low(LATCH);
}

/*******************************************************************************
*   Parlaklık Ayar Fonksiyonu                                                  *
*   Parameter:    value (0-100)                                                *
*   Return:                                                                    *
*******************************************************************************/
void P10_Set_Brightness(int8 value){
   set_pwm1_duty((int16)value*4);
}

/*******************************************************************************
*   P10_Clear_Display                                                          *
*   Parametreler: fill                                                         *
*   Return:                                                                    *
*******************************************************************************/
void P10_Clear_Display(unsigned int1  fill){
unsigned int8  i=0,j=0,fdata=0;
   
  if (fill)fdata=0x00; else fdata=0xFF;

  for (i=0;i<4;i++)
  {
    for (j=0;j<P10_Adress_Count;j++)
    {
      display_ram[j][i]=fdata;
    }
  }
}

/*******************************************************************************
*   P10_PutPixel                                                               *
*   Parametreler  Xpos, Ypos, fill                                             *
*   Return:                                                                    *
*******************************************************************************/
void P10_PutPixel(unsigned int8  Xpos,unsigned int8  Ypos, unsigned int8  color)
{
  unsigned int8  y1=0,x1=0;
  unsigned int8  y2=0,x2=0;
  unsigned int8  temp=0;

  y1 = Ypos%4;
  y2 = Ypos/4;
  x1 = Xpos%8;   
  x2 = Xpos/8;
 
  if(color)  //Nokta Koy
  {
    temp=display_ram[(y2*P10_Line_SR_Number)+x2][y1]; //Ram'deki değer ön belleğe alınıyor.
    display_ram[(y2*P10_Line_SR_Number)+x2][y1] = (temp & (255-(128>>x1))); //x'inci bit 0 yapılır
  }
  else     //Noktayı Sil
  {
    temp=display_ram[(y2*P10_Line_SR_Number)+x2][y1]; //Ram'deki değer ön belleğe alınıyor.
    display_ram[(y2*P10_Line_SR_Number)+x2][y1] = (temp | (128>>x1)); //x'inci Bit 1 yapılır   
  }
}

/*******************************************************************************
*   P10_GetPixel                                                               *
*   Parameter:    Xpos, Ypos                                                   *
*   Return: Pixel value                                                        *
*******************************************************************************/
unsigned int8  P10_GetPixel(unsigned int8  Xpos,unsigned int8  Ypos)
{
  unsigned int8  y1=0,x1=0;
  unsigned int8  y2=0,x2=0;
  unsigned int8  temp=0;
  unsigned int8  value=0;
 
  y1 = Ypos%4;
  y2 = Ypos/4;
  x1 = Xpos%8;   
  x2 = Xpos/8;
 
  temp=display_ram[(y2*P10_Line_SR_Number)+x2][y1]; //Ram'deki değer ön belleğe alınıyor.
  value=1-(0x80 & temp<<x1)/128;   //Ram adresindeki bit geri gönderiliyor
  return value;
}
/*******************************************************************************
*   Satır Kaydırma Fonksiyonu                                                  *
*   Parameter:    Line, clstart, clend, ZeroBit                                *
*   Return:    OverFlow                                                        *
*******************************************************************************/
unsigned int8  LineScroll(unsigned int8  Line, unsigned int8  clstart, unsigned int8  clend, unsigned int8  ZeroBit)
{
  unsigned int8  i=0;
  unsigned int8  y1=Line%4;
  unsigned int8  y2=(Line/4)*P10_Line_SR_Number;
  unsigned int8  OverFlow, Carry;

  ZeroBit=1-ZeroBit;
  OverFlow=(display_ram[y2+clstart][y1]/128)&0x01;

   for(i=clstart;i<clend+1;i++)
   {
       if(i<7)
       {
         Carry=(display_ram[y2+(i+1)][y1]/128)&0x01;                      //Bir Sonraki Byte'in Tasan Bitini Carry'e yerlestir.
         display_ram[y2+i][y1] = display_ram[y2+i][y1]<<1;                //1 Bit Sola kaydir
         display_ram[y2+i][y1]=(unsigned int8)display_ram[y2+i][y1] | Carry;      //Carry'yi Bir Önceki Byte'in 0. bitine yerlestir Yerlestir
       }
       else
       {
          display_ram[y2+i][y1] = display_ram[y2+i][y1]<<1;               //1 Bit Sola kaydir
       }
    }

   if(ZeroBit){                                                           //Sag Taraftan Fonksiyona gönderilen bit ekleniyor..
    display_ram[((y2)+clend)][y1]=(int8)display_ram[((y2)+clend)][y1] | 0x01;
  }else{
    display_ram[((y2)+clend)][y1]=(int8)display_ram[((y2)+clend)][y1] & 0xFE;
  }
  return OverFlow; 
}

/*******************************************************************************
*   P10_DisplayScrollString                                                 *
*   Parametreler:    clstart, clend, ypos, speed, *textptr, color              *
*   Return:                                                                    *
*******************************************************************************/
void P10_DisplayScrollString(unsigned int8  clstart, unsigned int8  clend, unsigned int8  ypos, unsigned int8  speed, char* textptr, unsigned int8  color)
{
  unsigned int8  row=0,clm=0;
  unsigned int16  xbit;
  rom unsigned int8  *saddress;
  unsigned int8  cbit;
  unsigned int8  delay=110-(speed*10);
  unsigned int8  add;
 
  if(P10_Currentfonts.Width>0x08)
  add=0x02;
  else
  add=0x01;
 
  while (*textptr != 0)
  {
    saddress =(unsigned int8  *) &P10_Currentfonts.table[(unsigned int16 )(*textptr-32) * P10_Currentfonts.Height * add]; 
   
    for(clm=1;clm<=P10_Currentfonts.Width;clm++)
     {
       for(row=0;row<P10_Currentfonts.Height;row++)
       { 
          if(P10_Currentfonts.Width>0x08)
          {
           xbit=((unsigned int16)saddress[row*2]<<8) | (saddress[row*2+1]);
           cbit=(xbit>>(16-clm)) & 0x01;
          }
          else
          {
            xbit=saddress[row];
            cbit=(xbit>>(8-clm)) & 0x01;
          }   
          if(color) cbit=1-cbit;
          LineScroll(ypos+row,clstart,clend,cbit);
       }
      delay_ms(delay);
     }
     textptr++;
  }
 
}
/*******************************************************************************
*   P10_DisplayShowString                                                      *
*   Parametreler:    Xpos, Ypos, *textptr, color                               *
*   Return:                                                                    *
*******************************************************************************/
void P10_DisplayShowString(unsigned int8  Xpos, unsigned int8  Ypos, char* textptr, unsigned int8  color)
{
  unsigned int8  refcolumn = Xpos;
  unsigned int8  refrow = Ypos;
   
  while (*textptr != '\0')
  {
    P10_DisplayChar(refcolumn, refrow, *textptr, color);
    refcolumn += P10_Currentfonts.Width;
   
    if(refcolumn>P10_Max_Width) refrow += P10_Currentfonts.Height;

    textptr++;
  }
}

/*******************************************************************************
*   P10_DisplayChar                                                            *
*   Parameter:    Xpos, Ypos, *textptr, color                                  *
*   Return:                                                                    *
*******************************************************************************/
void P10_DisplayChar(unsigned int8  Xpos, unsigned int8  Ypos, char ascii, unsigned int8  color)
{
   unsigned int8  add;
   ascii-=32;
   
   //Eğer Font boyutu 8 den büyük ise Adresi 2 ile çarpıyoruz.
   if(P10_Currentfonts.Width>0x08)add=2;else add=1;
   P10_DrawChar(Xpos, Ypos,(unsigned int8 *)&P10_Currentfonts.table[(unsigned int16) ascii * P10_Currentfonts.Height* add], color);
}

/*******************************************************************************
*   P10_DrawChar                                                               *
*   Parameter:    Xpos, Ypos, *saddress, color                                 *
*   Return:                                                                    *
*******************************************************************************/
void P10_DrawChar(unsigned int8  Xpos, unsigned int8  Ypos, rom unsigned int8  *saddress, unsigned int8  color)
{
   unsigned int8  index = 0, i = 0;
   unsigned int16  shift;
   unsigned int16  xbit;
   
   for(index=0;index<P10_Currentfonts.Height;index++)
   { 
         if(P10_Currentfonts.Width>0x08)
         { 
            xbit=((unsigned int16)saddress[index*2]<<8) | (saddress[index*2+1]);
            shift=0x8000;
         }
         else
         {
            xbit=saddress[index];
            shift=0x80;
         }
         
         for(i=0;i<P10_Currentfonts.Width;i++)
         {
           if(((xbit<<i) & shift)==0x00)
           {
              P10_PutPixel(Xpos+i,Ypos+index,color);
           }
           else
           {
              P10_PutPixel(Xpos+i,Ypos+index,1-color);
           }
         }
    }
}

/*******************************************************************************
*   P10_DrawLine                                                               *
*   Parameter:    x1, x2, y1, y2, fill                                         *
*   Return:                                                                    *
*******************************************************************************/
void P10_DrawLine(unsigned int8  x1, unsigned int8  y1, unsigned int8  x2, unsigned int8  y2, unsigned int8  color)
{
  signed int addx=1, addy=1, P;
  signed int i, dy, dx, diff;
 
   if(x2>x1)
   {
      dx = x2 - x1;
   }else{
      dx = x1 - x2;
      addx = -1;
   }
   if(y2>y1)
   {
      dy = y2 - y1;
   }else{
      dy = y1 - y2;
      addy = -1;
   }

   if(dx >= dy)
   {
      dy *= 2;
      P = dy - dx;
      diff = P - dx;

      for(i=0; i<=dx; i++)
      {
         P10_PutPixel(x1, y1, color);

         if(P < 0)
         {
            P  += dy;
            x1 += addx;
         }
         else
         {
            P  += diff;
            x1 += addx;
            y1 += addy;
         }
      }
   }
   else
   {
      dx *= 2;
      P = dx - dy;
      diff = P - dy;

      for(i=0; i<=dy; ++i)
      {
         P10_PutPixel(x1, y1, color);

         if(P < 0)
         {
            P  += dx;
            y1 += addy;
         }
         else
         {
            P  += diff;
            x1 += addx;
            y1 += addy;
         }
      }
   }   
}

/*******************************************************************************
*   P10_DrawRect                                                               *
*   Parameter:    x1, x2, y1, y2, fill                                         *
*   Return:                                                                    *
*******************************************************************************/
void P10_DrawRect(unsigned int8  x1, unsigned int8  y1, unsigned int8  x2, unsigned int8  y2, unsigned int8  fill, unsigned int8  color)
{
   unsigned int16  i, xmin, xmax, ymin, ymax;

  if(fill)
   {
      if(x1 < x2)
      {
         xmin = x1;
         xmax = x2;
      }
      else
      {
         xmin = x2;
         xmax = x1;
      }

      if(y1 < y2)
      {
         ymin = y1;
         ymax = y2;
      }
      else
      {
         ymin = y2;
         ymax = y1;
      }

      for(; xmin <= xmax; ++xmin)
      {
         for(i=ymin; i<=ymax; ++i)
         {
            P10_PutPixel(xmin, i, color);
         }
      }
   }
   else
   {
      P10_DrawLine(x1, y1, x2, y1, color);
      P10_DrawLine(x2, y1, x2, y2, color);
      P10_DrawLine(x2, y2, x1, y2, color);
      P10_DrawLine(x1, y2, x1, y1, color);
   }     
}

/*******************************************************************************
*   P10_DrawCircle                                                             *
*   Parameter:    x, y, Size, fill                                             *
*   Return:                                                                    *
*******************************************************************************/
void P10_DrawCircle(unsigned int8 x, unsigned int8 y, unsigned int8 size, unsigned int8 fill, unsigned int8 color)
{
   signed int a,b,P;
   a=0;
   b=size;
   P=1-size;
   
   do
   {
      if(fill)
      {
         P10_DrawLine(x-a, y+b, x+a, y+b,color);
         P10_DrawLine(x-a, y-b, x+a, y-b,color);
         P10_DrawLine(x-b, y+a, x+b, y+a,color);
         P10_DrawLine(x-b, y-a, x+b, y-a,color);
      }
      else
      {
         P10_PutPixel(a+x, b+y,color);
         P10_PutPixel(b+x, a+y,color);
         P10_PutPixel(x-a, b+y,color);
         P10_PutPixel(x-b, a+y,color);
         P10_PutPixel(b+x, y-a,color);
         P10_PutPixel(a+x, y-b,color);
         P10_PutPixel(x-a, y-b,color);
         P10_PutPixel(x-b, y-a,color);
      }
     
      if(P < 0)
      P+= 3 + 2*a++;
    else
      P+= 5 + 2*(a++ - b--);
     
  }while(a<=b);
}

P10_Panel_Driver.h

Kod: [Seç]
/******************************************************************************
*  @file    P10_Panel_Driver.h
*  @author  Ferhat YOL
*  @version V1.3
*  @date    23-Kasım-2016
*  @brief   P10 LED Panel Kütüphanesi Fonksiyonlar ve Sabitler
******************************************************************************/
#define P10_Column_Num 3
#define P10_Line_Num 1
#define P10_Max_Width 32*P10_Column_Num
#define P10_Max_Height 16*P10_Line_Num
#define P10_Adress_Count 16*P10_Column_Num*P10_Line_Num
#define P10_Line_SR_Number P10_Max_Width/8

#define PinA     pin_d1
#define PinB     pin_d0
#define PinOE    pin_c4                    //OE=0 Display OFF, OE=1 Display ON
#define LATCH    pin_d3                    //
//      PinSCK   pin_c3                    //Spi Clock Hattı
//      PinData  pin_c5                    //Spi Data Hattı
//      PWM_Pin  pin_c2                    //


//       _____
// PWM__|     \
// OE___| AND  }---- Disp_Enable
//      |_____/     
//
//  P10 Led Board
//      1     2
// OE  --|oo|-- A
// GND --|oo|-- B
// GND --|oo|--
// GND --|oo|-- SCK
// GND --|oo|-- LATCH
// GND --|oo|-- DATA
// GND --|oo|--
// GND --|oo|--
//     15    16

typedef struct _tFont
{   
  rom unsigned int8 *table;
  unsigned int8 Width;
  unsigned int8 Height;
 
} sFONT;

extern sFONT P10_Currentfonts;
extern sFONT Font8x8;
extern sFONT Font11x12;
extern sFONT Font14x16;

//extern unsigned int8  display_ram[P10_Adress_Count][4];

void write_data(unsigned int8 row_adr);
void P10_Set_Brightness(int8 value);
void P10_Clear_Display(unsigned int1 fill);
void P10_PutPixel(unsigned int8 Xpos,unsigned int8 Ypos, unsigned int8 color);
unsigned int8  P10_GetPixel(unsigned int8 Xpos,unsigned int8 Ypos);
unsigned int8  LineScroll(unsigned int8 Line, unsigned int8 clstart, unsigned int8 clend, unsigned int8 ZeroBit);
void P10_DisplayScrollString(unsigned int8 clstart, unsigned int8 clend, unsigned int8  ypos, unsigned int8 speed, char* textptr, unsigned int8 color);
void P10_DisplayShowString(unsigned int8 Xpos, unsigned int8 Ypos, char* textptr, unsigned int8 color);
void P10_DisplayChar(unsigned int8 Xpos, unsigned int8 Ypos, char ascii, unsigned int8 color);
void P10_DisplayChar(unsigned int8 Xpos, unsigned int8 Ypos, char ascii, unsigned int8 color);
void P10_DrawChar(unsigned int8  Xpos, unsigned int8  Ypos, rom unsigned int8  *saddress, unsigned int8  color);
void P10_DrawLine(unsigned int8 x1, unsigned int8 y1, unsigned int8 x2, unsigned int8 y2, unsigned int8 color);
void P10_DrawRect(unsigned int8 x1, unsigned int8 y1, unsigned int8 x2, unsigned int8 y2, unsigned int8 fill, unsigned int8 color);
void P10_DrawCircle(unsigned int8 x, unsigned int8 y, unsigned int8 size, unsigned int8 fill, unsigned int8 color);

Normalde olması gereken şu satır :       P10_DisplayScrollString(0,15,2,3,Str,0); ama bu şekilde yapınca 1. videodaki sıkıntı oluşuyor.
P10_DisplayScrollString(0,7,2,3,Str,0); yapınca 2. videodaki gibi çalışma sergiliyor. Kaydırma fonksiyonlarında bir problem var ve çözüme ulaşamadım.Fikirlerinize ihtiyacım var yardımcı olursanız memnun olurum.


ekrana istediğim pozisyonda sabit yazı yazdırabiliyorum. Panel tanımlamaları ile ilgili bir problem yok gibi duruyor.
yazı kaydırma ise şöyle;
https://youtu.be/LjQ75Oig8aA
https://youtu.be/XL3Cm-wTgnA

« Son Düzenleme: 16 Temmuz 2017, 09:01:37 Gönderen: gokhangokcen »
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.  www.denay.com.tr

Çevrimdışı Mucit23

  • Profesyonel Üye
  • *****
  • İleti: 5788
    • www.arectron.com/
Ynt: Yeni P10 Panel Kütüphanesi
« Yanıtla #5 : 18 Temmuz 2017, 01:36:58 »
P10_DisplayScrollString(0,7,2,3,Str,0);

Sorun yazdırma şeklinde.

Ekranda dikey olarak 8'er pixellik parçalar halinde kaydırma yapılabilir. 96 pixel genişlik için 96/8 yaptığınızda 12'şer parçadan bahsedebiliriz, Fonksiyonda ise bu değerin 1 eksiği yazdırılmak zorunda. yani 11

Kaydırma yaparken aşağıdaki gibi bir kullanım ile ekranın tamamında kaydırma yapabilirsin.


P10_DisplayScrollString(0,11,2,3,Str,0);


Çevrimdışı gokhangokcen

  • Kıdemli
  • ****
  • İleti: 333
    • Denay Bilişim Teknolojileri-LED aydınlatma sistemleri
Ynt: Yeni P10 Panel Kütüphanesi
« Yanıtla #6 : 18 Temmuz 2017, 11:32:12 »
Dediğiniz düzenlemeyi yapsamda p10 kütüphanesindeki line scrool fonksiyonundaki for döngüsünün max değerinide değiştirmek gerekiyor.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.  www.denay.com.tr

Çevrimdışı burak.sn

  • Yeni Üye
  • *
  • İleti: 1
Ynt: Yeni P10 Panel Kütüphanesi
« Yanıtla #7 : 03 Aralık 2017, 00:28:41 »
Selamlar, Mucit Hocam  bitirme projemiz var ve biz bu paneli mikroc ile sürmek istiyoruz 3 tane panel için mikroc de nasıl yazabilirim ne önerirsiniz yol gösterebilir misiniz ? İyi çalışmalar dilerim.

Çevrimdışı mstylmz

  • Yeni Üye
  • *
  • İleti: 17
Ynt: Yeni P10 Panel Kütüphanesi
« Yanıtla #8 : 11 Şubat 2018, 03:41:25 »
Merhabalar

Text kaydırma işlemi sadece sol tarafa doğru yapılabiliyor. sağ, yukarı, aşağı hatta pusulada var olan bütün yönlere kaydırma işlemini nasıl yapabiliriz ?