Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: gokhangokcen - 25 Nisan 2018, 09:14:47

Başlık: Rotary enkoder ve P10 modül kullanarak alarmlı saat
Gönderen: gokhangokcen - 25 Nisan 2018, 09:14:47
Merhaba arkadaşlar, yaklaşık 2-3 haftadır derleyip topladığım proje olan görüntü almak için P10 Led Ekran, ayar yapmak için Rotary Encoder, RTC için ise DS3231'in kullanıldığı Alarmlı saat projemi bitirdim. Elbette her yiğidin yoğurt yiyişi farklı olacaktır. Kendime göre doğru gelen şekilde programı yazdım, devreyi kurdum ve şu anda çalışıyor. Kodların çalışmasında bir sıkıntı yok ama ufak tefek düzeltmeler yapılması gerekebilir. Ekrana yazıyı ortala, sağa daya gibi şeyler. Kodlardaki P10 kütüphanesini @Mucit23 hocamın düzenlediği kütüphaneyi kullandım kendisine buradan bir kere daha teşekkür ederim.

ihtiyacı olan arkadaşlar kaynak göstererek kullabilirler.Herkes faydalansın diye zaten forumumuz var.
Ürün ile alakalı bağlantıları ya da baskı devresini bilinçli olarak paylaşmadım.Zaten az çok program ya da elektronikten anlayan kişi programdan gerekli bağlantıları çıkarabilir.Sormak istedikleriniz olursa elimden geleni ardına koymayanlardanım, yardımcı olurum.

main.c
/*******************************************************************************
* Dosya Adı          : P10_Panel_Alarmlı_Saat_Programı
* Yazan              : Gökhan Gökçen
* Versiyon           : V1.0
* Tarih              : 08/04/2018
* Açıklama           : P10 Panelli Alarmlı Saat
*
*Program açılışta eepromdaki verileri okur,
*
*
*
*
*
*
*
*
*******************************************************************************/   

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

#include <18F4620.h>
#include <string.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 NOMCLR
#FUSES NOCPD
#FUSES PUT

#use delay(clock=40000000)
#use I2C(Master, SDA = pin_D7, SCL = pin_D6)



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

#include "DS3231.c"
#include <math.h>
/*******************************P10 Panel kütüphanesi**************************/

#include <P10_Panel_Driver.c>

/***********************************Tanımlamalar*******************************/

#define encoder_switch  pin_a2
#define role   pin_d2

/********************************Global Değişkenler****************************/

unsigned int int_syc = 0 , i = 0 , saat_oku = 0 , set = 0 , Aux1 = 0 , Enc1 = 0 , dakika = 0;
unsigned int ayar = 0 , yarim_saniye = 0 , alarm_suresi = 0 , sn = 0 ;
unsigned int alarm_saatleri[10] , alarm_dakikalari[10] ;
int1 toggle = 0 ;
unsigned long sayac = 0 , donus = 0 ,Q = 0 ,sure_sayac = 0 , sn_sayac = 0;
unsigned char s = 00 , min = 9, hr = 18;
//unsigned char dt = 04 , mt = 04 , yr = 18 , dy = 18;      //6 cuma 7 cumartesi ...
short hr_format = _24_hour_format , am_pm = 0;
char MenuCikis = 0 , MenuNo = 0;

/**********************************Menü Tanımlamaları********************************/

char *Menu[]=
   {
      "         ",      //0
      "SAAT AYARI",     //1
      "ALRM1",          //2
      "ALRM2",          //3
      "ALRM3",          //4
      "ALRM4",          //5
      "ALRM5",          //6
      "ALRM6",          //7
      "ALRM7",          //8
      "ALRM8",          //9
      "ALRM9",          //10
      "SURE",           //11
      "CIKIS     "      //12
   };

/**********************************Fonksiyonlar********************************/

void write_data    (unsigned int8 row_adr);
void enkoder_oku();
void ana_menu();
void saat_ayar_menusu();
void alarm_ayar_menusu();
void alarm_sure_menusu();
void alarm_durumu_karsilastir();
void eepromdaki_degerleri_oku();
void eeproma_degerleri_yaz();

/********************************Kesme Alt Programı****************************/
#int_timer0                                                                   //Timer0 Kesmesi
void Timer0_int()
   {
      set_timer0(133);                                                              //Timer0 800us değerine kurulur
     
      if(++sayac >= 600)                                                            //480ms ara ile saat okumak için sayaç kurulur
         {
            saat_oku = 1;                                                                 //Süre dolduğunda saatin okunması için saat_oku değişkeni 1 yapılır
            sayac=0;                                                                      //Sayaç değişkeni sıfırlanır
         }

   if(++sure_sayac >= 625)
      {
         toggle++;
         yarim_saniye++;
         sure_sayac=0;
         if(yarim_saniye>121)yarim_saniye=0;
      }
     
   if(++sn_sayac >=1250)
      {
         sn_sayac=0;
         sn++;
         if(sn>=60)sn=0;
      }

   switch (int_syc)                                                              //P10Display tarama bölümü
      {
         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;
         
      }     //switch sonu
     
   int_syc++;if(int_syc>3)int_syc=0;

   
}     //Kesme sonu

/**********************************Ana Program*********************************/
void main()
{
   set_tris_a(0x07);                                                          //PortA için giriş/çıkış tanımlamaları
   set_tris_b(0x00);                                                          //PortB için giriş/çıkış tanımlamaları
   set_tris_c(0x00);                                                          //PortC için giriş/çıkış tanımlamaları
   set_tris_d(0x00);                                                          //PortD için giriş/çıkış tanımlamaları
   set_tris_e(0x00);                                                          //PortE için giriş/çıkış tanımlamaları
   setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_SS_DISABLED);                      //SPI kullanılmayacak
   setup_adc(ADC_OFF);                                                        //ADC kullanılmayacak
   setup_ccp1(CCP_OFF);                                                       //PWM1 kullanılmayacak
   setup_ccp2(CCP_OFF);                                                       //PWM2 kullanılmayacak
   setup_timer_0(T0_INTERNAL | T0_8_BIT | T0_DIV_64);                         //Timer0 800us süreye kuruluyor
   enable_interrupts(INT_timer0);                                             //Timer0 kesmesi aktif edilir
   enable_interrupts(GLOBAL);                                                 //Kesmelere izin verilir
   set_timer0(133);                                                           //Timer0 kesmesine 800us için 133 değeri yüklenir
   
   set=DS3231_read(controlREG);                                               //DS3231'in çalışma bit'i okunur
   if(bit_test(set,7)){DS3231_init();}                                        //Eğer bu bit 0 ise 1 yapılır.DS3231 kurulumu yapılır.
   
   output_a(0x00);                                                            //PortA pinlerine 0x00 değeri yüklenir
   output_b(0x00);                                                            //PortB pinlerine 0x00 değeri yüklenir
   output_c(0x00);                                                            //PortC pinlerine 0x00 değeri yüklenir
   output_d(0x00);                                                            //PortD pinlerine 0x00 değeri yüklenir
   output_e(0x00);                                                            //PortE pinlerine 0x00 değeri yüklenir
 
   //setTime(hr, min, s, am_pm, hr_format);                            //DS3231'den saat,dakika,saniye,am_pm,hr_format bilgileri okunur
   //setDate(dy, dt, mt, yr); 
   //Set_Brightness(100);                                                     //Ekran parlaklığını değiştirmek için kullanılan fonksiyon
   clear_display(0);                                                          //P10Display temizlenir
   getTime(hr, min, s, am_pm, hr_format);                                     //DS3231'den saat,dakika,saniye,am_pm,hr_format bilgileri okunur
   eepromdaki_degerleri_oku();                                                //Eepromdaki değerler (alarm süresi ve alarm zamanları) okunur
   
   
   
   if(alarm_suresi>=60)                                                       //Alarm_suresi değişkeni 60sn'den büyük ya da eşit ise (açılışta herhangi bir değer yüklenip yüklenmediğini kontrol eder)
      {
      alarm_suresi=1;                                                         //Açılışta daha önceden herhangi bir değer yüklenmemiş ise içeriğine 1 sn olarak değiştirir
      write_eeprom(30 , alarm_suresi);                                        //Bu yüklenen değer eepromun 30 nolu adresine yazılır
      delay_us(15);                                                           //15us gecikme yapılır
      }
   
   while(TRUE)                                                                //Program için sonsuz döngü kurulur
   {
      enkoder_oku();                                                          //Enkoder okuma fonksiyonunu çağırır


      if(toggle)                                                              //Kesme içerisinde toggle yaklaşık 500ms ile toggle edilir toggle değeri 1 ise saat ile dakika arasındaki nokta yakılır
         {
            sprintf(Text,"%02d:%02d",hr,min);                                 //Saat ve dakika bilgileri Text değişkeni içerisine kopyalanır
            ShowString(1,4,1,0);                                              //P10Panelin x=1,y=0 pixelinden itibaren font1 ile Text stringini ekranda gösterir
         }
         
      if(!toggle)                                                             //Kesme içerisinde toggle yaklaşık 500ms ile toggle edilir toggle değeri 0 ise saat ile dakika arasındaki nokta söndürülür
         {
            sprintf(Text,"%02d %02d",hr,min);                                 //Saat ve dakika bilgileri Text değişkeni içerisine kopyalanır
            ShowString(1,4,1,0);                                              //P10Panelin x=1,y=0 pixelinden itibaren font1 ile Text stringini ekranda gösterir
         }
         
      if(saat_oku==1)                                                         //Eğer saat_oku değişkeni "1" ise (yaklaşık 480ms süre kesme içerisinde 1 veya 0 olur)
         {
            getTime(hr, min, s, am_pm, hr_format);                            //DS3231'den saat,dakika,saniye,am_pm,hr_format bilgileri okunur
            //getDate(dy, dt, mt, yr);               
            saat_oku=0;                                                       //Saat okuma değişkeni "0"'lanır
            alarm_durumu_karsilastir();                                       //Alarm değişkenlerini karşılaştırma fonksiyonu çağırılır okunan saat değeri aynı ise röle çıkış verir
         }

while(MenuCikis)                                                              //Menü fonksiyonu döngüsü
   {
       enkoder_oku();                                                         //Enkoder okuma fonksiyonu

         if(MenuNo==1)                                                        //MenüNo değişkeni 1 ise
            {
               sprintf(Text , Menu[MenuNo]);                                  //Text pointerı içerisine Menu[MenuNo] stringini yükler yani menuno=1 iken "SaatAyarlari"
               ShowString(1,0,1,0);                                           //P10Panelin x=1,y=0 pixelinden itibaren font1 ile Text stringini ekranda gösterir
            }
               
         if(MenuNo>=2 && MenuNo<=10)                                          //MenuNo değişkeni 2 ile 10 arasında ise (Alarm ayarları kısmında ise)
            {
               if(alarm_saatleri[MenuNo-2] >= 24)                             //Başlangıç olarak eeprom FF olarak gelir.Bu durumda 24'den büyük olur ekranda "-" işareti göstermek için kullanılan satır
                  {
                     sprintf(Text , "%s -:-" , Menu[MenuNo]);                 //Text pointerina Menu[MenuNo]'dan stringi çeker ve "-:-" ile birleştirir
                     ShowString(1,0,1,0);                                     //P10Panelin x=1,y=0 pixelinden itibaren font1 ile Text stringini ekranda gösterir
                  }else                                                       //Eğer eepromdaki değer FF'den farkli ise
                     {
                        sprintf(Text , "%s%02d:%02d" , Menu[MenuNo] , alarm_saatleri[MenuNo-2] , alarm_dakikalari[MenuNo-2]);//Ekrana Menu[MenuNo] ile ilgili string,Alarm_saatleri ve Alarm_dakikaları yazılır
                        ShowString(1,0,1,0);                                  //P10Panelin x=1,y=0 pixelinden itibaren font1 ile Text stringini ekranda gösterir
                     }
            }
           
         if(MenuNo==12)                                                       //Eğer MenuNo değeri 12 ise
            {
               sprintf(Text , Menu[MenuNo]);                                  //Text içerisine "CIKIS" yüklenir
               ShowString(1,4,1,0);                                           //P10Panelin x=1,y=4 pixelinden itibaren font1 ile Text stringini ekranda gösterir
            }

         if(MenuNo==11)                                                       //Eğer MenuNo değeri 11 ise
            {
               sprintf(Text , "%s  %2dsn" , Menu[MenuNo] , alarm_suresi);     //Text pointerina Menu[MenuNo] adresindeki string yükler alarm_suresi değişkeni ile birleştirir
               ShowString(1,0,1,0);                                           //P10Panelin x=1,y=0 pixelinden itibaren font1 ile Text stringini ekranda gösterir
            }


       if(donus>Q)                                                            //Enkoder saat yönünde döndü ise
         {
            Q=donus;                                                          //Dönüş ile Q değişkeni eşitlenir(sürekli bu if içerisine giriş yapmaması için)
            MenuNo++;                                                         //MenüNo değişkeni 1 arttırılır
            if(MenuNo>=13)MenuNo=1;                                           //MenüNo değişkeni 13'e eşit ya da büyük ise MenüNo değişkenine "1" yüklenir
            clear_display(0);                                                 //P10Panel temizlenir
         }
         
                     
       /******************************************************/       
       if(donus<Q)                                                            //Eğer enkoder saat yönünün tersine döndü ise
         {
            Q=donus;                                                          //Dönüş ile Q değişkeni eşitlenir(sürekli bu if içerisine giriş yapmaması için)
            MenuNo--;                                                         //MenüNo değişkeni 1 eksiltilir
            if(MenuNo<=0)MenuNo=12;                                           //MenüNo değişkeni 0'a eşit ya da küçük ise MenüNo değişkenine "12" yüklenir
            clear_display(0);                                                 //P10Panel temizlenir
         }

        /******************************************************/
        if(!input(encoder_switch))                                            //Rotary enkodera basıldı ise
         {
            if(MenuNo==1)  // Program                                         //MenuNo değişkenine "1" yüklenir
               {
                  clear_display(0);                                           //P10Panel Temizlenir
                  Q=donus;                                                    //Q değişkeni Donus değişkenine eşitlenir
                  saat_ayar_menusu();                                         //Saat_ayar_menusu fonksiyonu çağırılır
                  MenuCikis=0;                                                //MenuCikis değişkenine "0" yüklenir geriye dönüş olduğunda While(MenuCikis) satırından çıkıp ana ekrana(saat göstermeye) geçmek için
               }
               
             if(MenuNo>=2 && MenuNo<=10)                                      //Eğer MenuNo "2" ile "10" arasında ise yani alarm ayar kısmında ise
               {
                  clear_display(0);                                           //P10Panel temizlenir
                  Q=donus;                                                    //Q değişkeni Donus değişkenine eşitlenir
                  alarm_ayar_menusu();                                        //Alarm ayar menüsü çağırılır
                  MenuCikis=0;                                                //MenuCikis değişkenine "0" yüklenir geriye dönüş olduğunda While(MenuCikis) satırından çıkıp ana ekrana(saat göstermeye) geçmek için
               }

            if(MenuNo==11)                                                    //Eğer MenuNo "11" ise yani alarm_süre ayar kısmında ise
               {
                  clear_display(0);                                           //P10Panel temizlenir
                  Q=donus;                                                    //Q değişkeni Donus değişkenine eşitlenir
                  alarm_sure_menusu();                                        //Alarm süre menüsü fonksiyonu çağırılır
                  MenuCikis=0;                                                //MenuCikis değişkenine "0" yüklenir geriye dönüş olduğunda While(MenuCikis) satırından çıkıp ana ekrana(saat göstermeye) geçmek için
               }
       
            if(MenuNo==12)                                                    //Eğer MenuNo "12" ise yani Cikis kısmında ise
               {
                  MenuCikis=0;                                                //MenuCikis değişkenine "0" yüklenir
                  MenuNo=0;                                                   //MenuNo değişkenine "0" yüklenir
                  clear_display(0);                                           //P10Panel temizlenir
                  donus=0;                                                    //Donus değişkeni sıfırlanır
                  Q=0;                                                        //Q değişkeni sıfırlanır
               }
         } // ENTER sonu.
       
   

   }  // while MenuCikis sonu.


   } //while true sonu




}  //Void main sonu


