2 Ağustos 2015 Pazar

SDCC ile LCD Uygulaması-3 Türkçe karakterler (16F877A) -Ders12



lcdturkce.c” dosyası (Ana dosyamız)
==================================================
// Durali Kiraz 2015
// PIC16F877A için hazırlanmıştır.

#include "ayarlar.h"
#include "bizim_lcd.h" // LCD kütüphanesi tanımlanıyor
#include "delay.h"

void TurkceKarakterleriHazirla(void)
{
  // CGRAM'de 1. Adrese "Ç" Karakteri Kaydediliyor
  lcd_komut(0x40);veri_yolla(14);
  lcd_komut(0x41);veri_yolla(17);
  lcd_komut(0x42);veri_yolla(16);
  lcd_komut(0x43);veri_yolla(16);
  lcd_komut(0x44);veri_yolla(16);
  lcd_komut(0x45);veri_yolla(21);
  lcd_komut(0x46);veri_yolla(14);
  lcd_komut(0x47);veri_yolla(0);
  // CGRAM'de 1. Adrese "Ğ" Karakteri Kaydediliyor
  lcd_komut(0x48);veri_yolla(14);
  lcd_komut(0x49);veri_yolla(0);
  lcd_komut(0x4A);veri_yolla(15);
  lcd_komut(0x4B);veri_yolla(16);
  lcd_komut(0x4C);veri_yolla(19);
  lcd_komut(0x4D);veri_yolla(17);
  lcd_komut(0x4E);veri_yolla(15);
  lcd_komut(0x4F);veri_yolla(0);
  // CGRAM'de 2. Adrese "İ" Karakteri Kaydediliyor
  lcd_komut(0x50);veri_yolla(4);
  lcd_komut(0x51);veri_yolla(0);
  lcd_komut(0x52);veri_yolla(4);
  lcd_komut(0x53);veri_yolla(4);
  lcd_komut(0x54);veri_yolla(4);
  lcd_komut(0x55);veri_yolla(4);
  lcd_komut(0x56);veri_yolla(4);
  lcd_komut(0x57);veri_yolla(0);
  // CGRAM'de 3. Adrese "Ö" Karakteri Kaydediliyor
  lcd_komut(0x58);veri_yolla(10);
  lcd_komut(0x59);veri_yolla(0);
  lcd_komut(0x5A);veri_yolla(14);
  lcd_komut(0x5B);veri_yolla(17);
  lcd_komut(0x5C);veri_yolla(17);
  lcd_komut(0x5D);veri_yolla(17);
  lcd_komut(0x5E);veri_yolla(14);
  lcd_komut(0x5F);veri_yolla(0);
  // CGRAM'de 4. Adrese "Ş" Karakteri Kaydediliyor
  lcd_komut(0x60);veri_yolla(14);
  lcd_komut(0x61);veri_yolla(17);
  lcd_komut(0x62);veri_yolla(16);
  lcd_komut(0x63);veri_yolla(14);
  lcd_komut(0x64);veri_yolla(1);
  lcd_komut(0x65);veri_yolla(21);
  lcd_komut(0x66);veri_yolla(14);
  lcd_komut(0x67);veri_yolla(0);
  // CGRAM'de 5. Adrese "Ü" Karakteri Kaydediliyor
  lcd_komut(0x68);veri_yolla(10);
  lcd_komut(0x69);veri_yolla(0);
  lcd_komut(0x6A);veri_yolla(17);
  lcd_komut(0x6B);veri_yolla(17);
  lcd_komut(0x6C);veri_yolla(17);
  lcd_komut(0x6D);veri_yolla(17);
  lcd_komut(0x6E);veri_yolla(14);
  lcd_komut(0x6F);veri_yolla(0);
  // CGRAM'de 6. Adrese "I" Karakteri Kaydediliyor
  lcd_komut(0x70);veri_yolla(4);
  lcd_komut(0x71);veri_yolla(4);
  lcd_komut(0x72);veri_yolla(4);
  lcd_komut(0x73);veri_yolla(4);
  lcd_komut(0x74);veri_yolla(4);
  lcd_komut(0x75);veri_yolla(4);
  lcd_komut(0x76);veri_yolla(4);
  lcd_komut(0x77);veri_yolla(0);
  // CGRAM'de 7. Adrese "'" Karakteri Kaydediliyor
  lcd_komut(0x78);veri_yolla(12);
  lcd_komut(0x79);veri_yolla(18);
  lcd_komut(0x7A);veri_yolla(18);
  lcd_komut(0x7B);veri_yolla(12);
  lcd_komut(0x7C);veri_yolla(0);
  lcd_komut(0x7D);veri_yolla(0);
  lcd_komut(0x7E);veri_yolla(0);
  lcd_komut(0x7F);veri_yolla(0);

  lcd_komut(BirinciSatir);
}

void main(void) // Ana fonksiyon alanı
{
   TRISB=0x00; // LCD'ye bağlı portlar çıkış yapılıyor
   TRISC=0x00;
   PORTB=0x00;
   PORTC=0x00;

   lcd_baslat(); // LCD ilk ayarları yapılıyor
   TurkceKarakterleriHazirla();

   for(;;) //Sonsuz döngüye giriliyor
   {
      //veri_yolla(0); // 1. karekter yazdırılıyor
      lcd_yaz("ME");
      veri_yolla(4); //Ş harfi yazdır
      lcd_yaz("HUR ");
      veri_yolla(0); //Ç harfi yazdır
      lcd_yaz("UBUK");
      ms_delay(1000);

      lcd_konumlanxy(2,1); // İkinci satıra geçiliyor
      lcd_yaz("TUR");
      veri_yolla(4); //Ş harfi yazdır
      lcd_yaz("USU Y");
      veri_yolla(2); //İ harfi yazdır
      lcd_yaz("Y");
      veri_yolla(2); //İ harfi yazdır
      lcd_yaz("N");
      ms_delay(1000);

      lcd_ekranisil();
      ms_delay(500);
  }

}
==================================================

