Yeni P10 Panel Kütüphanesi

Başlatan Mucit23, 14 Haziran 2017, 14:58:20

Mucit23

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

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;

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

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

Murat Mert


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

WrtM

Teşekkürler , çok faydalı hocam.

gokhangokcen

#3
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?


#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.
   
#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]
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

gokhangokcen

#4
##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;

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

#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

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

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

Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

Mucit23

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);


gokhangokcen

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.

burak.sn

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.

mstylmz

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 ?


e135193

Merhabalar,

Satır ve sütün sayısını arttırmak için aşağıdaki satırlarda değişiklik yapmamız gerekiyor. Ancak satırsa sayısını arttırmamız durumunda donanımsal olarak ne gibi değişiklik yapmamız gerekiyor. her satır arttırımı için yeni SCK, DATA ve LATCH pinleri kullanamımız gerekmiyor mu ? peki bu yeni pinleri eklediğimizde yazılım içerisinde başka bir değişiklik yapmamıza gerek var mı ?

#define P10_Column_Num 2
#define P10_Line_Num 1


Ayrıca, 8x8 Fontu kullandığımda alt alta iki farklı yazı nasıl yazdırabilirim. Yani tek P10 panelde alt alta yazı yazdırmak istiyorum.

yardımcı olursanız sevinirim.

isa_olcer

#10
Merhaba RS232 den gönderilen  rakam ve yazıları sabit olarak 2 adet panelde göstermek için PIC16F628A için böyle bir kod yazdım.  Fakat tarama sırasında ekranda biraz titreme oluyor. Bunun için ne yapabilirim? Tahminim işlemcinin frakansı düşük kalıyor.



#include <16F628A.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#include <C:\Users\İsa\Desktop\P10 LED\font.h> //8x16 fontlar

// Denetleyici konfigürasyon ayarları
#fuses NOMCLR,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOCPD

#use delay(crystal=20000000) // 
#use fast_io(b)
#use fast_io(a)

#define EXP_OUT_ENABLE  PIN_B6 //ST 6 PIN 595 12PIN
#define EXP_OUT_CLOCK   PIN_B4 //SH 9 PIN 595 11PIN
#define EXP_OUT_DO      PIN_B7 //DS 10 PIN 595 14PIN
#define SA PIN_B0 // 11
#define SB PIN_B5 // 12
#define OE PIN_B3 // 13
#define NUMBER_OF_74595 32

#include <74595.c>
#use rs232 (baud=28800, xmit=pin_B2, rcv=pin_B1, parity=N, stop=1, ERRORS) // RS232 ayarlari

int8 Data[32];
int8 w=0;
char veri[8];

#int_rda
void serihaberlesme_kesmesi ()

{
  disable_interrupts(int_rda);
   gets(veri); // rs232 den gelen veri  
   enable_interrupts(int_rda); // int_rda kesmesi aktif 
}

void main()
{
   set_tris_a(0x00);
   set_tris_b(0b00000010);
   
   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin ver
   
   veri[0]=0x49; // açılıkşta ISAOLCER yazdırılıyor.
   veri[1]=0x53;
   veri[2]=0x41;
   veri[3]=0x4F;
   veri[4]=0x4C;
   veri[5]=0x43;
   veri[6]=0x45;
   veri[7]=0x52;
 
 while(true)
 {
                            
           for(int8 z=0;z<4;z++) // C taraması // font bilgileri değişkene yükleniyor.
            {
                       
            w=0;
            
            for(signed int8 t=7;t>-1;t--) // B taraması 2 panelde t 8 e kadar sayacak
            {
            
            for(int8 m=0;m<4;m++) // A taraması 4 sutun
            {
               
              Data[w]=digit[veri[t]-0x20][(4*m)+z];
              w++;
            }            
        }
                        
      switch(z){      
      case 0:
         output_low(OE);
         output_low(SA);
         output_low(SB);
         write_expanded_outputs(Data);
         output_high(OE);
         break;
      case 1:
         output_low(OE);
         output_high(SA);
         output_low(SB);
         write_expanded_outputs(Data);
         output_high(OE);
         break;
      case 2:
         output_low(OE);
         output_low(SA);
         output_high(SB);
         write_expanded_outputs(Data);
         output_high(OE);
         break;
      case 3:
         output_low(OE);
         output_high(SA);
         output_high(SB);
         write_expanded_outputs(Data);
         output_high(OE);  
         break;
        }
           
      }
   }
 }