/**********************************Alarm Durumu Karşılaştırma Menüsü*********************************/

void alarm_durumu_karsilastir()
{

   if(min!=dakika)                                                            //Alarm durumu oluştuğunda bu iki değişken birbirine eşitlenir ve min değişene kadar alarm durumuna bakılmaz
      {
         for(int r=0;r<9;r++)                                                 //Alarm registerlarını karşılaştırmak için for next döngüsü kurulur
            {
               if((hr==alarm_saatleri[r]) && (min==alarm_dakikalari[r]))      //Alarm_saatleri ve Alarm_dakikalarından herhangi birisi aynı anda mevcut saat ile eşit işe
                  {
                     sn=0;                                                    //Alarm süresi için kullanılan sn değişkeni "0"lanır
                     sn_sayac=0;                                              //sn için kullanılan saniye sayacı "0"lanır
                     output_high(role);                                       //Alarm için kullanılan çıkış aktif edilir
                     dakika=min;                                              //Sürekli bu döngüye girmemesi
                  }//if sonu
            }//for sonu
      }//if(min!=dakika) sonu


   if(sn>=alarm_suresi)                                                       //Alarm aktif olduktan sonra sn ile alarm süresi karşılaştırır sn alarm süresinden büyük olduğunda çıkış pasif edilir
      {
         output_low(role);                                                    //Alarm için kullanılan röle çıkışı pasif edilir
      }
}



/**********************************Saat Ayar Menüsü*********************************/

void saat_ayar_menusu()
{
   while(MenuCikis)                                                           //MenuCikis fonksiyona gelirken "1" olarak gelir
   {
      enkoder_oku();                                                          //Enkoder okuma fonksiyonu çağırılır

     
      if(!input(encoder_switch))                                              //Eğer enkoder switchine basıldı ise
         {
            ayar++;                                                           //Ayar değişkeni "1" arttırılır aşağıda switch case ile alarm/dakika ayarı için gereklidir
            yarim_saniye=0;                                                   //Buton okuma hızını yavaşlatmak için kullanılan değişken "0"lanır
            while(yarim_saniye<2);                                            //Yarımsaniye değişkeni 2den küçük ise, yani 1sn butonu tekrar okumak için beklenir
            if(ayar>4)ayar=0;                                                 //Ayar değişkeni "4"den büyük ise "0"lanır
            Q=donus;                                                          //Q değişkeni donus değişkenine eşitlenir
            toggle=1;                                                         //Ekranda saat/dakika değişkeni ayarlanır iken yakıp söndürmek için kullanılır
            sure_sayac=0;                                                     //sure_sayac değişkeni "0"lanır
         }

      switch (ayar)
         {
            case 1:                                                           //Ayar değişkeni "1" ise saat ayarlamak için kullanılır
           
               if(Q>donus)                                                    //Enkoder saat yönünde dönüyor ise
                  {
                     hr++;                                                    //hr değişkeni (real time üzerindeki saat) "1" arttırılır
                     if(hr>=25)hr=0;                                          //hr değişkeni 24 değerinden büyük ise(saat 24 olamaz 23den sonra 00 olur) "0" yapılır
                     Q=donus;                                                 //Donus değişkeni Q değişkenine eşitlenir
                  }

               if(Q<donus)                                                    //Enkoder saat yönünün tersine dönüyor ise
                  {
                     hr--;                                                    //hr değişkeni (real time üzerindeki saat) "1" eksiltilir
                     if(hr>=25)hr=23;                                         //hr değişkeni "24"den büyük eşit ise "23" yapılır
                     Q=donus;                                                 //Donus değişkeni Q değişkenine eşitlenir
                  }
           
               if(toggle)                                                     //Toggle değişkeni "1" ise ekrana saat ve dakika yazılır
                  {
                     sprintf(Text,"%02d:%02d",hr,min);                        //Text pointerına saat ve dakika bilgileri decimal cinsinden yüklenir
                     ShowString(1,4,1,0);                                     //P10Panelin x=1,y=4 kısmında font1 ile Text stringi ekranda sabit olarak gösterilir
                  }
     
               if(!toggle)                                                    //Toggle değişkeni "0" ise ekrana "  " ve dakika yazılır
                  {
                     sprintf(Text,"  :%02d",min);                             //Text pointerına "  " ve dakika bilgileri yüklenir
                     ShowString(1,4,1,0);                                     //P10Panelin x=1,y=4 kısmında font1 ile Text stringi ekranda sabit olarak gösterilir
                  }

            break;                                                            //Case 1 için break
           
           
            case 2:                                                           //Ayar değişkeni "2" ise dakika ayarlamak için kullanılır

               if(Q>donus)                                                    //Enkoder saat yönünde dönüyor ise
                  {
                     min++;                                                   //min değişkeni (real time dakikası) "1" arttırılır
                     Q=donus;                                                 //Donus değişkeni Q değişkenine eşitlenir
                     if(min>=61)min=0;                                        //dakika değişkeni "60"dan büyük eşit ise dakika değişkenine "0" yüklenir
                  }

               if(Q<donus)                                                    //Enkoder değişkeni saat yönünün tersine dönüyör ise
                  {
                     min--;                                                   //Dakika değişkeni "1" eksiltilir
                     if(min>=61)min=59;                                       //Eğer dakika değişkeni "60"dan büyük ya da eşit ise dakika değişkenine "59" yükle
                     Q=donus;                                                 //Q değişkenini Donus değişkeniyle eşitle
                  }

               if(toggle)                                                     //Toggle değişkeni "1" ise ekrana saat ve dakika yazılır
                  {
                     sprintf(Text,"%02d:%02d",hr,min);                        //Text pointerına saat ve dakika bilgileri decimal cinsinden yüklenir
                     ShowString(1,4,1,0);                                     //P10Panelin x=1,y=4 kısmında font1 ile Text stringi ekranda sabit olarak gösterilir
                  }
     
               if(!toggle)                                                    //Toggle değişkeni "0" ise ekrana "  " ve saat yazılır
               {
                  sprintf(Text,"%02d:  ",hr);                                 //Text pointerına "  " ve saat bilgileri yüklenir
                  ShowString(1,4,1,0);                                        //P10Panelin x=1,y=4 kısmında font1 ile Text stringi ekranda sabit olarak gösterilir
               }
               
            break;

            case 3:                                                           //Ayar değişkeni "3" ise ekrana "OK!" yazmak için kullanılan case

               clear_display(0);                                              //P10Panel temizlenir
               yarim_saniye=0;                                                //Yarım saniye değişkeni sıfırlanır (ekranda ok yazısının 3sn boyunca kalması için gereklidir)
               while(yarim_saniye<3)                                          //eğer yarım saniye değişkeni "3"den küçük ise
               {
               sprintf(Text , "OK!");                                         //Text pointerına ok! yazısı yüklenir
               ShowString(7,2,2,0);                                           //P10Panelin x=7,y=2 kısmında font2 ile Text stringi ekranda sabit olarak gösterilir
               }
               s=0;                                                           //saniye değişkeni "0"lanır
               setTime(hr, min, s, am_pm, hr_format);                         //Ayarlanan bilgiler RTC(ds3231) üzerine yazılır
               //setDate(dy, dt, mt, yr);
               clear_display(0);                                              //P10Panel temizlenir
               ayar=4;                                                        //Menüden çıkış için ayar değişkenine "4" yüklenir
               
            break;

            case 4:                                                           //Ayarlardan çıkış case'i
               
               MenuCikis=0;                                                   //While(MenuCikis) kısmından kurtulabilmesi için MenuCikis "0" yapılır
               MenuNo=0;                                                      //MenuNo değişkeni "0" yapılır
               ayar=0;                                                        //Ayar değişkeni "0" yapılır
               Q=0;                                                           //Q değişkeni "0" yapılır
               donus=0;                                                       //Donus değişkeni "0" yapılır
               
            break;
         
         }     //Switch sonu
   
   }     //MenuCikis sonu
return;

}  //Saat_ayar_menusu sonu

/**********************************Alarm Ayar Menüsü*********************************/
void alarm_ayar_menusu()
{
   eepromdaki_degerleri_oku();                                                //Eepromdaki değerler okunması için çağrılan fonksiyon

   while(MenuCikis)                                                           //Alarm_ayar_menusunde kalması için oluşturulan sonsuz döngü
   {
      enkoder_oku();                                                          //Enkoder okuma fonksiyonu

      if(!input(encoder_switch))                                              //Enkoder switchine basıldı ise
         {
            ayar++;                                                           //Ayar değişkeni "1" arttırılır
            yarim_saniye=0;                                                   //Yarım saniye değişkeni "0"lanır
            while(yarim_saniye<2);                                            //Butonu çok hızlı okumaması için "1" sn süre beklenir
            if(ayar>4)ayar=0;                                                 //Ayar değişkeni "4"den büyük ise ayar değişkeni "0" yapılır
            Q=donus;                                                          //Q değişkeni donus değişkenine eşitlenir
            toggle=1;                                                         //Toggle değişkeni "1" yapılır
            sure_sayac=0;                                                     //sure sayaç değişkeni "0" yapılır
         }

      switch (ayar)                                                           //Ayar değişkenine göre hangi bloğa gireceği belirlenir
         {
            case 1:                                                           //Ayar = 1 ise ilgili alarm saatini ayarlamaya yarar

                if(Q>donus)                                                   //Eğer enkoder saat yönünde dönüyor ise
                  {
                     alarm_saatleri[MenuNo-2]++;                              //ilgili alarm saati değişkenini "1" arttır
                     if(alarm_saatleri[MenuNo-2]>=25)alarm_saatleri[MenuNo-2]=0;//eğer ilgili alarmsaati değişkeni "24"den büyük ya da eşit ise ilgili alarm saati değişkenini "0" yap
                     Q=donus;                                                 //Q değişkenini donus değişkeni ile eşitle
                  }
   
               if(Q<donus)                                                    //Eğer enkoder saat yönünün tersine dönüyor ise
                  {
                     alarm_saatleri[MenuNo-2]--;                              //ilgili alarm saati değişkenini "1" eksilt
                     if(alarm_saatleri[MenuNo-2]>=25)alarm_saatleri[MenuNo-2]=24;//eğer ilgili alarmsaati değişkeni "24"den büyük ya da eşit ise ilgili alarm saati değişkenini "0" yap
                     Q=donus;                                                 //Q değişkenini donus değişkeni ile eşitle
                  }
   
               if(toggle)                                                     //Eğer toggle değişkeni "1" ise ekrana ilgili alarm_saati ve dakikasını yazar
                  {
                     if(alarm_saatleri[MenuNo-2]>=25)alarm_saatleri[MenuNo-2]=24;//Eğer ilgili alarm saati default ayar ile geldi ise ilgili alarm_saati değişkenini "0" yap
                     if(alarm_dakikalari[MenuNo-2]>=61)alarm_dakikalari[MenuNo-2]=60;//Eğer ilgili alarm_dakikasi defaul ayar ile geldi ise ilgili alarm_dakikasi değişkenini "0" yap
                     
                     if((alarm_saatleri[MenuNo-2]>=24) && (alarm_dakikalari[MenuNo-2]>=60))
                        {
                           sprintf(Text,"--:--");      //Text pointerına "  " ve ilgili alarm_dakikalarını yükle
                           ShowString(1,4,1,0);                                     //Ekrana Text pointerını x=1,y=4 konumundan itibaren font1 ile yaz
                        }
                        else if((alarm_dakikalari[MenuNo-2]<=59) && (alarm_saatleri[MenuNo-2]>=24))
                        {
                           sprintf(Text,"--:%02d",alarm_dakikalari[MenuNo-2]);      //Text pointerına "  " ve ilgili alarm_dakikalarını yükle
                           ShowString(1,4,1,0);                                     //Ekrana Text pointerını x=1,y=4 konumundan itibaren font1 ile yaz
                        }
                        else if((alarm_saatleri[MenuNo-2]<=23) && (alarm_dakikalari[MenuNo-2]>=60))
                        {
                           sprintf(Text,"%02d:--",alarm_saatleri[MenuNo-2]);      //Text pointerına "  " ve ilgili alarm_dakikalarını yükle
                           ShowString(1,4,1,0); 
                        }
                        else if((alarm_saatleri[MenuNo-2]<=23) && (alarm_dakikalari[MenuNo-2]<=60))
                        {
                           sprintf(Text,"%02d:%02d",alarm_saatleri[MenuNo-2],alarm_dakikalari[MenuNo-2]);
                           ShowString(1,4,1,0);
                        }
                  }
     
               if(!toggle)                                                    //Eğer toggle değişkeni "1" ise ekrana "  " ve ilgili alarm_dakikasını yazar
                  {
                     if(alarm_saatleri[MenuNo-2]>=25)alarm_saatleri[MenuNo-2]=24;//Eğer ilgili alarm saati default ayar ile geldi ise ilgili alarm_saati değişkenini "0" yap
                     
                     if(alarm_dakikalari[MenuNo-2]>=60)
                        {
                           alarm_dakikalari[MenuNo-2]=60;
                           sprintf(Text,"  :--");                             //Text pointerına "  " ve ilgili alarm_dakikalarını yükle
                           ShowString(1,4,1,0); 
                        }
                        else
                           {
                              sprintf(Text,"  :%02d",alarm_dakikalari[MenuNo-2]);                             //Text pointerına "  " ve ilgili alarm_dakikalarını yükle
                              ShowString(1,4,1,0); 
                           }
                  }
                 
               break;

            case 2:                                                           //Ayar = 2 ise ilgili alarm dakikasını ayarlamaya yarar
 
                if(Q>donus)                                                   //Eğer enkoder saat yönünün tersine dönüyor ise
                  {
                     alarm_dakikalari[MenuNo-2]++;                            //ilgili alarm dakikası değişkenini "1" arttır
                     if(alarm_dakikalari[MenuNo-2]>=61)alarm_dakikalari[MenuNo-2]=0;//Eğer ilgili alarmdakikasi değişkeni "60"den büyük ya da eşit ise ilgili alarm saati değişkenini "0" yap
                     Q=donus;                                                 //Q değişkenini donus değişkeni ile eşitle
                  }
   
               if(Q<donus)                                                    //Eğer enkoder saat yönünün tersine dönüyor ise
                  {
                     alarm_dakikalari[MenuNo-2]--;                            //ilgili alarm dakikası değişkenini "1" eksilt
                     if(alarm_dakikalari[MenuNo-2]>=61)alarm_dakikalari[MenuNo-2]=60;//Eğer ilgili alarmdakikasi değişkeni "60"den büyük ya da eşit ise ilgili alarm saati değişkenini "59" yap
                     Q=donus;                                                 //Q değişkenini donus değişkeni ile eşitle
                  }
   
               if(toggle)                                                     //Eğer toggle değişkeni "1" ise ekrana ilgili alarm_saati ve dakikasını yazar
                  {
                     if((alarm_dakikalari[MenuNo-2]>=60) && (alarm_saatleri[MenuNo-2]<24))
                     {
                     sprintf(Text,"%02d:--",alarm_saatleri[MenuNo-2]);        //Text pointerına ilgili alarm_saat ve dakikasını yükle
                     ShowString(1,4,1,0);                                     //Ekrana Text pointerını x=1,y=4 konumundan itibaren font1 ile yaz
                     }
                     else if((alarm_dakikalari[MenuNo-2]<60) && (alarm_saatleri[MenuNo-2]<24))
                     {
                     sprintf(Text,"%02d:%02d",alarm_saatleri[MenuNo-2],alarm_dakikalari[MenuNo-2]);        //Text pointerına ilgili alarm_saat ve dakikasını yükle
                     ShowString(1,4,1,0); 
                     }
                     else if((alarm_dakikalari[MenuNo-2]<60) && (alarm_saatleri[MenuNo-2]>=24))
                     {
                     sprintf(Text,"--:%02d",alarm_dakikalari[MenuNo-2]);        //Text pointerına ilgili alarm_saat ve dakikasını yükle
                     ShowString(1,4,1,0); 
                     }
                     else if((alarm_dakikalari[MenuNo-2]>=60) && (alarm_saatleri[MenuNo-2]>=24))
                     {
                        sprintf(Text,"--:--");
                        ShowString(1,4,1,0);
                     }
                  }
     
               if(!toggle)                                                    //Eğer toggle değişkeni "1" ise ekrana "  " ve ilgili alarm_dakikasını yazar
               {
                  if(alarm_saatleri[MenuNo-2]<24)
                  {
                     sprintf(Text,"%02d:  ",alarm_saatleri[MenuNo-2]);           //Text pointerına "  " ve ilgili alarm_saatlerini yükle
                     ShowString(1,4,1,0);                                        //Ekrana Text pointerını x=1,y=4 konumundan itibaren font1 ile yaz
                  }
                  else
                  {
                     sprintf(Text,"--:  ");           //Text pointerına "  " ve ilgili alarm_saatlerini yükle
                     ShowString(1,4,1,0);                                        //Ekrana Text pointerını x=1,y=4 konumundan itibaren font1 ile yaz
                  }
               }

            break;

            case 3:                                                           //Ayar = 3 ise ekrana "OK!" yazma işi yapılır

               clear_display(0);                                              //P10Panel temizlenir
               yarim_saniye=0;                                                //Yarım saniye değişkenine "0" yüklenir
               while(yarim_saniye<3)                                          //Ekranda ok yazısının 1,5sn beklemesi için kullanılan döngü
               {
               sprintf(Text , "OK!");                                         //Text pointerına ok! yüklenir
               ShowString(7,2,2,0);                                           //Ekrana Text pointerını x=7,y=2 komundan itibaren font2 ile yaz
               }
               eeproma_degerleri_yaz();                                       //Ayarlanan alarm_saatleri ve dakikaları eeproma yazılır
               clear_display(0);                                              //P10Panel temizlenir
               ayar=4;                                                        //Menüden çıkmak için ayar değişkenine "4" yüklenir
               
            break;

            case 4:                                                           //Menüden çıkış case'i
               
               MenuCikis=0;                                                   //While(MenuCikis) döngüsünü bozmak için MenuCikis'a "0" yüklenir
               ayar=0;                                                        //Ayar değişkenine "0" yüklenir
               MenuNo=0;                                                      //MenüNo değişkenine "0" yüklenir
               Q=0;                                                           //Q değişkenine "0" yüklenir
               donus=0;                                                       //Dönüş değişkenine "0" yüklenir
               
            break;
         
         }     //Switch sonu           

   }     //MenuCikis sonu

}     //Alarm_ayarlari sonu

