/////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                 //
//                         Şadi Çağatay Öztürk tarafından yazılmıştır.                             //
//                                                                                                 //
/////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                 //
// LCD -+- sco_lcd.c -+- 25/01/2007                                                                //
//                                                                                                 //                                      //
// - void lcd_4bit_yolla( BYTE n )              : LCD denetleyicisine 4 bit yollar                 //
//                                                                                                 //
// - void lcd_8bit_yolla( BYTE adres, BYTE n )  : LCD denetleyicisine bir bayt yollar              //
//                                              : adres: RS n: Veri                                //
//                                                                                                 //
// - void lcd_ozel_karakter_doldur()            : Özel karakterleri CGRAM e yazar                  //
//                                                                                                 //
// - void lcd_ilklendir()                       : LCD yi ilklendirir                               //
//                                                                                                 //
// - void lcd_konuma_git(BYTE x, BYTE y)        : LCD ekranda x,y konuna gider. sol üst: 1,1       //
//                                                                                                 //
// - void lcd_karakter_yaz( char karakter)      : girilen karakteri LCD ye yazar                   //
//                                                                                                 //
//                                                                                                 //
/////////////////////////////////////////////////////////////////////////////////////////////////////

//TANIMLAMALAR
struct lcd_igneler
{
   int veri : 4;              // 0. 1. 2. 3.    : Veri iğneleri
   BOOLEAN enable;            // 4.             : Enable iğnesi
   BOOLEAN rs;                // 5.             : RS iğnesi
}lcd;

#if defined porta_lcd_kullan                      // A kapısı
   #byte lcd = 5
   #define set_tris_lcd(x) set_tris_a(x)
#elif defined portb_lcd_kullan                    // B kapısı
   #byte lcd = 6
   #define set_tris_lcd(x) set_tris_b(x)
#elif defined portc_lcd_kullan                    // C kapısı
   #byte lcd = 7
   #define set_tris_lcd(x) set_tris_c(x)
#elif defined portd_lcd_kullan                    // D kapısı
   #byte lcd = 8
   #define set_tris_lcd(x) set_tris_d(x)
#elif defined porte_lcd_kullan                    // E kapısı
   #byte lcd = 9
   #define set_tris_lcd(x) set_tris_e(x)
#endif

#define lcd_tip 2                              // 0=5x7, 1=5x10, 2=2 lines
#define lcd_satir_bir 0x00                      // 1. satır LCD RAM adresi
#define lcd_satir_iki 0x40                      // 2. satır LCD RAM adresi
#define lcd_satir_uc    0x14                      // 3. satır LCD RAM adresi
#define lcd_satir_dort  0x54                      // 4. satır LCD RAM adresi

//DEGISKENLER
BYTE const LCD_ILKLENDIRME_VERISI[4] = {0x28, 0x0C, 0x01, 0x06};

struct lcd_igneler const LCD_YAZ = {0,0,0}; 

void lcd_konuma_git( BYTE x, BYTE y);

//FONKSIYONLAR
void lcd_4bit_yolla( BYTE n )
{
   lcd.veri = n;
   delay_cycles(1);
   lcd.enable = 1;
   delay_us(2);
   lcd.enable = 0;
}

void lcd_8bit_yolla( BYTE adres, BYTE n )
{
   lcd.rs = 0;
   delay_us(40);
   lcd.rs = adres;
   delay_cycles(1);
   delay_cycles(1);
   lcd.enable = 0;
   lcd_4bit_yolla(n >> 4);
   lcd_4bit_yolla(n & 0x0F);
}