Bu dersimizde Ders11 den farklı olan tek dosyamız yukardaki ana dosymızdır. Diğer bizim_lcd.c, bizim_lcd.h, delay.c, delay.h, ayarlar.h dosyalarında herhangi bir değişiklik yoktur. Önceki dersten bu dosyaları isterseniz inceleyebilirsiniz.

Bilindiği üzere 16x2 karakter lcd lerin hafizasında bizim kullandığımız türkçe karakterler yoktur. Ancak 8 karakterin sığabileceği boş hafıza alanı mevcuttur. İşte biz kendi tanımladığımız Türkçe karakterleri yada özel karakterleri bu alanlara pic programımızı başlatırken tanımlıyor ve ardından kullanıyoruz. Burada önemli olan hususlardan biride bu tanımlanan özel karakterlerin pic mikrodenetleyicimizin elektriği kesildiği anda hafızadan kaybolmasıdır. Mikrodenetleyicimiz her elektriklenip çalışmaya başladığında bizim yazılımsal olarak bu özel karakterleri başlatmamızın gerekli olmasıdır. Peki özel karakter lcd ye nasıl tanımlanır isterseniz biraz bundan bahsedelim.

Örnek olarak “Ç” harfinin tanımlanmasını ele alalım. CGRAM hafızasının boş karakter alanlarının ilkinin başlangıç adresi 0x40 adresidir. Bizim her karakterimiz için 8 satır tanımlama alanı vardır. En alttaki alan genelde boş bırakılır kullanılmaz. Bu yüzden en alt satırı sıfırla tamamlayacağız. Sırayla Ç harfine ait 8 satırı oluşturalim

Hafıza adresi
Gönderilen Değer - Ondalık
Gönderilen Değer – İkilik
0x40
14
00001110
0x41
17
00010001
0x42
16
00010000
0x43
16
00010000
0x44
16
00010000
0x45
21
00010101
0x46
14
00001110
0x47
0
00000000

Biz “Ç” harfini CGRAM hafıza da sırayla yukardaki satırları hafıza adresi ile belirtilen adrese göndererek oluştururuz. Şu durumda “Ç” harfinin nasıl oluştuğunu gözlerinden canlandıramayanlar için ikilik değerlerdeki “1” sayılarını koyulaştırıp aşağıda görmeniz sunuyoruz.




0 0 0 0 1 1 1 0
0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 1 0 1 0 1
0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0

Şu anda artık “Ç” harfini görüyor olmalısınız. Şayet halâ göremiyorsanız en yakın arkadaşınızdan yardım almanızı öneririm. :) Dilerseniz kendi hayâlinizdeki “Ç” yatık harfide bu mantığı kullanarak oluşturabilirsiniz. Hatta karakter lcd için özel karakterleri oluşturan programcıklarda internette mevcuttur. Bunlarla rahatlıkla kendi özel karakterlerinizi oluşturabilirsiniz.

Bu derste TurkceKarakterleriHazirla isimli fonksiyonu oluşturduk. İsminden anlaşılacağı gibi yukarda anlattığımız mantıkla 8 adet Türkçe karakteri CGRAM hafızasında geçici olarak oluşturduk. Main isimli ana fonksiyonumuzda lcd_baslat(); isimli fonksiyonun çağrılmasından sonra Türkçe karakterlerimizi oluşturan fonksiyonu çağırdık. Sonrasında Yazdırmak istediğimiz Türkçe karakterlerden oluşan iki satırlık mesajı parçalar halinde Lcd ye gönderdik. Bu kodda biz biraz kullanışlılığı az olan bir yöntemle Türkçe karakterleri parça parça gönderip diğer normal ingilizce karakterleri lcd_yaz fonksiyonu ile gönderdik. Bu şekilde programın çalışmasını engelleyecek bir sıkıntı yoktur. Eğer siz kodunuzda internette bulunan flex_lcd.c dosyasında olduğu gibi doğrudan lcd_yaz(“ÇUBUK TURŞUSU”) şeklinde tek bir fonksiyonda derli toplu bir şekilde bu işi yapmak isterseniz bizim_lcd.c dosyasındaki lcd_yaz() isimli fonksiyonda basit bir iki değişiklik yapabilirsiniz. Örnek verecek olursak

if (GelenKarakter == 'Ç')
     veri_yolla(0); //Ç harfi
:
:

şeklinde kod düzeltmesiyle fonksiyonunuzu daha işlevsel yapabilirsiniz.

Kodumuzun derle aşaları Ders11 de anlatıldığının aynı şekildedir. Biz yine burada nasıl derleme yapılacağını tekrar verelim :

sdcc --use-non-free -mpic14 -p16f877a -I path/to/pic14/includes -c bizim_lcd.c
sdcc --use-non-free -mpic14 -p16f877a -I path/to/pic14/includes -c delay.c
sdcc --use-non-free -mpic14 -p16f877a -I path/to/pic14/includes -L path/to/pic14/libraries -Wl, lcdturkce.c bizim_lcd.o delay.o

(En alt satır sığmadığı için aşağıya kaymıştır. Bir üstteki satırın devamıdır)

Bu derleme adımlarının açıklamalarını Ders 11 de ayrıntılı bir şekilde bulabilirsiniz. Bir sonraki derste görüşmek üzere hoşçakalın.


duralikiraz.blogspot.com
02 Ağustos 2015

Muvaffakiyet Allahtandır”

Hiç yorum yok:

Yorum Gönder