/**********************************Alarm Sure Ayar Menüsü*********************************/
void alarm_sure_menusu()
{
   alarm_suresi = read_eeprom(30);                                            //Eepromdaki değerler okunur

   while(MenuCikis)                                                           //Alarm_süre_menüsünde döngü oluşturulur
   {
      enkoder_oku();                                                          //Rotary enkoder okuma fonksiyonu

      if(!input(encoder_switch))                                              //Enkoder switchine basıldı ise
         {
            ayar++;                                                           //Ayar değişkeni "1" arttırılır
            yarim_saniye=0;                                                   //yarım saniye değişkenine "0" yüklenir
            while(yarim_saniye<2);                                            //Buton debounce süresi ya da hemen okuma yapmamak için "1" sn beklenir
            if(ayar>2)ayar=0;                                                 //Eğer ayar değişkeni "3"den büyük ya da eşit ise ayar değişkenine "0" yüklenir
            Q=donus;                                                          //Q değişkeni ile Donus değişkeni eşitlenir
            toggle=1;                                                         //toggle değişkenine "1" yüklenir
            sure_sayac=0;                                                     //süre_sayac değişkenine "0" yüklenir
         }

      switch (ayar)                                                           //Ayarın değerine göre işlem yaptıran switch
         {
            case 1:                                                           //Eğer ayar "1" ise

                if(Q>donus)                                                   //Enkoder saat yönünde dönmüş ise
                  {
                     alarm_suresi++;                                          //Alarm_süresi değişkenini "1" arttır
                     if(alarm_suresi>=60)alarm_suresi=1;                      //Eğer alarm_süresi değişkeni "60"dan büyük ya da eşit ise alarm_süresi değişkenine "1" yükle
                     Q=donus;                                                 //Q değişkeni ile donus değişkenini eşitle
                  }
   
               if(Q<donus)                                                    //Enkoder saat yönünün tersine dönmüş ise
                  {
                     alarm_suresi--;                                          //Alarm_süresi değişkenini "1" eksilt
                     if(alarm_suresi<=0)alarm_suresi=59;                      //eğer alarm_süresi değişkeni "0"dan küçük ya da eşit ise alarm_süresi değişkenine "59" yükle
                     Q=donus;                                                 //Q değişkeni ile donus değişkenini eşitle
                  }
   
               if(toggle)                                                     //Eğer toggle "1" ise
                  {
                     sprintf(Text,"%s  %2dsn" , Menu[MenuNo] , alarm_suresi); //Text pointerına Menu[MenuNo] stringini ve "sn_alarm_süresini" yükle
                     ShowString(1,0,1,0);                                     //Ekrana Text pointerını x=1,y=0 komundan itibaren font1 ile yaz
                  }
     
               if(!toggle)                                                    //Eğer toggle "0" ise
                  {
                     sprintf(Text,"%s    sn" , Menu[MenuNo]);                 //Text pointerına Menu[MenuNo] stringini ve "  sn" yükle
                     ShowString(1,0,1,0);                                     //Ekrana Text pointerını x=1,y=0 komundan itibaren font1 ile yaz
                  }
               break;

            case 2:                                                           //Eğer ayar değişkeni "2" ise (menüden çıkma bloğu)

               clear_display(0);                                              //P10Paneli temizle
               yarim_saniye=0;                                                //yarım saniye değişkenine "0" yükle
               while(yarim_saniye<3)                                          //Ekrana 1,5 sn boyunca ok! yazdırmak için kurulan döngü
               {
               sprintf(Text , "OK!");                                         //Text pointerına "OK!" yükle
               ShowString(7,2,2,0);                                           //Ekrana Text pinterını x=7,y=2 konumundan itibaren font2 ile yaz
               }
               write_eeprom(30,alarm_suresi);                                 //Eeproma alarm_süresi değişkenini "30." adrese yaz
               delay_us(15);
               clear_display(0);                                              //P10Paneli temizle
               MenuCikis=0;                                                   //MenuCıkıs değişkenine "0" yüklenir
               ayar=0;                                                        //Ayar değişkenine "0" yüklenir
               MenuNo=0;                                                      //MenuNo değişkenine "0" yüklenir
               Q=0;                                                           //Q değişkenine "0" yüklenir
               donus=0;                                                       //Donus değişkenine "0" yüklenir
               
            break;
         
         }     //Switch sonu           

   }     //MenuCikis sonu

}

/**********************************Eeprom Değer Okuma Menüsü*********************************/

void eepromdaki_degerleri_oku()
{
   alarm_suresi = read_eeprom(30);
   
   for(int r=0;r<9;r++)
      {
         alarm_saatleri[r] = read_eeprom (r);
         delay_us(10);
         alarm_dakikalari[r] = read_eeprom(r+10);
         delay_us(10);
      }
}

/**********************************Eeprom Değer Yazma Menüsü*********************************/

void eeproma_degerleri_yaz()
{

   for(int r=0;r<9;r++)                                                       //Alarm_saatlerini ve Dakikalarını eeproma yazmak için kurulan döngü
      {
         write_eeprom(r , alarm_saatleri[r]);                                 //Eeproma alarm_saatleri yazılır
         delay_us(10);
         write_eeprom(r+10 , alarm_dakikalari[r]);                            //Eeproma alarm_dakikalari yazılır
         delay_us(10);
      }
   return;
}



/**********************************Enkoder Okuma Fonksiyonu*********************************/

void enkoder_oku()                                                            //Enkoder okuma fonksiyonu
{

Aux1 = Enc1;                                                                  //Enc1 değişkeni Aux1'in içerisine kopyalanır
Enc1 = input_a() & 3;                                                         //PortA girişleri okunur ve "3" rakamı ile AND işlemine sokularak Enc1 değişkenine aktarılır
//Q=donus;                                                                    //Donus değişkeni Q değişkenine kopyalanır
if ((Aux1 == 2) && (Enc1 == 3))    { donus++;}                                //Eğer enkoder'in dönüş yönü saat yönünde ise donus değişkeni "1" arttırılır
if ((Aux1 == 3) && (Enc1 == 2))    { donus--;}                                //Eğer enkoder'in dönüş yönü saat yönünün tersi ise donus değişkeni "1" eksiltilir
if (donus >= 9999) donus=999;


If (Q!=donus)                                                                 //Enkoder konumu eski pozisyonundan farklı ise
{
   MenuCikis=1;                                                               //Menüye giriş için MenuCikis değişkenine "1" yüklenir
   clear_display(0);                                                          //P10Panel temizlenir
   delay_us(50);
}

}

/**********************************P10 Panele veri basma bloğu*********************************/
void write_data(unsigned int8 row_adr)                                        //P10Display veri yazma bloğu
{
   int8 i=0,j=0;
   int8 k=3;
   while(k!=255)                                   
   {j=15-k;                                       
     for (i=0;i<4;i++)                             
     {
       spi_write(display_ram[j][row_adr]);
       j-=4;
     }
     k--;
   }
   output_high(LATCH);
   delay_cycles(2);
   output_low(LATCH);
}

ds3231.c
#include "DS3231.h"                                                       
                                                                 
                                                         
unsigned char bcd_to_decimal(unsigned char d)               
{                                                                                         
         return ((d & 0x0F) + (((d & 0xF0) >> 4) * 10));
}                               
                                                             

unsigned char decimal_to_bcd(unsigned char d)
{
         return (((d / 10) << 4) & 0xF0) | ((d % 10) & 0x0F);
}                                                   
                                       
                 
unsigned char DS3231_Read(unsigned char address)
{                                     
         unsigned char value = 0;
         I2C_start();                                                     
         I2C_write(DS3231_Write_addr);     
         I2C_write(address);           
         I2C_start();                 
         I2C_write(DS3231_Read_addr);   
         value = I2C_read(0);                     
         I2C_stop();                 
         return value;
}                     


void DS3231_Write(unsigned char address, unsigned char value)   

         I2C_start();                 
         I2C_write(DS3231_Write_addr);
         I2C_write(address);
         I2C_write(value);   
         I2C_stop();



void DS3231_init()
{                                   
         DS3231_Write(controlREG, 0x00); 
         DS3231_Write(statusREG, 0x08);
}                       


void getTime(unsigned char &p3, unsigned char &p2, unsigned char &p1, short &p0, short hour_format)
{                       
         unsigned char tmp = 0;
         p1 = DS3231_Read(secondREG);
         p1 = bcd_to_decimal(p1);
         p2 = DS3231_Read(minuteREG);
         p2 = bcd_to_decimal(p2);
         switch(hour_format)
         {                                             
                  case 1:         
                  {         
                           tmp = DS3231_Read(hourREG);
                           tmp &= 0x20;
                           p0 = (short)(tmp >> 5);             
                           p3 = (0x1F & DS3231_Read(hourREG));
                           p3 = bcd_to_decimal(p3);                           
                           break;     
                  }   
                  default:
                  {
                           p3 = (0x3F & DS3231_Read(hourREG));           
                           p3 = bcd_to_decimal(p3);   
                           break;     
                  }
         } 
}                                 
                                                     
                               
void getDate(unsigned char &p4, unsigned char &p3, unsigned char &p2, unsigned char &p1)
{
         p1 = DS3231_Read(yearREG);
         p1 = bcd_to_decimal(p1);                 
         p2 = (0x1F & DS3231_Read(monthREG));
         p2 = bcd_to_decimal(p2);                               
         p3 = (0x3F & DS3231_Read(dateREG));
         p3 = bcd_to_decimal(p3);   
         p4 = (0x07 & DS3231_Read(dayREG));   
         p4 = bcd_to_decimal(p4);                   
}

                                                   
void setTime(unsigned char hSet, unsigned char mSet, unsigned char sSet, short am_pm_state, short hour_format) 
{                                                                                                             
         unsigned char tmp = 0;
         DS3231_Write(secondREG, (decimal_to_bcd(sSet)));
         DS3231_Write(minuteREG, (decimal_to_bcd(mSet)));       
         switch(hour_format)
         {
                  case 1:
                  {       
                           switch(am_pm_state)
                           {
                                    case 1:
                                    {           
                                             tmp = 0x60;
                                             break;
                                    }
                                    default:
                                    {   
                                             tmp = 0x40;
                                             break;
                                    }
                           }                           
                           DS3231_Write(hourREG, ((tmp | (0x1F & (decimal_to_bcd(hSet))))));                   
                           break;
                  }                                             
                 
                  default:
                  {
                           DS3231_Write(hourREG, (0x3F & (decimal_to_bcd(hSet))));
                           break;
                  } 
         }   
}                                                 

                                   
void setDate(unsigned char daySet, unsigned char dateSet, unsigned char monthSet, unsigned char yearSet)
{         
         DS3231_Write(dayREG, (decimal_to_bcd(daySet)));           
         DS3231_Write(dateREG, (decimal_to_bcd(dateSet))); 
         DS3231_Write(monthREG, (decimal_to_bcd(monthSet)));
         DS3231_Write(yearREG, (decimal_to_bcd(yearSet)));   
}

                               
float getTemp()                                                 
{
         register float t = 0.0;
         unsigned char lowByte = 0;
         signed char highByte = 0;
         lowByte = DS3231_Read(tempLSBREG);
         highByte = DS3231_Read(tempMSBREG); 
         lowByte >>= 6;                 
         lowByte &= 0x03;     
         t = ((float)lowByte); 
         t *= 0.25;     
         t += highByte;         
         return t;
                                     
}

ds3231.h
#define DS3231_Address              0x68           
                                                 
#define DS3231_Read_addr            ((DS3231_Address << 1) | 0x01)
#define DS3231_Write_addr           ((DS3231_Address << 1) & 0xFE)
                                           
#define secondREG                   0x00
#define minuteREG                   0x01
#define hourREG                     0x02
#define dayREG                      0x03
#define dateREG                     0x04                             
#define monthREG                    0x05                           
#define yearREG                     0x06                   
#define alarm1secREG                0x07       
#define alarm1minREG                0x08
#define alarm1hrREG                 0x09           
#define alarm1dateREG               0x0A 
#define alarm2minREG                0x0B   
#define alarm2hrREG                 0x0C
#define alarm2dateREG               0x0D
#define controlREG                  0x0E
#define statusREG                   0x0F
#define ageoffsetREG                0x10
#define tempMSBREG                  0x11
#define tempLSBREG                  0x12
                                 