void lcd_ozel_karakter_doldur()
{
   BYTE a;
   for(a = 0 ; a<=1 ; ++a)
   {
      //0. karakter "ı"
      lcd_8bit_yolla(0x00,0x40);    // CGRAM Adresi: 0x40
      lcd_8bit_yolla(0x01,0x00);    // 0. satır 00000
      lcd_8bit_yolla(0x01,0x00);    // 1. satır 00000
      lcd_8bit_yolla(0x01,0x0C);    // 2. satır 01100
      lcd_8bit_yolla(0x01,0x04);    // 3. satır 00100
      lcd_8bit_yolla(0x01,0x04);    // 4. satır 00100
      lcd_8bit_yolla(0x01,0x04);    // 5. satır 00100
      lcd_8bit_yolla(0x01,0x0E);    // 6. satır 01110
      lcd_8bit_yolla(0x01,0x00);    // 7. satır 00000

      lcd_8bit_yolla(0x00,0x01);
      delay_ms(2);
   }

   for(a = 0 ; a<=1 ; ++a)
   {
      //1. karakter "ö"
      lcd_8bit_yolla(0x00,0x48);    // CGRAM Adresi: 0x48
      lcd_8bit_yolla(0x01,0x00);    // 0. satır 00000
      lcd_8bit_yolla(0x01,0x0A);    // 1. satır 01010
      lcd_8bit_yolla(0x01,0x00);    // 2. satır 00000
      lcd_8bit_yolla(0x01,0x0E);    // 3. satır 01110
      lcd_8bit_yolla(0x01,0x11);    // 4. satır 10001
      lcd_8bit_yolla(0x01,0x11);    // 5. satır 10001
      lcd_8bit_yolla(0x01,0x0E);    // 6. satır 01110
      lcd_8bit_yolla(0x01,0x00);    // 7. satır 00000

      lcd_8bit_yolla(0x00,0x01);
      delay_ms(2);
   }

   for(a = 0 ; a<=1 ; ++a)
   {
      //2. karakter "ü"
      lcd_8bit_yolla(0x00,0x50);    // CGRAM Adresi: 0x50
      lcd_8bit_yolla(0x01,0x00);    // 0. satır 00000
      lcd_8bit_yolla(0x01,0x0A);    // 1. satır 01010
      lcd_8bit_yolla(0x01,0x00);    // 2. satır 00000
      lcd_8bit_yolla(0x01,0x11);    // 3. satır 10001
      lcd_8bit_yolla(0x01,0x11);    // 4. satır 10001
      lcd_8bit_yolla(0x01,0x11);    // 5. satır 10001
      lcd_8bit_yolla(0x01,0x0E);    // 6. satır 01110
      lcd_8bit_yolla(0x01,0x00);    // 7. satır 00000

      lcd_8bit_yolla(0x00,0x01);
      delay_ms(2);
   }

   for(a = 0 ; a<=1 ; ++a)
   {
      //3. karakter "İ"
      lcd_8bit_yolla(0x00,0x58);    // CGRAM Adresi: 0x58
      lcd_8bit_yolla(0x01,0x04);    // 0. satır 00100
      lcd_8bit_yolla(0x01,0x00);    // 1. satır 00000
      lcd_8bit_yolla(0x01,0x0E);    // 2. satır 01110
      lcd_8bit_yolla(0x01,0x04);    // 3. satır 00100
      lcd_8bit_yolla(0x01,0x04);    // 4. satır 00100
      lcd_8bit_yolla(0x01,0x04);    // 5. satır 00100
      lcd_8bit_yolla(0x01,0x0E);    // 6. satır 01110
      lcd_8bit_yolla(0x01,0x00);    // 7. satır 00000

      lcd_8bit_yolla(0x00,0x01);
      delay_ms(2);
   }

   for(a = 0 ; a<=1 ; ++a)
   {
      //4. karakter "ş"
      lcd_8bit_yolla(0x00,0x60);    // CGRAM Adresi: 0x60
      lcd_8bit_yolla(0x01,0x00);    // 0. satır 00000
      lcd_8bit_yolla(0x01,0x00);    // 1. satır 00000
      lcd_8bit_yolla(0x01,0x0E);    // 2. satır 01110
      lcd_8bit_yolla(0x01,0x10);    // 3. satır 10000
      lcd_8bit_yolla(0x01,0x0E);    // 4. satır 01110
      lcd_8bit_yolla(0x01,0x01);    // 5. satır 00001
      lcd_8bit_yolla(0x01,0x0E);    // 6. satır 01110
      lcd_8bit_yolla(0x01,0x04);    // 7. satır 00100

      lcd_8bit_yolla(0x00,0x01);
      delay_ms(2);
   }


   for(a = 0 ; a<=1 ; ++a)
   {
      //5. karakter "ç"
      lcd_8bit_yolla(0x00,0x68);    // CGRAM Adresi: 0x68
      lcd_8bit_yolla(0x01,0x00);    // 0. satır 00000
      lcd_8bit_yolla(0x01,0x00);    // 1. satır 00000
      lcd_8bit_yolla(0x01,0x0E);    // 2. satır 01110
      lcd_8bit_yolla(0x01,0x10);    // 3. satır 10000
      lcd_8bit_yolla(0x01,0x10);    // 4. satır 10000
      lcd_8bit_yolla(0x01,0x11);    // 5. satır 10001
      lcd_8bit_yolla(0x01,0x0E);    // 6. satır 01110
      lcd_8bit_yolla(0x01,0x04);    // 7. satır 00100

      lcd_8bit_yolla(0x00,0x01);
      delay_ms(2);
   }

   for(a = 0 ; a<=1 ; ++a)
   {
      //6. karakter "Ü"
      lcd_8bit_yolla(0x00,0x70);    // CGRAM Adresi: 0x70
      lcd_8bit_yolla(0x01,0x0A);    // 0. satır 01010
      lcd_8bit_yolla(0x01,0x00);    // 1. satır 00000
      lcd_8bit_yolla(0x01,0x11);    // 2. satır 10001
      lcd_8bit_yolla(0x01,0x11);    // 3. satır 10001
      lcd_8bit_yolla(0x01,0x11);    // 4. satır 10001
      lcd_8bit_yolla(0x01,0x11);    // 5. satır 10001
      lcd_8bit_yolla(0x01,0x0E);    // 6. satır 01110
      lcd_8bit_yolla(0x01,0x00);    // 7. satır 00000

      lcd_8bit_yolla(0x00,0x01);
      delay_ms(2);
   }

   for(a = 0 ; a<=1 ; ++a)
   {
      //7. karakter "ğ"
      lcd_8bit_yolla(0x00,0x78);    // CGRAM Adresi: 0x78
      lcd_8bit_yolla(0x01,0x0E);    // 0. satır 01110
      lcd_8bit_yolla(0x01,0x00);    // 1. satır 00000
      lcd_8bit_yolla(0x01,0x0F);    // 2. satır 01111
      lcd_8bit_yolla(0x01,0x11);    // 3. satır 10001
      lcd_8bit_yolla(0x01,0x11);    // 4. satır 10001
      lcd_8bit_yolla(0x01,0x0F);    // 5. satır 01111
      lcd_8bit_yolla(0x01,0x01);    // 6. satır 00001
      lcd_8bit_yolla(0x01,0x0E);    // 7. satır 01110

      lcd_8bit_yolla(0x00,0x01);
      delay_ms(2);
   }

}