medelog

P4 paneller içinde uygulayabilirmiyiz
"Gezdim Halep ile Şamı, Eyledim ilmi talep, Meğer ilim bir hiç imiş, İllâ edep illâ edep. " Yunus EMRE

Cod3rs

Alıntı yapılan: isa_olcer - 14 Temmuz 2019, 22:29:26Merhaba RS232 den gönderilen  rakam ve yazıları sabit olarak 2 adet panelde göstermek için PIC16F628A için böyle bir kod yazdım.  Fakat tarama sırasında ekranda biraz titreme oluyor. Bunun için ne yapabilirim? Tahminim işlemcinin frakansı düşük kalıyor.



#include <16F628A.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#include <C:\Users\İsa\Desktop\P10 LED\font.h> //8x16 fontlar

// Denetleyici konfigürasyon ayarları
#fuses NOMCLR,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOCPD

#use delay(crystal=20000000) // 
#use fast_io(b)
#use fast_io(a)

#define EXP_OUT_ENABLE  PIN_B6 //ST 6 PIN 595 12PIN
#define EXP_OUT_CLOCK   PIN_B4 //SH 9 PIN 595 11PIN
#define EXP_OUT_DO      PIN_B7 //DS 10 PIN 595 14PIN
#define SA PIN_B0 // 11
#define SB PIN_B5 // 12
#define OE PIN_B3 // 13
#define NUMBER_OF_74595 32

#include <74595.c>
#use rs232 (baud=28800, xmit=pin_B2, rcv=pin_B1, parity=N, stop=1, ERRORS) // RS232 ayarlari

int8 Data[32];
int8 w=0;
char veri[8];

#int_rda
void serihaberlesme_kesmesi ()

{
  disable_interrupts(int_rda);
   gets(veri); // rs232 den gelen veri  
   enable_interrupts(int_rda); // int_rda kesmesi aktif 
}

void main()
{
   set_tris_a(0x00);
   set_tris_b(0b00000010);
   
   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin ver
   
   veri[0]=0x49; // açılıkşta ISAOLCER yazdırılıyor.
   veri[1]=0x53;
   veri[2]=0x41;
   veri[3]=0x4F;
   veri[4]=0x4C;
   veri[5]=0x43;
   veri[6]=0x45;
   veri[7]=0x52;
 
 while(true)
 {
                            
           for(int8 z=0;z<4;z++) // C taraması // font bilgileri değişkene yükleniyor.
            {
                       
            w=0;
            
            for(signed int8 t=7;t>-1;t--) // B taraması 2 panelde t 8 e kadar sayacak
            {
            
            for(int8 m=0;m<4;m++) // A taraması 4 sutun
            {
               
              Data[w]=digit[veri[t]-0x20][(4*m)+z];
              w++;
            }            
        }
                        
      switch(z){      
      case 0:
         output_low(OE);
         output_low(SA);
         output_low(SB);
         write_expanded_outputs(Data);
         output_high(OE);
         break;
      case 1:
         output_low(OE);
         output_high(SA);
         output_low(SB);
         write_expanded_outputs(Data);
         output_high(OE);
         break;
      case 2:
         output_low(OE);
         output_low(SA);
         output_high(SB);
         write_expanded_outputs(Data);
         output_high(OE);
         break;
      case 3:
         output_low(OE);
         output_high(SA);
         output_high(SB);
         write_expanded_outputs(Data);
         output_high(OE);  
         break;
        }
           
      }
   }
 }


Bende spi Üzerinden Sürdüğümde Titreme yapıyordu.spidan gönderilecek datanın Bitlerine erişip bit bit gönderdim.ve sorun ortadan kalktı.Böylece istediğim herhangi pinden data gönderebiliyorum

kuylus

Merhabalar, konu biraz eski olsada  belki yeni gelişmeler olmuştur, p10 font  kütüphanesinde 8x8 de sorun yok fakat diyer seçeneklerde fon ekrana düzgün çıkmıyor, fontu oluşturan bazı sütunlardaki ledler , normalde  yanmaması gereken yerlerde yanıyor buda fontun okunamamasına neden olur