#define _24_hour_format             0
#define _12_hour_format             1
#define am                          0
#define pm                          1

                                                               
unsigned char bcd_to_decimal(unsigned char d);
unsigned char decimal_to_bcd(unsigned char d);                     
unsigned char DS3231_Read(unsigned char address);
void DS3231_Write(unsigned char address, unsigned char value);
void DS3231_init(); 
void getTime(unsigned char &p3, unsigned char &p2, unsigned char &p1, short &p0, short hour_format); 
void getDate(unsigned char &p4, unsigned char &p3, unsigned char &p2, unsigned char &p1);   
void setTime(unsigned char hSet, unsigned char mSet, unsigned char sSet, short am_pm_state, short hour_format);
void setDate(unsigned char daySet, unsigned char dateSet, unsigned char monthSet, unsigned char yearSet);   
float getTemp();

P10_Panel_Driver.c
/*******************************************************************************
* File Name          : P10_Panel_Driver.c
* Author             : Ferhat YOL
* Version            : V1.0
* Date               : 13/07/2013
* Description        : P10 Panel kütüphanesidir.
*                    :
*******************************************************************************/                     

#include <font1.h>
#include <font2.h>
#include <font3.h>
#include <font4.h>

#define PinA     pin_d1
#define PinB     pin_d0
#define PinOE    pin_c2                    //OE=0 Display OFF, OE=1 Display ON
#define LATCH    pin_c6                    //
//      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
//
#define Font1H   8
#define Font2H   12
#define Font3H   14
#define Font4H   16
#define Panel     1                        //P10 Panel Sayısı
#define RIGHT     0                        //
#define LEFT      1                        //
#define WIDTH     31
#define HEIGHT    15

unsigned int8 display_ram[16][4];          //Bu Bölge Display Ram Alanını belirtir
unsigned char Text[100]="";
unsigned int8 imageBuffer[64];

int1 LineScroll       (unsigned int Line, int1 Zerobit);
void clear_display    (int1 fill);
void invert_screen    (void);
void Set_Brightness   (int8 value);
void SetTextFont      (unsigned int Font);
void PutPixel         (unsigned int Xpos, unsigned int Ypos, int1 fill);
int1 GetPixel         (unsigned int Xpos, unsigned int Ypos);
void Line             (unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2, int1 fill);
void Rectangle        (unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2, int1 fill);
void Circle           (unsigned int x, unsigned int y, unsigned int size, int1 fill);
void Bargraph         (unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2, int1 hor, unsigned int value);
void ShowString       (unsigned int x, unsigned int y, unsigned int size, int1 fill);
void TextToLeftScroll (unsigned int Line, unsigned int Size, unsigned int speed, int1 fill);
void Writeimage       (void);

/***********************Türkçe KArakterler burada ayrılır**********************/
int CharAdres(char c){
  int adr=0;
  switch(c)
  {
  case 'Ü':adr=96;break;
  case 'Ö':adr=97;break;
  case 'Ş':adr=98;break;
  default:
    adr=c-32;
  break;
  }
  return adr;
}

/*******************************************************************************
*   Satır Kaydırma Fonksiyonu                                                  *
*   Parameter:    Line, ZeroBit                                                *
*   Return:    OwerFlow                                                        *
*******************************************************************************/
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*4)][y1]/128)&0x01;
  Tam=display_ram[(y2*4)][y1];
  Tam=Tam<<8;
  Tam=Tam+display_ram[(y2*4)+1][y1];
  Tam=Tam<<8;
  Tam=Tam+display_ram[(y2*4)+2][y1];
  Tam=Tam<<8;
  Tam=Tam+display_ram[(y2*4)+3][y1];
 
  Tam=Tam<<1;
  Tam=Tam+ZeroBit;
 
  display_ram[(y2*4)  ][y1]=(int32)(Tam>>24)&0xFF;
  display_ram[(y2*4)+1][y1]=(int32)(Tam>>16)&0xFF;
  display_ram[(y2*4)+2][y1]=(int32)(Tam>>8)&0xFF;
  display_ram[(y2*4)+3][y1]=(int32)(Tam&0xFF);
 
  Return OwerFlow;
}
/*******************************************************************************
*   Text Basma Fonksiyonu  Font1                                               *
*   Parameter:    x, y, Fill                                                   *
*   Return:                                                                    *
*******************************************************************************/
void DrawCharFont1(unsigned x, unsigned y, int1 fill){
unsigned int a=0,b=0,i=0;
unsigned int cdata=0;
unsigned int clm=x,row=y;
     
     While (Text[i]!='\0')
     {
      if(clm+5>WIDTH)  //Satır sonuna gelindimi Bir Alt Satıra Geç
      {
        clm=0;         
        row=row+8;
        if(row+8>HEIGHT+1) break;
      }
     
      for(b=0;b<5;b++)
      {
       cdata=Font_5x7[Text[i]-32][b];
       for(a=0;a<8;a++)
       {
          PutPixel(clm+b,row+a,(fill-(cdata>>a) & 0x01));
       }
      }
     
      i++;
      clm=clm+6;
     } 
}
/*******************************************************************************
*   Text Basma Fonksiyonu  Font2                                               *
*   Parameter:    x, y, Fill                                                   *
*   Return:                                                                    *
*******************************************************************************/
void DrawCharFont2(unsigned int x, unsigned int y, int1 fill){
unsigned int a=0,b=0,i=0;
unsigned int cdata=0;
unsigned int clm=x,row=y;

  while(Text[i]!='\0')
  { 
      if(clm+8>WIDTH)  //Satır sonuna gelindimi Bir Alt Satıra Geç
      {
        clm=0;         
        row=row+12;
        if(row+12>HEIGHT+1) break;
      }
     
       for(b=0;b<16;b=b+2)
       {
         cdata=Font_8x12[Text[i]-32][b];
         for(a=0;a<8;a++)
         {
           PutPixel(clm+(b/2),row+a,(fill-(cdata>>a) & 0x01));
         }
         cdata=Font_8x12[Text[i]-32][b+1];
         for(a=0;a<4;a++)
         {
           PutPixel(clm+(b/2),row+8+a,(fill-(cdata>>a) & 0x01));
         }
       }
     clm=clm+8;
     i++;
  }
}
/*******************************************************************************
*   Text Basma Fonksiyonu  Font3                                               *
*   Parameter:    x, y, Fill                                                   *
*   Return:                                                                    *
*******************************************************************************/
void DrawCharFont3(unsigned int x, unsigned int y, int1 fill){
unsigned int a=0,b=0,i=0;
unsigned int cdata=0;
unsigned int clm=x,row=y;

  while(Text[i]!='\0')
  { 
      if(clm+12>WIDTH)  //Satır sonuna gelindimi Bir Alt Satıra Geç
      {
        clm=0;         
        row=row+14;
        if(row+14>HEIGHT+1) break;
      }
     
       for(b=0;b<24;b=b+2)
       {
         cdata=Font_12x14[Text[i]-32][b];
         for(a=0;a<8;a++)
         {
           PutPixel(clm+(b/2),row+a,(fill-(cdata>>a) & 0x01));
         }
         cdata=Font_12x14[Text[i]-32][b+1];
         for(a=0;a<6;a++)
         {
           PutPixel(clm+(b/2),row+8+a,(fill-(cdata>>a) & 0x01));
         }
       }
     clm=clm+12;
     i++;
  }
}
/*******************************************************************************
*   Text Basma Fonksiyonu  Font4                                               *
*   Parameter:    x, y, Fill                                                   *
*   Return:                                                                    *
*******************************************************************************/
void DrawCharFont4(unsigned int x, unsigned int y, int1 fill){
unsigned int a=0,b=0,i=0;
unsigned int cdata=0;
unsigned int cadr=0;
unsigned int clm=x,row=y;

  while(Text[i]!='\0')
  { 
       if(clm+12>WIDTH)  //Satır sonuna gelindimi Bir Alt Satıra Geç
       {
         clm=0;         
         row=row+16;
         if(row+16>HEIGHT+1) break;
       }
       
       cadr=CharAdres(Text[i]);
     
       for(b=0;b<24;b=b+2)
       {
         cdata=Font_12x16[cadr][b];
         for(a=0;a<8;a++)
         {
           PutPixel(clm+(b/2),row+a,(fill-(cdata>>a) & 0x01));
         }
         cdata=Font_12x16[cadr][b+1];
         for(a=0;a<8;a++)
         {
           PutPixel(clm+(b/2),row+8+a,(fill-(cdata>>a) & 0x01));
         }
       }
     clm=clm+12;
     i++;
  }
}
/*******************************************************************************
*   Text Kaydırma Fonksiyonu  Font1                                            *
*   Parameter:    Line, Speed, Fill                                            *
*   Return:                                                                    *
*******************************************************************************/
void ScrollTextFont1 (unsigned int Line, unsigned int speed,int1 fill){
  unsigned int a=0,b=0,i=0;
  unsigned int cdata=0;
  unsigned int16 delay=speed*20;
  int1 ZeroBit=0;
 
  While(Text[i]!='\0')
  {
    if(Line+Font1H-1>HEIGHT)Break;
    for(b=0;b<5;b++)
    {
      cdata=Font_5x7[Text[i]-32][b];
      for (a=0;a<8;a++)
      {
        ZeroBit=fill-(cdata>>a) & 0x01;
        LineScroll(Line+a,ZeroBit);
      }
      delay_Ms(210-delay);
    }
    for (a=0;a<8;a++)
    {
      LineScroll(Line+a,0);
    }
    delay_Ms(210-delay);
    i++;
  }
}
/*******************************************************************************
*   Text Kaydırma Fonksiyonu  Font2                                            *
*   Parameter:    Line, Speed, Fill                                            *
*   Return:                                                                    *
*******************************************************************************/
void ScrollTextFont2(unsigned int Line, unsigned int Speed,int1 fill){
  unsigned int a=0,b=0,i=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=0;a<8;a++)
       {
         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+8+a,ZeroBit);
       }
       for(sayac=0;sayac<210-delay;sayac++)
       {
         delay_ms(1);
       }
    }
    i++;
  }
}
/*******************************************************************************
*   Text Kaydırma Fonksiyonu  Font3                                            *
*   Parameter:    Line, Speed, Fill                                            *
*   Return:                                                                    *
*******************************************************************************/
void ScrollTextFont3(unsigned int Line, unsigned int Speed,int1 fill){
  unsigned int a=0,b=0,i=0;
  unsigned int cdata=0;
  unsigned int16 delay=speed*20;
  unsigned int16 sayac=0;

 
  int1 ZeroBit=0;
 
  while(Text[i]!='\0')
  {
    if(Line+Font3H-1>HEIGHT)Break;
    for(b=0;b<24;b=b+2)
    {
       cdata=Font_12x14[Text[i]-32][b];
       for(a=0;a<8;a++)
       {
         ZeroBit=fill-(cdata>>a) & 0x01;
         LineScroll(Line+a,ZeroBit);
       } 
       cdata=Font_12x14[Text[i]-32][b+1];
       for(a=0;a<6;a++)
       {
         ZeroBit=fill-(cdata>>a) & 0x01;
         LineScroll(Line+8+a,ZeroBit);
       }
       for(sayac=0;sayac<210-delay;sayac++)
       {
         delay_ms(1);
       }
    }
    i++;
  }
}
/*******************************************************************************
*   Text Kaydırma Fonksiyonu  Font4                                            *
*   Parameter:    Line, Speed, Fill                                            *
*   Return:                                                                    *
*******************************************************************************/
void ScrollTextFont4(unsigned int Line, unsigned int Speed,int1 fill){
  unsigned int a=0,b=0,i=0;
  unsigned int cdata=0,cadr=0;;
  unsigned int16 delay=speed*20;
  unsigned int16 sayac=0;
  int1 ZeroBit=0;
 
  while(Text[i]!='\0')
  {
    if(Line+Font4H-1>HEIGHT)Break;
   
    cadr=CharAdres(Text[i]);
   
    for(b=0;b<24;b=b+2)
    {
       cdata=Font_12x16[cadr][b];
       for(a=0;a<8;a++)
       {
         ZeroBit=fill-(cdata>>a) & 0x01;
         LineScroll(a,ZeroBit);
       }   
       cdata=Font_12x16[cadr][b+1];
       for(a=0;a<8;a++)
       {
         ZeroBit=fill-(cdata>>a) & 0x01;
         LineScroll(8+a,ZeroBit);
       }
       
       for(sayac=0;sayac<210-delay;sayac++)
       {
         delay_ms(1);
       }
    }
    i++;
  }
}
/*******************************************************************************
*   Ekran Temizleme Fonksiyonu                                                 *
*   Parameter:    fill                                                         *
*   Return:                                                                    *
*******************************************************************************/
void clear_display(int1 fill){
int8 i=0,j=0,fdata=0;
if (fill){
  fdata=0x00;
}else{
  fdata=0xFF;
}
  for (i=0;i<4;i++)
  {
    for (j=0;j<16;j++)
    {
      display_ram[j][i]=fdata;
    }
  }
}
/*******************************************************************************
*   Ekran Tersleme Fonksiyonu                                                  *
*   Parameter:                                                                 *
*   Return:                                                                    *
*******************************************************************************/
void invert_screen(void){
 int8 i=0,j=0;
 
 for(i=0;i<4;i++)
 {
   for(j=0;j<16;j++)
   {
     display_ram[j][i] =~ display_ram[j][i];  //Önbellekteki değer değillenip geri yazılıyor     
   }
 }
}
/*******************************************************************************
*   Parlaklık Ayar Fonksiyonu                                                  *
*   Parameter:    value (0-100)                                                *
*   Return:                                                                    *
*******************************************************************************/
void Set_Brightness(int8 value){
   set_pwm1_duty((int16)value*10);
}
/*******************************************************************************
*   Pixel Fonksiyonu                                                           *
*   Parameter:    Xpos, Ypos, fill                                             *
*   Return:                                                                    *
*******************************************************************************/
void PutPixel(unsigned int Xpos,unsigned int Ypos, int1 fill)
{
  int8 y1=0,x1=0;
  int8 y2=0,x2=0;
  int8 temp=0;
           
  y1 = Ypos%4;
  y2 = Ypos/4;
  x1 = Xpos%8;   
  x2 = Xpos/8;
 
  if(fill)  //Nokta Koy
  {
    temp=display_ram[(y2*4)+x2][y1]; //Ram'deki değer ön belleğe alınıyor.
    display_ram[(y2*4)+x2][y1] = (temp & (255-(128>>x1))); //x'inci bit 0 yapılır
  }
  else     //Noktayı Sil
  {
    temp=display_ram[(y2*4)+x2][y1]; //Ram'deki değer ön belleğe alınıyor.
    display_ram[(y2*4)+x2][y1] = (temp | (128>>x1)); //x'inci Bit 1 yapılır   
  }
 
}
/*******************************************************************************
*   Pixel Okuma Fonksiyonu                                                     *
*   Parameter:    Xpos, Ypos                                                   *
*   Return: value                                                              *
*******************************************************************************/
int1 GetPixel(unsigned int Xpos,unsigned int Ypos){
  int8 y1=0,x1=0;
  int8 y2=0,x2=0;
  int8 temp=0;
  int1 value=0;
 
  y1 = Ypos%4;
  y2 = Ypos/4;
  x1 = Xpos%8;   
  x2 = Xpos/8;
 
  temp=display_ram[(y2*4)+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;
}
/*******************************************************************************
*   Çizgi Çizme Fonksiyonu                                                     *
*   Parameter:    x1, x2, y1, y2, fill                                         *
*   Return:                                                                    *
*******************************************************************************/
void Line(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2, int1 fill)
{
  signed int16 addx=1, addy=1, P;
  signed int16 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++)
      {
         PutPixel(x1, y1, fill);

         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)
      {
         PutPixel(x1, y1, fill);

         if(P < 0)
         {
            P  += dx;
            y1 += addy;
         }
         else
         {
            P  += diff;
            x1 += addx;
            y1 += addy;
         }
      }
   }   
}
/*******************************************************************************
*   Dikdörtgen Çizme Fonksiyonu                                                *
*   Parameter:    x1, x2, y1, y2, fill                                         *
*   Return:                                                                    *
*******************************************************************************/
void Rectangle(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2, int1 fill)
{
   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)
         {
            PutPixel(xmin, i, 1);
         }
      }
   }
   else
   {
      Line(x1, y1, x2, y1, 1);
      Line(x2, y1, x2, y2, 1);
      Line(x2, y2, x1, y2, 1);
      Line(x1, y2, x1, y1, 1);
   }     
}
/*******************************************************************************
*   Çember Cizme Fonksiyonu                                                    *
*   Parameter:    x, y, Size, fill                                             *
*   Return:                                                                    *
*******************************************************************************/
void Circle(unsigned int x, unsigned int y, unsigned int size, int1 fill)
{
   signed int a,b,P;
   a=0;
   b=size;
   P=1-size;
   
   do
   {
      if(fill)
      {
         Line(x-a, y+b, x+a, y+b,1);
         Line(x-a, y-b, x+a, y-b,1);
         Line(x-b, y+a, x+b, y+a,1);
         Line(x-b, y-a, x+b, y-a,1);
      }
      else
      {
         PutPixel(a+x, b+y,1);
         PutPixel(b+x, a+y,1);
         PutPixel(x-a, b+y,1);
         PutPixel(x-b, a+y,1);
         PutPixel(b+x, y-a,1);
         PutPixel(a+x, y-b,1);
         PutPixel(x-a, y-b,1);
         PutPixel(x-b, y-a,1);
      }
     
      if(P < 0)
      P+= 3 + 2*a++;
    else
      P+= 5 + 2*(a++ - b--);
     
  }while(a<=b);

}
/*******************************************************************************
*   Bargraph Çizme Fonksiyonu                                                  *
*   Parameter:    x1, y1, x2, y2, Mode, Value                                  *
*   Return:                                                                    *
*******************************************************************************/
void Bargraph (unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2, int1 hor, unsigned int value,)
{
  unsigned int w=0;   
  unsigned int h=0;
  unsigned int a=0,b=0;
  unsigned int16 barval=0;
 
  if(x1>x2) w=x1-x2;
  if(x1<x2) w=x2-x1; 
  if(y1>y2) h=y1-y2;
  if(y1<y2) h=y2-y1;
 
  if(value>100)value=100;
 
  if(hor) //Bar Dikey Olarak Oluşturulacak
  {
    barval=((int16)value*h)/100;
 
    for (a=0;a<h+1;a++)
    {
      for(b=0;b<w+1;b++)
      {
        if(barval>=a){
           PutPixel(x1+b,15-a+y1,1);
        }else{
           PutPixel(x1+b,15-a+y1,0);
        }
      }
    }
   
  }else{  //Bar Yatay olarak Oluşturulacak
 
    barval=((int16)value*w)/100;
   
    for (a=0;a<w+1;a++)
    {
      for(b=0;b<h+1;b++)
      {
        if(barval>=a)
        {
          PutPixel(x1+a,y1+b,1);
        }else{
          PutPixel(x1+a,y1+b,0);
        }
      }
    }
  }
}
/*******************************************************************************
*   Text Basma Fonksiyonu                                                      *
*   Parameter:    x, y, size, fill                                             *
*   Return:                                                                    *
*******************************************************************************/
void ShowString(unsigned int x, unsigned int y, unsigned int size, int1 fill){
  switch(size)
  {
    case 1:  DrawCharFont1(x,y,fill);break;
    case 2:  DrawCharFont2(x,y,fill);break;
    case 3:  DrawCharFont3(x,y,fill);break;
    case 4:  DrawCharFont4(x,y,fill);break;
    default: break;
  }
}
/*******************************************************************************
*   Text Kaydırma Fonksiyonu                                                   *
*   Parameter:    Line, Size, Speed, Fill                                      *
*   Return:                                                                    *
*******************************************************************************/
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 Writeimage(){
int8 a=0,b=0,i=0;
int8 cdata=0;
 
   for (a=0;a<32;a++)
   {
     cdata=imageBuffer[i];
     for(b=0;b<8;b++)
     {
        PutPixel(a,b,(cdata>>b)&0x01);
     }
     i++;
     cdata=imageBuffer[i];
     for(b=0;b<8;b++)
     {
        PutPixel(a,8+b,(cdata>>b)&0x01);
     }
     i++;
   }

}