void lcd_ilklendir()
{
   BYTE i;
   set_tris_lcd(LCD_YAZ);

   lcd.rs = 0;
   lcd.enable = 0;
   delay_ms(15);

   lcd_4bit_yolla(0x03);
   delay_ms(5);

   for(i = 0 ; i<=1 ; ++i)
   {
      lcd_4bit_yolla(0x03);
      delay_us(160);
   }

   lcd_4bit_yolla(0x02);

   for(i=0 ; i<=3 ; ++i)
   {
      lcd_8bit_yolla(0x00,LCD_ILKLENDIRME_VERISI[i]);
   }

   lcd_ozel_karakter_doldur();
}

void lcd_konuma_git(BYTE x, BYTE y)
{
   BYTE adres;

   if(y == 1)
   {
      adres = lcd_satir_bir;
   }
   else if( y == 2)
   {
      adres = lcd_satir_iki;
   }
   else if( y == 3)
   {
      adres = lcd_satir_uc;
   }
   else if( y == 4)
   {
      adres = lcd_satir_dort;
   }
   else
   {
      adres = lcd_satir_bir;
   }
   adres = adres + x - 1;
   lcd_8bit_yolla(0x00,0x80 | adres);
}

void lcd_karakter_yaz( char karakter)
{
   switch (karakter)
   {
      case '\f'   :
      {
         lcd_8bit_yolla(0x00,0x01);
         delay_ms(2);
      }
      break;
      case '\n'   :
      {
         lcd_konuma_git(1,2);
      }
      break;
      case '\b'   :
      {
         lcd_8bit_yolla(0x00,0x10);
      }
      break;
      case 'ı'   :
      {
         lcd_8bit_yolla(0x01,0x00);
      }
      break;
      case 'ö'   :
      {
         lcd_8bit_yolla(0x01,0x01);
      }
      break;
      case 'ü'   :
      {
         lcd_8bit_yolla(0x01,0x02);
      }
      break;
      case 'İ'   :
      {
         lcd_8bit_yolla(0x01,0x03);
      }
      break;
      case 'ş'   :
      {
         lcd_8bit_yolla(0x01,0x04);
      }
      break;
      case 'ç'   :
      {
         lcd_8bit_yolla(0x01,0x05);
      }
      break;
      case 'Ü'   :
      {
         lcd_8bit_yolla(0x01,0x06);
      }
      break;
      case 'ğ'   :
      {
         lcd_8bit_yolla(0x01,0x07);
      }
      break;
      default     :
      {
         lcd_8bit_yolla(0x01,karakter);
      }
      break;
   }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////

