Bu dersimizde CCS C dilinde pic ile 2×16 karakter LCD bağlantısını ve temel fonksiyonlarını inceleyeceğiz. LCD üzerine farklı formatta verile yazdırmayı ele alacağız.
Karakter LCD’ler ASCII standartlarında basılabilir karakterleri destekleyen ekranlardır. ASCII standartlarındaki karakter setinde yalnızca ingilizce karakterler ve semboller bulunur. Yani Ç, ç, Ş, ş, Ö, ö, Ü, ü, Ğ, ğ karakterleri desteklemezler. Yalnızca karakter numaraları olan 0 ile 127 arasında olan basılabilir karakterler desteklenir. Desteklenmeyen Türkçe karakterleri yazdırabilmek için kendi karakter dizimizi oluşturmamız gerekmektedir.
ASCII karakterlerin listesini Karakter Kodları sayfamızda bulabilirsiniz.
Öncelikle karakter lcd’yi tanıyalım.
2×16 değerindeki bir karakter LCD ekranda, 2 satır ve her satırda 16 karakter gösterebilme özelliği bulunur. Yukarıda görüldüğü üzere karakter LCD’de 16 adet pin vardır. Bu pinlerin ne işe yaradıklarını açıklamaya çalışalım.
CCS C dili ile karakter lcd kullanmak için önce LCD pinlerinin denetleyicimizin hangi pinlerine bağlı olduğunu belirtmek için sabitler tanımlayacağız. Sabitler daha önce belirttiğimiz üzere programın başında bir kez tanımlandıktan sonra değeri program boyunca değişmeyecek olan yapılarımızdı. Sabitleri tanımlamak için #define önişlemci komutundan yararlanacağız.
1 2 3 4 5 6 7 |
#define LCD_ENABLE_PIN PIN_D0 // LCD Enable pini D0 pinine bağlı #define LCD_RS_PIN PIN_D1 // LCD RS pini D1 pinine bağlı #define LCD_RW_PIN PIN_D2 // LCD RW pini D2 pinine bağlı #define LCD_DATA4 PIN_D3 // LCD DATA4 pini D3 pinine bağlı #define LCD_DATA5 PIN_D4 // LCD DATA5 pini D4 pinine bağlı #define LCD_DATA6 PIN_D5 // LCD DATA6 pini D5 pinine bağlı #define LCD_DATA7 PIN_D6 // LCD DATA7 pini D6 pinine bağlı |
Yukarıda tanımladığımız sabitlere göre, LCD bağlantımız aşağıdaki gibi olacak.
Sabitlerimizi tanımladıktan sonra LCD kütüphanemizi projemize dahil ediyoruz. Bunu #include önişlemci komutu ile gerçekleştireceğiz;
1 |
#include <LCD.c> // LCD kütüphanesini projeye dahil et |
LCD kütüphanemizde kullanacağımız başlıca fonksiyonlar şunlardır;
Bu fonksiyonumuz LCD işlemlerini başlatmak için main fonksiyonu içerisinde kullanılır. Herhangi bir parametre almaz ve geriye değer döndürmez.
1 2 3 |
void main(){ // main fonksiyonumuz lcd_init(); // lcd'yi başlat } |
Bu fonksiyonumuz LCD’ye bir karakter dizesi yazdırmak için kullanılır. Parantezler arasına LCD ye gönderilecek olan karakterler tırnak içerisinde yazılır.
Örnek:
1 |
lcd_putc("MERHABA"); // LCD'ye "MERHABA" yaz |
lcd_putc() fonksiyonu ile LCD’ye birtakım komutlar da gönderebiliriz. Bu komutlar;
Örneğin LCD ekranındaki yazıyı temizleyelim ve ekranın birinci satırına MERHABA, ikinci satırına ise koddefteri.net yazalım;
1 2 3 4 |
lcd_putc("\f"); // LCD ekranındaki yazıları temizle lcd_putc("MERHABA"); // Ekrana MERHABA yaz lcd_putc("\n") // Alt satıra geç lcd_putc("koddefteri.net"); // Alt satıra koddefteri.net yaz |
Tüm bu komutları tek satır ile de yazabiliriz;
1 |
lcd_putc("\fMERHABA\nkoddefteri.net"); // yukarıdaki kodları tek satırda yazdık |
Bu gonksiyonumuz LCD ekranında yazan yazının dilediğimiz pozisyondaki bir karakterini almak için kullanılır. Integer türünde 2 adet parametre alır. Birinci parametre sütunu, ikinci parametre ise satırı belirtir. Geriye ise char türünden bir parametre döndürür. Eğer her satırı x, her sütun değerini y olarak ele alırsak, fonksiyona göndereceğimiz parametre lcd_getc(y,x) şeklinde girilmelidir.
Örneğin ekranımızın ilk satırında MERHABA, ikinci satırında ise KOD DEFTERİ yazdığını varsayalım. Eğer biz ikinci satırın birinci karakteri olan “K” karakterini almak istersek lcd_getc(1,2) komutunu kullanmalıyız. Kodumuz şu şekilde olacak;
1 2 3 4 |
lcd_putc("\fMERHABA\nKOD DEFTERİ"); // Ekranın ilk satırına MERHABA, ikinci satırına KOD DEFTERİ yaz char karakter = lcd_getc(1,2); // ikinci satırın ilk karakterini al ve karakter değişkenine aktar lcd_putc("\f"); // ekranı temizle lcd_putc(karakter); // aldığın karakteri ekrana yaz |
Bu komutumuz ise imlecimizi ekranın herhangi bir konumuna götürmek için kullanılır. Satır ve sütun olmak üzere integer türünde 2 adet parametre alır. İlk parametre sütunu, ikinci parametre ise satırı temsil eder.
Örnek olarak biraz önce LCD’den aldığımız K karakterini ilk satırın son sütununa yazdıralım;
1 2 3 4 5 |
lcd_putc("\fMERHABA\nKOD DEFTERİ"); // Ekranın ilk satırına MERHABA, ikinci satırına KOD DEFTERİ yaz char karakter = lcd_getc(1,2); // ikinci satırın ilk karakterini al ve karakter değişkenine aktar lcd_putc("\f"); // ekranı temizle lcd_gotoxy(16,1); // İmleci birinci satırın 16. sütununa sabitle lcd_putc(karakter); // aldığın karakteri ekrana yaz |
Yukarıdaki kodumuzun dördüncü satırında, imleci birinci satırın onaltıncı sütununa sabitledik ve karakter değişkenizmideki K değerini ilk satırın en sonuna yazdırdık.
lcd_cursor_on fonksiyonumuz imleci açıp kapatmaya yarayan fonksiyonumuzdur. int1 (boolean) türü 1 adet parametre alır. Eğer parantezler içerisine 0 değeri girilirse imleç kapalı, eğer 1 değeri girilirse imleç açık konuma getirilir. İmleç bir kez açık konuma getirildiğinde, tekrar kapat komutu gelinceye kadar ya da imleç ekrandan taşıncaya kadar ekranda görünecektir.
1 2 |
lcd_cursor_on(1); // imleci ekranda göster lcd_cursor_on(0); // imleci ekranda gizle |
printf fonksiyonu aslında LCD’ye özgü bir fonksiyon değildir. Bu fonksiyon genel yazdırma işlemi için kullanılır. Daha sonra göreceğimiz RS232 ile haberleşme işlemlerinde de bu fonksiyonu sıklıkla kullanacağız. Bu fonksiyonu LCD ile kullanmak için ilk parametre olarak putc fonksiyonunu vermeliyiz. Ardından karakter ve sayı türü parametreleri verebiliriz.
1 |
printf(lcd_putc, "SELAM"); // Ekrana SELAM yazdır |
printf fonksiyonu ile aynı anda hem karakter hem de sayı türü verileri ekrana yazdırabiliriz.
LCD’ye yazılacak her bir veri türü için formatlar mevcuttur. Fortmatlar % karakteri ile başlarlar ve sonrasıda formatın belirteci yazılır. Belirli formattaki verileri yazdırmak için kullanılacak formatlar şunlardır;
Şimdi bu formatları örnek kodlarla açıklayalım;
String formatı örneği %s;
1 2 3 4 5 6 |
char metin1[] = "CCS"; char metin2[] = "Dersleri"; printf(lcd_putc, "%s", metin1); // Ekrana CCS yazar delay_ms(1000); // 1 saniye bekler printf(lcd_putc,"\f"); // ekranı temizler printf(lcd_putc, "%s PIC %s", metin1, metin2); // Ekrana CCS PIC Dersleri yazar |
İnteger formatı örneği %d;
1 2 |
int sayi = 35; printf(lcd_putc, "Sayi Degeri = %d", sayi); // Ekrana Sayi Degeri = 35 yazar |
Float formatı örneği %f, %g, %e;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
float miktar = 95.855; printf(lcd_putc, "\fBakiye: %f", miktar); // Bakiyeniz = 95.85 yazar delay_ms(1000); printf(lcd_putc, "\fBakiye: %.1f", miktar); // Bakiyeniz = 95.8 yazar delay_ms(1000); printf(lcd_putc, "\fBakiye: %.3f", miktar); // Bakiyeniz = 95.855 yazar delay_ms(1000); printf(lcd_putc, "\fBakiye: %g", miktar); // Bakiyeniz = 95.86 yazar delay_ms(1000); printf(lcd_putc, "\fBakiye: %.1g", miktar); // Bakiyeniz = 95.9 yazar delay_ms(1000); printf(lcd_putc, "\fBakiye: %.3g", miktar); // Bakiyeniz = 96.855 yazar delay_ms(1000); printf(lcd_putc, "\fBakiye: %.2e", miktar); // Bakiyeniz = 9.58E+01 yazar |