font1.h
const unsigned char Font_5x7[96][5] ={  //
    0x00, 0x00, 0x00, 0x00, 0x00, // SPACE  32
    0x00, 0x00, 0x5F, 0x00, 0x00, // !      33
    0x00, 0x03, 0x00, 0x03, 0x00, // "      34
    0x14, 0x3E, 0x14, 0x3E, 0x14, // #      35 
    0x24, 0x2A, 0x7F, 0x2A, 0x12, // $      36
    0x43, 0x33, 0x08, 0x66, 0x61, // %      37 
    0x36, 0x49, 0x55, 0x22, 0x50, // &      38
    0x00, 0x05, 0x03, 0x00, 0x00, // '      39
    0x00, 0x1C, 0x22, 0x41, 0x00, // (      40
    0x00, 0x41, 0x22, 0x1C, 0x00, // )      41
    0x14, 0x08, 0x3E, 0x08, 0x14, // *      42
    0x08, 0x08, 0x3E, 0x08, 0x08, // +      43
    0x00, 0x50, 0x30, 0x00, 0x00, // ,      44
    0x08, 0x08, 0x08, 0x08, 0x08, // -      45
    0x00, 0x60, 0x60, 0x00, 0x00, // .      46
    0x20, 0x10, 0x08, 0x04, 0x02, // /      47 
    0x3E, 0x51, 0x49, 0x45, 0x3E, // 0      48
    0x04, 0x02, 0x7F, 0x00, 0x00, // 1      49
    0x42, 0x61, 0x51, 0x49, 0x46, // 2      50
    0x22, 0x41, 0x49, 0x49, 0x36, // 3      51
    0x18, 0x14, 0x12, 0x7F, 0x10, // 4      52
    0x27, 0x45, 0x45, 0x45, 0x39, // 5      53
    0x3E, 0x49, 0x49, 0x49, 0x32, // 6      54
    0x01, 0x01, 0x71, 0x09, 0x07, // 7      55
    0x36, 0x49, 0x49, 0x49, 0x36, // 8      56
    0x26, 0x49, 0x49, 0x49, 0x3E, // 9      57
    0x00, 0x36, 0x36, 0x00, 0x00, // :      58
    0x00, 0x56, 0x36, 0x00, 0x00, // ;      59
    0x08, 0x14, 0x22, 0x41, 0x00, // <      60
    0x14, 0x14, 0x14, 0x14, 0x14, // =      61
    0x00, 0x41, 0x22, 0x14, 0x08, // >      62
    0x02, 0x01, 0x51, 0x09, 0x06, // ?      63
    0x3E, 0x41, 0x59, 0x55, 0x5E, // @      64
    0x7E, 0x09, 0x09, 0x09, 0x7E, // A      65
    0x7F, 0x49, 0x49, 0x49, 0x36, // B      66
    0x3E, 0x41, 0x41, 0x41, 0x22, // C      67
    0x7F, 0x41, 0x41, 0x41, 0x3E, // D      68
    0x7F, 0x49, 0x49, 0x49, 0x41, // E      69
    0x7F, 0x09, 0x09, 0x09, 0x01, // F      70
    0x3E, 0x41, 0x41, 0x49, 0x3A, // G      71
    0x7F, 0x08, 0x08, 0x08, 0x7F, // H      72
    0x00, 0x41, 0x7F, 0x41, 0x00, // I      73
    0x30, 0x40, 0x40, 0x40, 0x3F, // J      74
    0x7F, 0x08, 0x14, 0x22, 0x41, // K      75
    0x7F, 0x40, 0x40, 0x40, 0x40, // L      76
    0x7F, 0x02, 0x0C, 0x02, 0x7F, // M      77
    0x7F, 0x02, 0x04, 0x08, 0x7F, // N      78
    0x3E, 0x41, 0x41, 0x41, 0x3E, // O      79
    0x7F, 0x09, 0x09, 0x09, 0x06, // P      80
    0x1E, 0x21, 0x21, 0x21, 0x5E, // Q      81
    0x7F, 0x09, 0x09, 0x09, 0x76, // R      82
    0x26, 0x49, 0x49, 0x49, 0x32, // S      83
    0x01, 0x01, 0x7F, 0x01, 0x01, // T      84
    0x3F, 0x40, 0x40, 0x40, 0x3F, // U      85
    0x1F, 0x20, 0x40, 0x20, 0x1F, // V      86
    0x7F, 0x20, 0x10, 0x20, 0x7F, // W      87
    0x41, 0x22, 0x1C, 0x22, 0x41, // X      88
    0x07, 0x08, 0x70, 0x08, 0x07, // Y      89
    0x61, 0x51, 0x49, 0x45, 0x43, // Z      90
    0x00, 0x7F, 0x41, 0x00, 0x00, // [      91
    0x02, 0x04, 0x08, 0x10, 0x20, // \      92
    0x00, 0x00, 0x41, 0x7F, 0x00, // ]      93
    0x04, 0x02, 0x01, 0x02, 0x04, // ^      94
    0x40, 0x40, 0x40, 0x40, 0x40, // _      95
    0x00, 0x01, 0x02, 0x04, 0x00, // `      96   
    0x20, 0x54, 0x54, 0x54, 0x78, // a      97
    0x7F, 0x44, 0x44, 0x44, 0x38, // b      98
    0x38, 0x44, 0x44, 0x44, 0x44, // c      99
    0x38, 0x44, 0x44, 0x44, 0x7F, // d      100
    0x38, 0x54, 0x54, 0x54, 0x18, // e      101
    0x04, 0x04, 0x7E, 0x05, 0x05, // f      102
    0x08, 0x54, 0x54, 0x54, 0x3C, // g      103
    0x7F, 0x08, 0x04, 0x04, 0x78, // h      104
    0x00, 0x44, 0x7D, 0x40, 0x00, // i      105
    0x20, 0x40, 0x44, 0x3D, 0x00, // j      106
    0x7F, 0x10, 0x28, 0x44, 0x00, // k      107
    0x00, 0x41, 0x7F, 0x40, 0x00, // l      108
    0x7C, 0x04, 0x78, 0x04, 0x78, // m      109
    0x7C, 0x08, 0x04, 0x04, 0x78, // n      110
    0x38, 0x44, 0x44, 0x44, 0x38, // o      111
    0x7C, 0x14, 0x14, 0x14, 0x08, // p      112
    0x08, 0x14, 0x14, 0x14, 0x7C, // q      113
    0x00, 0x7C, 0x08, 0x04, 0x04, // r      114
    0x48, 0x54, 0x54, 0x54, 0x20, // s      115
    0x04, 0x04, 0x3F, 0x44, 0x44, // t      116
    0x3C, 0x40, 0x40, 0x20, 0x7C, // u      117
    0x1C, 0x20, 0x40, 0x20, 0x1C, // v      118
    0x3C, 0x40, 0x30, 0x40, 0x3C, // w      119
    0x44, 0x28, 0x10, 0x28, 0x44, // x      120
    0x0C, 0x50, 0x50, 0x50, 0x3C, // y      121
    0x44, 0x64, 0x54, 0x4C, 0x44, // z      122
    0x00, 0x08, 0x36, 0x41, 0x41, // {      123
    0x00, 0x00, 0x7F, 0x00, 0x00, // |      124
    0x41, 0x41, 0x36, 0x08, 0x00, // }      125
    0x02, 0x01, 0x02, 0x04, 0x02};// ~      126
   



font2.h
//FontSize : 8 x 12

const unsigned char Font_8x12[96][16] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 
        0x00, 0x00, 0x7E, 0x03, 0x7E, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char !
        0x1E, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char "
        0xC0, 0x00, 0xD8, 0x03, 0xF8, 0x00, 0xDE, 0x00, 0xD8, 0x03, 0xF8, 0x00, 0xDE, 0x00, 0x18, 0x00,  // Code for char #
        0x1C, 0x01, 0x3E, 0x02, 0x22, 0x02, 0xFF, 0x07, 0x22, 0x02, 0xE2, 0x03, 0xC4, 0x01, 0x00, 0x00,  // Code for char $
        0x0C, 0x06, 0x92, 0x03, 0xCC, 0x00, 0x60, 0x00, 0x30, 0x03, 0x98, 0x04, 0x0E, 0x03, 0x00, 0x00,  // Code for char %
        0xDC, 0x01, 0xFE, 0x03, 0x22, 0x02, 0x22, 0x02, 0x7E, 0x02, 0xDC, 0x01, 0x00, 0x03, 0x80, 0x04,  // Code for char &
        0x00, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char '
        0x00, 0x00, 0xFC, 0x01, 0xFE, 0x03, 0x03, 0x06, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char (
        0x00, 0x00, 0x01, 0x04, 0x03, 0x06, 0xFE, 0x03, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char )
        0x00, 0x00, 0x14, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x00,  // Code for char *
        0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xFE, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00,  // Code for char +
        0x00, 0x08, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ,
        0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char -
        0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char .
        0x00, 0x08, 0x00, 0x06, 0x80, 0x01, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char /
        0xFC, 0x01, 0xFE, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0xFE, 0x03, 0xFC, 0x01, 0x00, 0x00,  // Code for char 0
        0x00, 0x00, 0x04, 0x02, 0x04, 0x02, 0xFE, 0x03, 0xFE, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00,  // Code for char 1
        0x0C, 0x02, 0x02, 0x03, 0x82, 0x03, 0xC2, 0x02, 0x62, 0x02, 0x3E, 0x02, 0x1C, 0x02, 0x00, 0x00,  // Code for char 2
        0x04, 0x01, 0x02, 0x02, 0x22, 0x02, 0x22, 0x02, 0x22, 0x02, 0xFE, 0x03, 0xDC, 0x01, 0x00, 0x00,  // Code for char 3
        0x60, 0x00, 0x50, 0x00, 0x48, 0x00, 0x44, 0x00, 0xFE, 0x03, 0xFE, 0x03, 0x40, 0x00, 0x00, 0x00,  // Code for char 4
        0x1E, 0x01, 0x1E, 0x02, 0x12, 0x02, 0x12, 0x02, 0x12, 0x02, 0xF2, 0x03, 0xE2, 0x01, 0x00, 0x00,  // Code for char 5
        0xFC, 0x01, 0xFE, 0x03, 0x12, 0x02, 0x12, 0x02, 0x12, 0x02, 0xF2, 0x03, 0xE4, 0x01, 0x00, 0x00,  // Code for char 6
        0x02, 0x00, 0x02, 0x00, 0x82, 0x03, 0xE2, 0x03, 0x7A, 0x00, 0x1E, 0x00, 0x06, 0x00, 0x00, 0x00,  // Code for char 7
        0xDC, 0x01, 0xFE, 0x03, 0x22, 0x02, 0x22, 0x02, 0x22, 0x02, 0xFE, 0x03, 0xDC, 0x01, 0x00, 0x00,  // Code for char 8
        0x3C, 0x00, 0x7E, 0x02, 0x42, 0x02, 0x42, 0x02, 0x42, 0x03, 0xFE, 0x01, 0xFC, 0x00, 0x00, 0x00,  // Code for char 9
        0x00, 0x00, 0x18, 0x03, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char :
        0x00, 0x04, 0x18, 0x07, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ;
        0x60, 0x00, 0x60, 0x00, 0x90, 0x00, 0x90, 0x00, 0x08, 0x01, 0x08, 0x01, 0x04, 0x02, 0x00, 0x00,  // Code for char <
        0x90, 0x00, 0x90, 0x00, 0x90, 0x00, 0x90, 0x00, 0x90, 0x00, 0x90, 0x00, 0x90, 0x00, 0x00, 0x00,  // Code for char =
        0x04, 0x02, 0x04, 0x02, 0x08, 0x01, 0x08, 0x01, 0x90, 0x00, 0x90, 0x00, 0x60, 0x00, 0x00, 0x00,  // Code for char >
        0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x62, 0x03, 0x72, 0x03, 0x1E, 0x00, 0x0C, 0x00, 0x00, 0x00,  // Code for char ?
        0xF8, 0x00, 0x04, 0x01, 0x72, 0x02, 0x8A, 0x02, 0x8A, 0x02, 0xF2, 0x02, 0x86, 0x02, 0x7C, 0x01,  // Code for char @
        0xF8, 0x03, 0xFC, 0x03, 0x46, 0x00, 0x46, 0x00, 0x46, 0x00, 0xFC, 0x03, 0xF8, 0x03, 0x00, 0x00,  // Code for char A
        0xFE, 0x03, 0xFE, 0x03, 0x22, 0x02, 0x22, 0x02, 0x22, 0x02, 0xFE, 0x03, 0xDC, 0x01, 0x00, 0x00,  // Code for char B
        0xFC, 0x01, 0xFE, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x8C, 0x01, 0x00, 0x00,  // Code for char C
        0xFE, 0x03, 0xFE, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0xFC, 0x01, 0xF8, 0x00, 0x00, 0x00,  // Code for char D
        0xFE, 0x03, 0xFE, 0x03, 0x22, 0x02, 0x22, 0x02, 0x22, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,  // Code for char E
        0xFE, 0x03, 0xFE, 0x03, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char F
        0xFC, 0x01, 0xFE, 0x03, 0x02, 0x02, 0x02, 0x02, 0x22, 0x02, 0xE2, 0x03, 0xEC, 0x03, 0x00, 0x00,  // Code for char G
        0xFE, 0x03, 0xFE, 0x03, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xFE, 0x03, 0xFE, 0x03, 0x00, 0x00,  // Code for char H
        0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0xFE, 0x03, 0xFE, 0x03, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,  // Code for char I
        0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0xFE, 0x03, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char J
        0xFE, 0x03, 0xFE, 0x03, 0x70, 0x00, 0xD8, 0x00, 0x8C, 0x01, 0x06, 0x03, 0x02, 0x02, 0x00, 0x00,  // Code for char K
        0xFE, 0x03, 0xFE, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,  // Code for char L
        0xFE, 0x03, 0x1C, 0x00, 0x30, 0x00, 0x40, 0x00, 0x30, 0x00, 0x1C, 0x00, 0xFE, 0x03, 0x00, 0x00,  // Code for char M
        0xFE, 0x03, 0x06, 0x00, 0x1E, 0x00, 0x78, 0x00, 0xE0, 0x01, 0x80, 0x03, 0xFE, 0x03, 0x00, 0x00,  // Code for char N
        0xFC, 0x01, 0xFE, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0xFE, 0x03, 0xFC, 0x01, 0x00, 0x00,  // Code for char O
        0xFE, 0x03, 0xFE, 0x03, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x00, 0x00,  // Code for char P
        0xFC, 0x01, 0xFE, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06, 0xFE, 0x07, 0xFC, 0x05,  // Code for char Q
        0xFE, 0x03, 0xFE, 0x03, 0x22, 0x00, 0x62, 0x00, 0xE2, 0x00, 0xBE, 0x03, 0x1C, 0x02, 0x00, 0x00,  // Code for char R
        0x9C, 0x01, 0x3E, 0x02, 0x22, 0x02, 0x22, 0x02, 0x22, 0x02, 0xE2, 0x03, 0xCC, 0x01, 0x00, 0x00,  // Code for char S
        0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xFE, 0x03, 0xFE, 0x03, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00,  // Code for char T
        0xFE, 0x01, 0xFE, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0xFE, 0x03, 0xFE, 0x01, 0x00, 0x00,  // Code for char U
        0x7E, 0x00, 0xC0, 0x00, 0x80, 0x01, 0x00, 0x03, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0x7E, 0x00,  // Code for char V
        0xFE, 0x03, 0x00, 0x03, 0x80, 0x01, 0xF0, 0x00, 0xF0, 0x00, 0x80, 0x01, 0x00, 0x03, 0xFE, 0x03,  // Code for char W
        0x06, 0x03, 0x8E, 0x03, 0xD8, 0x00, 0x70, 0x00, 0x70, 0x00, 0xD8, 0x00, 0x8E, 0x03, 0x06, 0x03,  // Code for char X
        0x06, 0x00, 0x1E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0xE0, 0x03, 0x38, 0x00, 0x1E, 0x00, 0x06, 0x00,  // Code for char Y
        0x02, 0x03, 0x82, 0x03, 0xC2, 0x02, 0x62, 0x02, 0x32, 0x02, 0x1A, 0x02, 0x0E, 0x02, 0x00, 0x00,  // Code for char Z
        0x00, 0x00, 0xFE, 0x07, 0xFE, 0x07, 0x02, 0x04, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char [
        0x06, 0x00, 0x18, 0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,  // Code for char BackSlash
        0x00, 0x00, 0x02, 0x04, 0x02, 0x04, 0xFE, 0x07, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ]
        0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00,  // Code for char ^
        0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,  // Code for char _
        0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char `
        0x00, 0x03, 0xA0, 0x07, 0x90, 0x04, 0x90, 0x04, 0x90, 0x04, 0xF0, 0x07, 0xE0, 0x07, 0x00, 0x00,  // Code for char a
        0xFE, 0x07, 0xFE, 0x07, 0x20, 0x04, 0x10, 0x04, 0x10, 0x04, 0xF0, 0x07, 0xE0, 0x03, 0x00, 0x00,  // Code for char b
        0xE0, 0x03, 0xF0, 0x07, 0x10, 0x04, 0x10, 0x04, 0x10, 0x04, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00,  // Code for char c
        0xE0, 0x03, 0xF0, 0x07, 0x10, 0x04, 0x10, 0x04, 0x10, 0x02, 0xFE, 0x07, 0xFE, 0x07, 0x00, 0x00,  // Code for char d
        0xE0, 0x03, 0xF0, 0x07, 0x90, 0x04, 0x90, 0x04, 0x90, 0x04, 0xF0, 0x04, 0xE0, 0x02, 0x00, 0x00,  // Code for char e
        0x10, 0x00, 0xFC, 0x07, 0xFE, 0x07, 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char f
        0x7C, 0x02, 0xFE, 0x04, 0x82, 0x04, 0x82, 0x04, 0x42, 0x04, 0xFE, 0x07, 0xFE, 0x03, 0x00, 0x00,  // Code for char g
        0xFE, 0x07, 0xFE, 0x07, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0xF0, 0x07, 0xE0, 0x07, 0x00, 0x00,  // Code for char h
        0xF6, 0x07, 0xF6, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char i
        0x00, 0x00, 0x10, 0x00, 0xF6, 0x07, 0xF6, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char j
        0xFE, 0x07, 0xFE, 0x07, 0xC0, 0x01, 0x60, 0x03, 0x30, 0x06, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00,  // Code for char k
        0xFE, 0x07, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char l
        0xE0, 0x07, 0x10, 0x00, 0x10, 0x00, 0xE0, 0x07, 0xE0, 0x07, 0x10, 0x00, 0x10, 0x00, 0xE0, 0x07,  // Code for char m
        0xF0, 0x07, 0xF0, 0x07, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0xF0, 0x07, 0xE0, 0x07, 0x00, 0x00,  // Code for char n
        0xE0, 0x03, 0xF0, 0x07, 0x10, 0x04, 0x10, 0x04, 0x10, 0x04, 0xF0, 0x07, 0xE0, 0x03, 0x00, 0x00,  // Code for char o
        0xFE, 0x07, 0xFE, 0x07, 0x84, 0x00, 0x82, 0x00, 0x82, 0x00, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0x00,  // Code for char p
        0x7C, 0x00, 0xFE, 0x00, 0x82, 0x00, 0x82, 0x00, 0x42, 0x00, 0xFE, 0x07, 0xFE, 0x07, 0x00, 0x00,  // Code for char q
        0xF0, 0x07, 0xF0, 0x07, 0x20, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char r
        0x60, 0x02, 0xF0, 0x04, 0xD0, 0x04, 0x90, 0x05, 0x90, 0x07, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00,  // Code for char s
        0x10, 0x00, 0xFC, 0x03, 0xFC, 0x07, 0x10, 0x04, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char t
        0xF0, 0x03, 0xF0, 0x07, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0xF0, 0x07, 0xF0, 0x07, 0x00, 0x00,  // Code for char u
        0x70, 0x00, 0xF0, 0x01, 0x80, 0x07, 0x00, 0x06, 0x80, 0x07, 0xF0, 0x01, 0x70, 0x00, 0x00, 0x00,  // Code for char v
        0xF0, 0x03, 0x00, 0x06, 0x00, 0x04, 0xE0, 0x03, 0x00, 0x04, 0x00, 0x06, 0xF0, 0x03, 0x00, 0x00,  // Code for char w
        0x30, 0x06, 0x70, 0x07, 0xC0, 0x01, 0xC0, 0x01, 0x70, 0x07, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00,  // Code for char x
        0x18, 0x02, 0x30, 0x04, 0x60, 0x04, 0xC0, 0x07, 0xC0, 0x03, 0x60, 0x00, 0x38, 0x00, 0x00, 0x00,  // Code for char y
        0x10, 0x06, 0x10, 0x07, 0x90, 0x05, 0xD0, 0x04, 0x70, 0x04, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00,  // Code for char z
        0x60, 0x00, 0xFC, 0x03, 0x9E, 0x07, 0x02, 0x04, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char {
        0x00, 0x00, 0x00, 0x00, 0xFE, 0x07, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char |
        0x02, 0x04, 0x02, 0x04, 0x9E, 0x07, 0xFC, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char }
        0xE0, 0x00, 0x30, 0x00, 0x30, 0x00, 0x70, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x70, 0x00,  // Code for char ~
        0x00, 0x00, 0xFE, 0x07, 0x02, 0x04, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00   // Code for char 
        };


font3.h
const unsigned char Font_12x14[96][24] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 
        0x00, 0x00, 0xFE, 0x1B, 0xFE, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char !
        0x1F, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char "
        0x00, 0x03, 0x30, 0x1B, 0xB0, 0x07, 0x78, 0x03, 0x36, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x1B, 0xB0, 0x07, 0x78, 0x03, 0x00, 0x00, 0x00, 0x00,  // Code for char #
        0x70, 0x0C, 0xF8, 0x1C, 0x8C, 0x10, 0x84, 0x10, 0xFF, 0x3F, 0x84, 0x10, 0x84, 0x18, 0x9C, 0x0F, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char $
        0x0E, 0x18, 0x1F, 0x1C, 0x11, 0x0E, 0x1F, 0x07, 0xCE, 0x03, 0xE0, 0x01, 0x70, 0x0E, 0x38, 0x1F, 0x1C, 0x11, 0x0E, 0x1F, 0x07, 0x0E, 0x00, 0x00,  // Code for char %
        0x00, 0x07, 0x9C, 0x0F, 0xFE, 0x18, 0x62, 0x10, 0xC2, 0x10, 0xE2, 0x11, 0x3E, 0x1B, 0x1C, 0x0E, 0xC0, 0x0F, 0xC0, 0x19, 0x00, 0x00, 0x00, 0x00,  // Code for char &
        0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char '
        0x00, 0x00, 0xF0, 0x0F, 0xFC, 0x3F, 0x0E, 0x30, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char (
        0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x0E, 0x30, 0xFC, 0x3F, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char )
        0x00, 0x00, 0x42, 0x00, 0x24, 0x00, 0x18, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x18, 0x00, 0x24, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char *
        0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xF0, 0x07, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char +
        0x00, 0x00, 0x00, 0x2C, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ,
        0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char -
        0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char .
        0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0E, 0x80, 0x01, 0x70, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char /
        0xF8, 0x07, 0xFC, 0x0F, 0x06, 0x18, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x06, 0x18, 0xFC, 0x0F, 0xF8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 0
        0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x08, 0x10, 0xFE, 0x1F, 0xFE, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 1
        0x08, 0x10, 0x0C, 0x18, 0x06, 0x1C, 0x02, 0x16, 0x02, 0x13, 0x82, 0x11, 0xC6, 0x10, 0x7C, 0x10, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 2
        0x0C, 0x0C, 0x06, 0x18, 0x02, 0x10, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0xE6, 0x18, 0xBC, 0x0F, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 3
        0x80, 0x01, 0x40, 0x01, 0x20, 0x01, 0x10, 0x01, 0x08, 0x01, 0x04, 0x01, 0xFE, 0x1F, 0xFE, 0x1F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,  // Code for char 4
        0x00, 0x0C, 0x3E, 0x1C, 0x3E, 0x10, 0x22, 0x10, 0x22, 0x10, 0x22, 0x10, 0x62, 0x18, 0xC2, 0x0F, 0x82, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 5
        0xF0, 0x07, 0xF8, 0x0F, 0x2C, 0x18, 0x26, 0x10, 0x22, 0x10, 0x22, 0x10, 0x62, 0x18, 0xC2, 0x0F, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 6
        0x02, 0x00, 0x02, 0x00, 0x02, 0x18, 0x02, 0x1E, 0x82, 0x07, 0xE2, 0x01, 0x7A, 0x00, 0x1E, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 7
        0x18, 0x07, 0xBC, 0x0F, 0xE6, 0x18, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0xE6, 0x18, 0xBC, 0x0F, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 8
        0x78, 0x08, 0xFC, 0x18, 0xC6, 0x11, 0x82, 0x11, 0x82, 0x11, 0x82, 0x11, 0xC6, 0x18, 0xFC, 0x0F, 0xF8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 9
        0x00, 0x00, 0x00, 0x00, 0x70, 0x1C, 0x70, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char :
        0x00, 0x00, 0x00, 0x10, 0x70, 0x1C, 0x70, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ;
        0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x40, 0x02, 0x40, 0x02, 0x20, 0x04, 0x20, 0x04, 0x10, 0x08, 0x10, 0x08, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00,  // Code for char <
        0x00, 0x00, 0x20, 0x02, 0x20, 0x02, 0x20, 0x02, 0x20, 0x02, 0x20, 0x02, 0x20, 0x02, 0x20, 0x02, 0x20, 0x02, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00,  // Code for char =
        0x00, 0x00, 0x08, 0x10, 0x08, 0x10, 0x10, 0x08, 0x10, 0x08, 0x20, 0x04, 0x20, 0x04, 0x40, 0x02, 0x40, 0x02, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00,  // Code for char >
        0x0C, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x1B, 0x82, 0x1B, 0xC6, 0x00, 0x7C, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ?
        0xFC, 0x07, 0x06, 0x0C, 0xF3, 0x19, 0x19, 0x13, 0x0D, 0x16, 0x0D, 0x16, 0x0D, 0x16, 0xFD, 0x17, 0xF9, 0x17, 0x02, 0x14, 0xFC, 0x13, 0x00, 0x00,  // Code for char @
        0xF8, 0x1F, 0xFC, 0x1F, 0x8E, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x8E, 0x01, 0xFC, 0x1F, 0xF8, 0x1F, 0x00, 0x00, 0x00, 0x00,  // Code for char A
        0xFE, 0x1F, 0xFE, 0x1F, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0x66, 0x10, 0xFC, 0x18, 0x98, 0x0F, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,  // Code for char B
        0xF0, 0x03, 0xFC, 0x0F, 0x0C, 0x0C, 0x06, 0x18, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x06, 0x18, 0x0E, 0x1C, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00,  // Code for char C
        0xFE, 0x1F, 0xFE, 0x1F, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x06, 0x18, 0x04, 0x08, 0x1C, 0x0E, 0xF8, 0x07, 0x00, 0x00, 0x00, 0x00,  // Code for char D
        0xFE, 0x1F, 0xFE, 0x1F, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char E
        0xFE, 0x1F, 0xFE, 0x1F, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char F
        0xF0, 0x03, 0xFC, 0x0F, 0x0C, 0x0C, 0x06, 0x18, 0x02, 0x10, 0x02, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x8E, 0x1F, 0x00, 0x00, 0x00, 0x00,  // Code for char G
        0xFE, 0x1F, 0xFE, 0x1F, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0x00, 0x00,  // Code for char H
        0x02, 0x10, 0x02, 0x10, 0xFE, 0x1F, 0xFE, 0x1F, 0x02, 0x10, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char I
        0x00, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x18, 0xFE, 0x0F, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char J
        0xFE, 0x1F, 0xFE, 0x1F, 0x40, 0x00, 0xE0, 0x00, 0xB0, 0x01, 0x18, 0x03, 0x0C, 0x06, 0x06, 0x0C, 0x02, 0x18, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,  // Code for char K
        0xFE, 0x1F, 0xFE, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char L
        0xFE, 0x1F, 0x0E, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0x80, 0x03, 0x00, 0x06, 0x80, 0x03, 0xF0, 0x00, 0x3C, 0x00, 0x0E, 0x00, 0xFE, 0x1F, 0x00, 0x00,  // Code for char M
        0xFE, 0x1F, 0xFC, 0x1F, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x00, 0x80, 0x01, 0x00, 0x03, 0x00, 0x06, 0xFE, 0x0F, 0xFE, 0x1F, 0x00, 0x00,  // Code for char N
        0xF0, 0x03, 0xFC, 0x0F, 0x0C, 0x0C, 0x06, 0x18, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x06, 0x18, 0x0C, 0x0C, 0xFC, 0x0F, 0xF0, 0x03, 0x00, 0x00,  // Code for char O
        0xFE, 0x1F, 0xFE, 0x1F, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x86, 0x01, 0xFC, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char P
        0xF0, 0x03, 0xFC, 0x0F, 0x0C, 0x0C, 0x06, 0x18, 0x02, 0x10, 0x02, 0x30, 0x02, 0x32, 0x06, 0x1E, 0x0C, 0x0C, 0xFC, 0x1F, 0xF0, 0x33, 0x00, 0x00,  // Code for char Q
        0xFE, 0x1F, 0xFE, 0x1F, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x86, 0x03, 0xFC, 0x06, 0x78, 0x0C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,  // Code for char R
        0x38, 0x0C, 0x7C, 0x1C, 0xE6, 0x10, 0xC2, 0x10, 0xC2, 0x10, 0xC2, 0x10, 0xC2, 0x19, 0x8E, 0x0F, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char S
        0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xFE, 0x1F, 0xFE, 0x1F, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char T
        0xFE, 0x07, 0xFE, 0x0F, 0x00, 0x18, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x18, 0xFE, 0x0F, 0x00, 0x00, 0x00, 0x00,  // Code for char U
        0x0E, 0x00, 0x7E, 0x00, 0xF0, 0x03, 0x80, 0x1F, 0x00, 0x1C, 0x00, 0x1C, 0x80, 0x1F, 0xF0, 0x03, 0x7E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char V
        0x7E, 0x00, 0xE0, 0x03, 0x00, 0x0F, 0x00, 0x1C, 0x00, 0x06, 0xE0, 0x03, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x0F, 0xE0, 0x03, 0x7E, 0x00, 0x00, 0x00,  // Code for char W
        0x06, 0x18, 0x0E, 0x1C, 0x18, 0x06, 0x30, 0x03, 0xE0, 0x01, 0xE0, 0x01, 0x30, 0x03, 0x18, 0x06, 0x0E, 0x1C, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00,  // Code for char X
        0x06, 0x00, 0x1E, 0x00, 0x38, 0x00, 0xE0, 0x00, 0xC0, 0x1F, 0xC0, 0x1F, 0xE0, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char Y
        0x02, 0x18, 0x02, 0x1C, 0x02, 0x17, 0x82, 0x13, 0xC2, 0x10, 0x72, 0x10, 0x3A, 0x10, 0x0E, 0x10, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char Z
        0x00, 0x00, 0xFF, 0x1F, 0xFF, 0x1F, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char [
        0x00, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x70, 0x00, 0x80, 0x01, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char BackSlash
        0x00, 0x00, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0xFF, 0x1F, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ]
        0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x18, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x18, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00,  // Code for char ^
        0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char _
        0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char `
        0x00, 0x0E, 0x20, 0x1F, 0x30, 0x11, 0x90, 0x10, 0x90, 0x10, 0x90, 0x10, 0xB0, 0x08, 0xE0, 0x1F, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char a
        0xFF, 0x1F, 0xFF, 0x1F, 0x20, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x30, 0x18, 0xE0, 0x0F, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char b
        0xC0, 0x07, 0xE0, 0x0F, 0x30, 0x18, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char c
        0xC0, 0x07, 0xE0, 0x0F, 0x30, 0x18, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x08, 0xFF, 0x1F, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char d
        0xC0, 0x07, 0xE0, 0x0F, 0x30, 0x19, 0x10, 0x11, 0x10, 0x11, 0x10, 0x11, 0x30, 0x11, 0xE0, 0x19, 0xC0, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char e
        0x10, 0x00, 0xFE, 0x1F, 0xFF, 0x1F, 0x11, 0x00, 0x11, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char f
        0xF8, 0x00, 0xFC, 0x01, 0x06, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x01, 0xFE, 0x1F, 0xFE, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char g
        0xFF, 0x1F, 0xFF, 0x1F, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x00, 0xE0, 0x1F, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char h
        0x00, 0x00, 0xF6, 0x1F, 0xF6, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char i
        0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0xF6, 0x1F, 0xF6, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char j
        0xFF, 0x1F, 0xFF, 0x1F, 0x00, 0x01, 0x80, 0x01, 0xC0, 0x03, 0x60, 0x06, 0x30, 0x0C, 0x10, 0x18, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char k
        0x00, 0x00, 0xFF, 0x1F, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char l
        0xF0, 0x1F, 0xF0, 0x1F, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0xF0, 0x1F, 0xE0, 0x1F, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0xE0, 0x1F, 0x00, 0x00,  // Code for char m
        0xF0, 0x1F, 0xF0, 0x1F, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x00, 0xE0, 0x1F, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char n
        0xC0, 0x07, 0xE0, 0x0F, 0x30, 0x18, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x30, 0x18, 0xE0, 0x0F, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char o
        0xFE, 0x1F, 0xFE, 0x1F, 0x04, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06, 0x03, 0xFC, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char p
        0xF8, 0x00, 0xFC, 0x01, 0x06, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x01, 0xFE, 0x1F, 0xFE, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char q
        0xF0, 0x1F, 0xF0, 0x1F, 0x20, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char r
        0xE0, 0x08, 0xF0, 0x11, 0x90, 0x11, 0x90, 0x13, 0x10, 0x13, 0x10, 0x1F, 0x20, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char s
        0x10, 0x00, 0xFE, 0x0F, 0xFE, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char t
        0xF0, 0x07, 0xF0, 0x0F, 0x00, 0x18, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0xF0, 0x1F, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char u
        0x70, 0x00, 0xF0, 0x03, 0x80, 0x0F, 0x00, 0x1C, 0x00, 0x1C, 0x80, 0x0F, 0xF0, 0x03, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char v
        0xF0, 0x03, 0xF0, 0x1F, 0x00, 0x1C, 0x80, 0x0F, 0xE0, 0x03, 0xF0, 0x00, 0xE0, 0x03, 0x00, 0x0F, 0x00, 0x0C, 0xF0, 0x1F, 0xF0, 0x1F, 0x00, 0x00,  // Code for char w
        0x10, 0x10, 0x30, 0x18, 0x60, 0x0C, 0xC0, 0x07, 0x80, 0x03, 0xC0, 0x07, 0x60, 0x0C, 0x30, 0x18, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char x
        0x0E, 0x00, 0x7E, 0x10, 0xF0, 0x19, 0x80, 0x1F, 0x80, 0x0F, 0xF0, 0x01, 0x7E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char y
        0x10, 0x18, 0x10, 0x1C, 0x10, 0x16, 0x10, 0x13, 0x90, 0x11, 0xD0, 0x10, 0x70, 0x10, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char z
        0x00, 0x00, 0xC0, 0x00, 0xF8, 0x07, 0x3C, 0x0F, 0x06, 0x18, 0x02, 0x10, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x1F, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char |
        0x00, 0x00, 0x02, 0x10, 0x02, 0x10, 0x06, 0x18, 0x3C, 0x0F, 0xF8, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char }
        0x80, 0x03, 0xC0, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xC0, 0x00, 0x80, 0x01, 0x00, 0x03, 0x00, 0x03, 0x80, 0x03, 0xE0, 0x00, 0x00, 0x00,  // Code for char ~
        0xFE, 0x0F, 0xFE, 0x0F, 0x02, 0x08, 0xFE, 0x0F, 0xFE, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00   // Code for char 
        };


font4.h
//GLCD FontName : Arial12x16
//GLCD FontSize : 12 x 16

const unsigned char Font_12x16[99][24] = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 
        0x00, 0x00, 0x00, 0x00, 0xFE, 0x6F, 0xFE, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char !
        0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char "
        0x30, 0x06, 0x30, 0x66, 0x30, 0x7F, 0xF8, 0x1F, 0xFE, 0x06, 0x36, 0x66, 0x30, 0x7F, 0xF8, 0x1F, 0xFE, 0x06, 0x36, 0x06, 0x30, 0x06, 0x00, 0x00,  // Code for char #
        0x00, 0x00, 0x30, 0x08, 0x78, 0x18, 0xCC, 0x30, 0x84, 0x20, 0xFE, 0x7F, 0x84, 0x21, 0x0C, 0x33, 0x18, 0x1E, 0x10, 0x0C, 0x00, 0x00, 0x00, 0x00,  // Code for char $
        0x1C, 0x40, 0x3E, 0x70, 0x22, 0x38, 0x3E, 0x0E, 0x1C, 0x07, 0xC0, 0x01, 0xE0, 0x38, 0x38, 0x7C, 0x1E, 0x44, 0x06, 0x7C, 0x00, 0x38, 0x00, 0x00,  // Code for char %
        0x00, 0x1E, 0x38, 0x3F, 0xFC, 0x73, 0xE6, 0x61, 0xC6, 0x61, 0xC6, 0x63, 0x7E, 0x36, 0x3C, 0x3C, 0x00, 0x18, 0x00, 0x3E, 0x00, 0x66, 0x00, 0x00,  // Code for char &
        0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char '
        0x00, 0x00, 0xF0, 0x07, 0xFE, 0x3F, 0x07, 0x70, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char (
        0x00, 0x00, 0x01, 0x40, 0x07, 0x70, 0xFE, 0x3F, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char )
        0x00, 0x00, 0x48, 0x00, 0x68, 0x00, 0x1E, 0x00, 0x68, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char *
        0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xF8, 0x1F, 0xF8, 0x1F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00,  // Code for char +
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xE0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ,
        0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00,  // Code for char -
        0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char .
        0x00, 0x60, 0x00, 0x7C, 0xC0, 0x1F, 0xF8, 0x03, 0x3E, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char /
        0x00, 0x00, 0xF8, 0x1F, 0xFC, 0x3F, 0x0E, 0x70, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0xFC, 0x3F, 0xF8, 0x1F, 0x00, 0x00,  // Code for char 0
        0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char 1
        0x00, 0x00, 0x18, 0x60, 0x1C, 0x70, 0x0E, 0x78, 0x06, 0x6C, 0x06, 0x66, 0x06, 0x66, 0x06, 0x63, 0x8E, 0x61, 0xFC, 0x60, 0x78, 0x60, 0x00, 0x00,  // Code for char 2
        0x00, 0x00, 0x08, 0x18, 0x0C, 0x38, 0x06, 0x70, 0x06, 0x60, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0xCE, 0x73, 0xFC, 0x3F, 0x78, 0x1E, 0x00, 0x00,  // Code for char 3
        0x00, 0x00, 0x00, 0x0F, 0x80, 0x0F, 0xC0, 0x0C, 0x60, 0x0C, 0x30, 0x0C, 0x18, 0x0C, 0xFC, 0x7F, 0xFE, 0x7F, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00,  // Code for char 4
        0x00, 0x00, 0xFE, 0x19, 0xFE, 0x39, 0xC6, 0x70, 0x66, 0x60, 0x66, 0x60, 0x66, 0x60, 0x66, 0x60, 0xE6, 0x70, 0xC6, 0x3F, 0x86, 0x1F, 0x00, 0x00,  // Code for char 5
        0x00, 0x00, 0xF8, 0x1F, 0xFC, 0x3F, 0x8E, 0x71, 0xC6, 0x60, 0xC6, 0x60, 0xC6, 0x60, 0xC6, 0x60, 0xC6, 0x71, 0x8C, 0x3F, 0x18, 0x1F, 0x00, 0x00,  // Code for char 6
        0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x70, 0x06, 0x7C, 0x06, 0x0F, 0xC6, 0x03, 0xF6, 0x00, 0x3E, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x00, 0x00,  // Code for char 7
        0x00, 0x00, 0x78, 0x1E, 0xFC, 0x3F, 0xCE, 0x73, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0xCE, 0x73, 0xFC, 0x3F, 0x78, 0x1E, 0x00, 0x00,  // Code for char 8
        0x00, 0x00, 0x78, 0x18, 0xFC, 0x38, 0xCE, 0x71, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0xCE, 0x71, 0xFC, 0x3F, 0xF8, 0x1F, 0x00, 0x00,  // Code for char 9
        0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char :
        0x00, 0x00, 0x00, 0x00, 0x30, 0x58, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ;
        0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x80, 0x02, 0xC0, 0x06, 0xC0, 0x06, 0x40, 0x04, 0x60, 0x0C, 0x60, 0x0C, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00,  // Code for char <
        0x00, 0x00, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00,  // Code for char =
        0x00, 0x00, 0x30, 0x18, 0x60, 0x0C, 0x60, 0x0C, 0x40, 0x04, 0xC0, 0x06, 0xC0, 0x06, 0x80, 0x02, 0x80, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,  // Code for char >
        0x00, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x06, 0x6E, 0x06, 0x6F, 0x86, 0x03, 0xCE, 0x01, 0xFC, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ?
        0xF0, 0x0F, 0x18, 0x18, 0xCC, 0x33, 0x64, 0x26, 0x36, 0x2C, 0x16, 0x2C, 0x16, 0x2E, 0xF6, 0x2B, 0xE6, 0x28, 0x0C, 0x24, 0xF8, 0x13, 0x00, 0x00,  // Code for char @
        0x00, 0x00, 0xE0, 0x7F, 0xF8, 0x7F, 0x3C, 0x03, 0x0E, 0x03, 0x06, 0x03, 0x06, 0x03, 0x0E, 0x03, 0x3C, 0x03, 0xF8, 0x7F, 0xE0, 0x7F, 0x00, 0x00,  // Code for char A
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0xCE, 0x61, 0xFC, 0x73, 0x78, 0x3E, 0x00, 0x1C, 0x00, 0x00,  // Code for char B
        0x00, 0x00, 0xF0, 0x07, 0xF8, 0x1F, 0x1C, 0x38, 0x0E, 0x70, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0x1C, 0x38, 0x18, 0x18, 0x00, 0x00,  // Code for char C
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0x1C, 0x38, 0xF8, 0x1F, 0xE0, 0x0F, 0x00, 0x00,  // Code for char D
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x06, 0x60, 0x00, 0x00,  // Code for char E
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x06, 0x00, 0x00, 0x00,  // Code for char F
        0x00, 0x00, 0xF0, 0x0F, 0xF8, 0x3F, 0x3C, 0x78, 0x0E, 0x70, 0x06, 0x70, 0x06, 0x63, 0x06, 0x63, 0x0E, 0x73, 0x1C, 0x77, 0x18, 0x3F, 0x00, 0x00,  // Code for char G
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x00,  // Code for char H
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char I
        0x00, 0x00, 0x00, 0x38, 0x00, 0x78, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0xFE, 0x3F, 0xFE, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char J
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x80, 0x01, 0xE0, 0x01, 0xF0, 0x03, 0x38, 0x07, 0x1C, 0x1E, 0x0E, 0x38, 0x06, 0x70, 0x02, 0x60, 0x00, 0x00,  // Code for char K
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00,  // Code for char L
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0xF8, 0x01, 0xC0, 0x07, 0x00, 0x18, 0x00, 0x18, 0xC0, 0x07, 0xF8, 0x01, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x00,  // Code for char M
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x3C, 0x00, 0x70, 0x00, 0xE0, 0x01, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x38, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x00,  // Code for char N
        0xF0, 0x0F, 0xFC, 0x3F, 0x1C, 0x38, 0x0E, 0x70, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0x1C, 0x38, 0xFC, 0x3F, 0xF0, 0x0F, 0x00, 0x00,  // Code for char O
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x8E, 0x03, 0xFC, 0x01, 0xF8, 0x00, 0x00, 0x00,  // Code for char P
        0x00, 0x00, 0xF8, 0x0F, 0xFC, 0x1F, 0x0E, 0x38, 0x06, 0x30, 0x06, 0x30, 0x06, 0x30, 0x06, 0x34, 0x0E, 0x38, 0xFC, 0x1F, 0xF8, 0x2F, 0x00, 0x00,  // Code for char Q
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x03, 0x86, 0x0F, 0xCE, 0x1D, 0xFC, 0x78, 0x78, 0x70, 0x00, 0x00,  // Code for char R
        0x00, 0x00, 0x78, 0x1C, 0xFC, 0x3C, 0xCE, 0x70, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x8E, 0x73, 0x1C, 0x3F, 0x18, 0x1E, 0x00, 0x00,  // Code for char S
        0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00,  // Code for char T
        0x00, 0x00, 0xFE, 0x0F, 0xFE, 0x3F, 0x00, 0x30, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x30, 0xFE, 0x3F, 0xFE, 0x0F, 0x00, 0x00,  // Code for char U
        0x00, 0x00, 0x7E, 0x00, 0xFE, 0x01, 0xC0, 0x07, 0x00, 0x1F, 0x00, 0x60, 0x00, 0x60, 0x00, 0x1F, 0xC0, 0x07, 0xFE, 0x01, 0x7E, 0x00, 0x00, 0x00,  // Code for char V
        0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x38, 0x00, 0x0F, 0xC0, 0x01, 0x30, 0x00, 0xC0, 0x01, 0x00, 0x0F, 0x00, 0x38, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x00,  // Code for char W
        0x00, 0x00, 0x02, 0x40, 0x0E, 0x70, 0x3C, 0x3C, 0x70, 0x0E, 0xC0, 0x03, 0xC0, 0x03, 0x70, 0x0E, 0x3C, 0x3C, 0x0E, 0x70, 0x02, 0x40, 0x00, 0x00,  // Code for char X
        0x00, 0x00, 0x06, 0x00, 0x1E, 0x00, 0x38, 0x00, 0xE0, 0x00, 0xC0, 0x7F, 0xC0, 0x7F, 0x60, 0x00, 0x38, 0x00, 0x1E, 0x00, 0x06, 0x00, 0x00, 0x00,  // Code for char Y
        0x00, 0x00, 0x06, 0x70, 0x06, 0x78, 0x06, 0x6E, 0x06, 0x67, 0x86, 0x61, 0xE6, 0x60, 0x76, 0x60, 0x1E, 0x60, 0x0E, 0x60, 0x06, 0x60, 0x00, 0x00,  // Code for char Z
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x06, 0x60, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char [
        0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x78, 0x00, 0xE0, 0x01, 0x80, 0x07, 0x00, 0x1E, 0x00, 0x38, 0x00, 0x60, 0x00, 0x40, 0x00, 0x00,  // Code for char BackSlash
        0x00, 0x00, 0x06, 0x60, 0x06, 0x60, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ]
        0x00, 0x00, 0x80, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x06, 0x00, 0x3C, 0x00, 0xF0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char ^
        0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char _
        0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char `
        0x00, 0x00, 0xC0, 0x3C, 0xC0, 0x7E, 0x60, 0x66, 0x60, 0x66, 0x60, 0x63, 0x60, 0x33, 0xE0, 0x3F, 0xC0, 0x7F, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,  // Code for char a
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0xC0, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xE0, 0x70, 0xC0, 0x3F, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x00,  // Code for char b
        0x00, 0x00, 0x80, 0x1F, 0xC0, 0x3F, 0xE0, 0x70, 0x60, 0x60, 0x60, 0x60, 0xE0, 0x70, 0xC0, 0x30, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char c
        0x00, 0x00, 0x80, 0x1F, 0xC0, 0x3F, 0xE0, 0x70, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xC0, 0x30, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0x00,  // Code for char d
        0x00, 0x00, 0x80, 0x1F, 0xC0, 0x3F, 0xE0, 0x76, 0x60, 0x66, 0x60, 0x66, 0x60, 0x66, 0xE0, 0x66, 0xC0, 0x37, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00,  // Code for char e
        0x00, 0x00, 0x60, 0x00, 0xFC, 0x7F, 0xFE, 0x7F, 0x66, 0x00, 0x66, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char f
        0x00, 0x00, 0xF8, 0x38, 0xFC, 0x71, 0x8E, 0x63, 0x06, 0x63, 0x06, 0x63, 0x06, 0x63, 0x06, 0x63, 0x0E, 0x73, 0xFC, 0x3F, 0xF8, 0x1F, 0x00, 0x00,  // Code for char g
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0xC0, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xE0, 0x7F, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char h
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xF6, 0x7F, 0xF6, 0x7F, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char i
        0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x20, 0x60, 0xE6, 0x7F, 0xE6, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char j
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x03, 0x80, 0x07, 0xC0, 0x1F, 0xE0, 0x7C, 0x60, 0x70, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char k
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char l
        0x00, 0x00, 0xC0, 0x7F, 0xE0, 0x7F, 0xE0, 0x00, 0xC0, 0x01, 0x80, 0x3F, 0x80, 0x3F, 0xC0, 0x01, 0xE0, 0x00, 0xE0, 0x7F, 0xC0, 0x7F, 0x00, 0x00,  // Code for char m
        0x00, 0x00, 0xE0, 0x7F, 0xE0, 0x7F, 0xC0, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xE0, 0x7F, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char n
        0x00, 0x00, 0x80, 0x1F, 0xC0, 0x3F, 0xE0, 0x70, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xE0, 0x70, 0xC0, 0x3F, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x00,  // Code for char o
        0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x8C, 0x01, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x8E, 0x03, 0xFC, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char p
        0x00, 0x00, 0xF8, 0x00, 0xFC, 0x01, 0x8E, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x8C, 0x01, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0x00,  // Code for char q
        0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x40, 0xC0, 0x7F, 0xC0, 0x7F, 0x60, 0x40, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xC0, 0x00, 0x00, 0x00,  // Code for char r
        0x00, 0x00, 0xC0, 0x11, 0xE0, 0x33, 0x60, 0x63, 0x60, 0x66, 0x60, 0x66, 0x60, 0x6C, 0xC0, 0x7C, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char s
        0x00, 0x00, 0x60, 0x00, 0xFC, 0x3F, 0xFC, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char t
        0x00, 0x00, 0xE0, 0x3F, 0xE0, 0x7F, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x30, 0xE0, 0x7F, 0xE0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char u
        0x00, 0x00, 0x60, 0x00, 0xE0, 0x03, 0x80, 0x0F, 0x00, 0x3C, 0x00, 0x70, 0x00, 0x3C, 0x80, 0x0F, 0xE0, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char v
        0x00, 0x00, 0xE0, 0x3F, 0x00, 0x60, 0x00, 0x70, 0x80, 0x3F, 0xE0, 0x00, 0xE0, 0x00, 0x80, 0x1F, 0x00, 0x70, 0x00, 0x60, 0xE0, 0x3F, 0x00, 0x00,  // Code for char w
        0x00, 0x00, 0x20, 0x40, 0x60, 0x60, 0xC0, 0x39, 0x80, 0x1F, 0x00, 0x06, 0x80, 0x1F, 0xC0, 0x39, 0x60, 0x60, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00,  // Code for char x
        0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x3C, 0x00, 0xF0, 0x40, 0xC0, 0x63, 0x00, 0x7F, 0x80, 0x1F, 0xF0, 0x03, 0x7C, 0x00, 0x0C, 0x00, 0x00, 0x00,  // Code for char y
        0x00, 0x00, 0x00, 0x70, 0x60, 0x78, 0x60, 0x7C, 0x60, 0x6E, 0x60, 0x66, 0x60, 0x63, 0xE0, 0x63, 0xE0, 0x61, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00,  // Code for char z
        0x00, 0x00, 0x80, 0x01, 0xC0, 0x03, 0xFC, 0x3F, 0x7E, 0x7E, 0x06, 0x60, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char {
        0x00, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char |
        0x00, 0x00, 0x06, 0x60, 0x06, 0x60, 0x7E, 0x7E, 0xFC, 0x3F, 0xC0, 0x03, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char }
        0x00, 0x00, 0x00, 0x03, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,  // Code for char ~
        0x00, 0x00, 0xFC, 0x3F, 0x04, 0x20, 0x04, 0x20, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // Code for char '
        0xF0, 0x3F, 0xF0, 0x7F, 0x06, 0x60, 0x06, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x06, 0x60, 0x06, 0x60, 0xF0, 0x7F, 0xF0, 0x3F, 0x00, 0x00,  // Code for char Ü
        0xC0, 0x1F, 0xE0, 0x3F, 0x76, 0x70, 0x36, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x36, 0x60, 0x76, 0x70, 0xE0, 0x3F, 0xC0, 0x1F, 0x00, 0x00,  // Code for char Ö
        0x00, 0x00, 0x38, 0x0C, 0x7C, 0x18, 0xEE, 0x18, 0xC6, 0x58, 0xC6, 0x78, 0xC6, 0x78, 0xC6, 0x18, 0xC6, 0x1D, 0x8C, 0x0F, 0x08, 0x07, 0x00, 0x00   // Code for char Ş
       };


Başlık: Ynt: Rotary enkoder ve P10 modül kullanarak alarmlı saat
Gönderen: e135193 - 27 Haziran 2018, 14:42:23
Merhabalar,

Asagidaki degisiklikleri yapiyorum ancak  1 den fazla panel eklesemde sonuç alamadim. Baska bir degisikligi ihtiyaç var mi ? Kullanmak istedigim yapi 64x16 matrix olacak sekilde yani yan yana iki panel.

yardimci olursaniz sevinirim.


unsigned int8 display_ram[32][4];

void write_data(unsigned int8 row_adr)
{
int8 i=0,j=0;
int8 k=7;
while(k!=255) // Bu Döngü ileriye dogru sayarsa panel sagdan
{j=31-k; // Sola Dogru yüklenir.
for (i=0;i<4;i++) // Satirlar dolduruluyor..
{
spi_write(display_ram[j][row_adr]);
j-=8;
}
k–;
}
output_high(LATCH);
delay_cycles(2);
output_low(LATCH);
}
Başlık: Ynt: Rotary enkoder ve P10 modül kullanarak alarmlı saat
Gönderen: gokhangokcen - 27 Haziran 2018, 15:42:17
@e135193 üstad ilgili konular burada açıklayıcı şekilde belirtilmiştir.

https://www.picproje.org/index.php/topic,69924.msg538544.html#msg538544
Başlık: Ynt: Rotary enkoder ve P10 modül kullanarak alarmlı saat
Gönderen: fide - 27 Haziran 2018, 17:26:23
@gokhangokcen eline sağlık. Güzel çalışma olmuş.
Başlık: Ynt: Rotary enkoder ve P10 modül kullanarak alarmlı saat
Gönderen: vedo35 - 27 Haziran 2018, 21:09:56
Çok teşekkürler. Favorilerime ekledim.
Başlık: Ynt: Rotary enkoder ve P10 modül kullanarak alarmlı saat
Gönderen: gokhangokcen - 28 Haziran 2018, 09:29:20
eski mesajımdaki düzenle butonu kaybolmuş.Yazmış olduğum kod ile ilgili "amatörce" videomu sizlerle paylaşmak istedim.Video editlemeyi bilmediğim için arkadan müzik vs. sesleri falan geliyor kusura bakmayın.
Projenin ortalarına doğru çektiğim video.

Başlık: Ynt: Rotary enkoder ve P10 modül kullanarak alarmlı saat
Gönderen: e135193 - 28 Haziran 2018, 09:53:49
Gökhan Hocam,

     Mucit23'ün kodunun üzerine geliştirme yaptığınızı söylemişsiniz. 8x8 fontunu kullanarak alt alta iki satır yazmak için ne gibi bir ayar yapmak gerekiyor ?
Başlık: Ynt: Rotary enkoder ve P10 modül kullanarak alarmlı saat
Gönderen: gokhangokcen - 28 Haziran 2018, 10:00:07
Ekran izin verilen boyuttan sonra otomatik alt satıra geçiyor.O şekilde ayarlanmış bir kütüphane idi. Yani örneğin 16x32 bir panelde çalışıyorsanız 8x5 font kullandığınızda ekrana maksimum 5 karakter sığıyor ve 6. karakteri ilave ettiğinizde otomatikman alt satıra iniyor.
Başlık: Ynt: Rotary enkoder ve P10 modül kullanarak alarmlı saat
Gönderen: e135193 - 28 Haziran 2018, 10:06:29
Ben @Mucit23'ün en yeni kütüphanesinde 8x8 font kullandığımda, yaptığım denemede alt satıra geçmiyor. problem 8x8 font kaynaklı olabilir mi ?

Ayrıca proje kodlarını ve şemasını paylaşmanız mümkün mü ? 
Başlık: Ynt: Rotary enkoder ve P10 modül kullanarak alarmlı saat
Gönderen: gokhangokcen - 28 Haziran 2018, 10:42:19
proje kodları yukarıda zaten.Tamamı var hatta eksiksiz bir vaziyette. (sadece kütüphane 18f4620.h math.h vs. gibi derleyicinin içinde olan kodlar yok)