LCD Kullanımı:
Yazığımız programlardan elde edeceğimiz neticeleri görsel olarak takip edebilmek amacı ile Pic’lere muhtelif büyüklüklerde LCD ekranlar bağlandığını biliyorsunuz. Şimdi Pic ile LCD kullanımı konusunda detaylı bir uygulama yapacağız ve LCD kullanımını her yönü ile öğreneceğiz.
Önce biraz LCD leri tanıyalım. Bu konuda en çok kullanılan LCD 2 sıra ve her sırada 16 karakter yer alan LCD ler kullanılır. Bunların 4 sıralı olanları olduğu gibi her sırada karakter adedi 40 ‘a kadar olanlarda mevcuttur.
LCD ler standart olarak 14 bacaklı (pinli) ekranlardır. Bacak numaralarına göre fonksiyonları aşağıda belirtilmektedir.
- Nolu Pin : GND bacağıdır.
- +5V giriş bacağı
- Kontrast ayara bacağı olup genelde 22 K lık trimpot’un bir bacağı GND ye diğer uç bacağı +5V’a ve orta bacağı da bu kontrast bacağına bağlanarak trimpot ile ekran koyuluk açıklık ayarı yapılır.
- RS – Reset Bacağı
- R/W yazma okuma set etme bacağı.
- E – Enable bacağı.
- D0 – Data Bacağı sıfır nolu bit.
- D1 – Data Bacağı 1 nolu bit.
- D2 – Data Bacağı 2 nolu bit.
- D3 – Data Bacağı 3 nolu bit.
- D4 – Data Bacağı 4 nolu bit.
- D5 – Data Bacağı 5 nolu bit
- D6 – Data Bacağı 6 nolu bit
- D7 – Data Bacağı 7 nolu bit.
Bazı modellerinde 15. ve 16. cı bacaklarda mevcuttur. Bunlar back light denilen arkadan ekran aydınlatması için kullanılan Led ışığının voltaj besleme uçlarıdır. Bu uçlar ayrı verildiği gibi 15 ve 16. cı bacaklar olarak da verilebilir.
LCD nin kullanımı ile ilgili protokol’e biz burada girmeyeceğiz. Bu işi bize BASIC yapacak. Yalnızca LCD nin 8 adet (8 bitlik) Data giriş bacakları olduğunu ve istenirse LCD ile 8 yerine 4 bit üzerinden haberleşme yapılabileceğini belirtmek istiyorum. Aslında 8 bit’in tek seferde verilmesi yerine ince ilk 4 bit sonrada ikinci 4 bit verilerek 8 bitlik bilgi tamamlanmaktadır ve bu işi yine BASIC yapmaktadır. Faydası ile 8 adet yerine 4 adet Data bacağı kullanarak Pic’de bize 4 adet fazladan bacak bırakmasıdır ve bu yüzden kullanım açısından daima tercih edilmektedir.
LCD nin Pic ile birlikte kullanılması için bazı kurallar vardır. Bunların başında DEFINE komutu gelmektedir. Bu komut LCD nin hangi porta bağlı, Kaç data bacağı kullanıyor gibi bilgileri Pic’e vermekte kullanılır.
Kısa bir örnekle açıklayalım.
Vereceğimiz örnekte LCD tanımlama için kullanılması gereken tüm DEFINE komutlarını ve ne amaçla kullanıldıklarını göreceksiniz.
DEFINE LCD_DREG PORTB 'LCD data bacakları hangi porta bağlı?
Bu örnekte LCD Data bacaklarının PortB ye bağlı olduğu belirtiliyor.
DEFINE LCD_DBIT 4 'LCD data bacakları hangi bitten başlıyor?
Bu örnekte Data bacaklarının PortB nin 4. bitinden itibaren başladığı belirtiliyor.
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı Hangi Porta bağlı?
Bu örnekte LCD Enable bacağının PortB ye bağlı olduğu belirtiliyor.
DEFINE LCD_EBIT 3 'LCD Enable Bacağı Hangi bite bağlı ?
Bu örnekte LCD Enable bacağının PortB.3 (3.bit) e bağlı olduğu belirtiliyor.
DEFINE LCD_RWREG PORTB ‘LCD RW Bacağı PortB de bağlı
Bu örnekte LCD RW bacağının PortB de bağlı olduğu belirtiliyor.
DEFINE LCD_RWBIT 2 ‘LCD RW Bacağı 2. bite bağlı
Bu örnekte LCD RW bacağının 2 bite bağlı olduğu belirtiliyor.
Şayet LCD den geriye karakter okuması yapılmayacak ise RW bacağı daima GND ye bağlı durabilir. Bu durumda 1 bacaktan tasarruf edilebilir. İleride buna ait örnekler görülecektir. Burada komutun anlaşılması için biz bu bacağı da PortB ye bağlı kabul edeceğiz.
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı Hangi Porta bağlı ?
Bu örnekte LCD RS bacağının B portuna bağlı olduğu belirtiliyor.
DEFINE LCD_RSBIT 1 'LCD RS bacağı Hangi Bite bağlı ?
Bu örnekte LCD RS bacağının PortB.1 (1. bit) e bağlı olduğu belirtiliyor.
DEFINE LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
Bu örnekte LCD nin PortB ye kaç data bacağı ile bağlandığını açıklıyor.
DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor
Bu örnekte LCD nin Kaç sıra çalıştığı açıklanıyor.
Standart kullanımlarda buraya kadar olan DEFINE tanımlamaları yeterlidir. Ancak bazen yüksek frekanslı 10 MHz ve üzeri çalışma frekanslarında LCD ekranına yazılan karakterler hızdan dolayı izlenemez hale gelebilirler. Bunu önlemek için gerek komut verildikten sonra ve gerekse DATA verildikten sonra standart bir bekleme süresi tanımlanır ve karakterler izlenebilir hale gelir.
Bu komutlarda sırası ile
DEFINE LCD_COMMANDUS 1000 '1000 değer mikro saniye cinsinden gecikme süresi olup isteğe bağlı olarak artırılıp azaltılabilir. Komut sonrası gecikme süresini belirler.
'DEFINE LCD_DATAUS 225 'Data bilgisinden sonraki gecikmeleri tanımlar.
Buraya kadar verdiğimiz örneklerle LCD nin Pic’e bağlantısını tanımlamış olduk.
Program içinde LCD nin kullanımına ait bazı açıklamaları verdikten sonra örnek programımıza geçeceğiz.
LCD ye bir bilgi (emir) veya Data (karakter) göndermek için kullanılan komut;
LCDOUT dır. Bu komut şayet LCDOUT $FE eklentisi ile birlikte kullanılır ise LCD ye bir komut gönderileceği anlamına gelir. Örneğin Ekranın silinmesi için LCDOUT $FE,1 komutunu verdiğimizde tüm ekrandaki bilgiler silinir. Program içinde sıklıkla kullandığımız bazı komutlar vardır. Bunlar, Yazma konumunu (imleç in yeri) ekranın en başına almak LCDOUT $FE,2 ,
Yazma konumunu (imleç in yerini) İkinci satır başına almak için LCDOUT $FE,$C0 gibi komutlar verilir. Ayrıca yazma konumunu ekranın herhangi bir yerine almak için ekran adresi kullanılır.
İlk satır birinci karakterin adresi $80, ikinci karakterin adresi $81, ve 7. karakterin adresi ise $86 dır. İkinci sırada bu adresler ilk karakter için $C0, ikinci için $C1 ve sırası ile $C2-$C3-$C4… şeklinde gitmektedir. Örnek olarak ilk sıra 7. karakterden itibaren “MERHABA” yazmak istersek şu komutu vermeliyiz.
LCDOUT $FE,$86,”MERHABA”
Öğrendiklerimizi artık bir programla kullanalım isterseniz.
Örnek Program 3a:
Ekranda ilk satırdan itibaren “BASIC DERSLERI” yazıp ikinci satıra ise “DERS No:3” ifadesini yazabileceğimiz programı gerçekleştirelim. Mikroişlemcimiz yine 16F84 olsun. LCD B portuna bağlı olacak ve 4 bit data bağlantısı olacaktır. Enable pini 3 nolu bit’e , R/ W pini 2 nolu bit’e ve RS pini ise 1 nolu bite bağlı olacaktır. İşte Programımız.
DEFINE LCD_DREG PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 3 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTB ‘LCD RW Bacağı PortB de bağlı
DEFINE LCD_RWBIT 2 ‘LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 1 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 ‘LCD 2 sıra olarak çalışıyor.
TRISA=0 ‘A portu çıkış olarak ayarlandı.
TRISB=0 ‘B portu çıkış olarak ayarlandı.
LOW PORTB.2 ‘RW bacağı ekrana yazmaya imkan vermek için LOW yapıldı.
PAUSE 200 ‘ LCD nin kullanıma hazır hale gelebilmesi için gerekli süre
LCDOUT $FE,1 ‘Önce Ekranı siliyoruz.
LCDOUT “BASIC DERSLERI” ‘ilk sıra baştan itibaren yazdırıyoruz. Aslında bu komutu başka bir şekilde de yazabiliriz, şöyle
‘ LCDOUT $FE,2,”BASIC DERSLERI”
LCDOUT $FE,$C0,”DERS No: 3” ‘ikinci satıra yazdırıldı.
End ‘Program sonu
Aynı programı RW bacağını direkt GND ye bağlıyarak da çalıştırabiliriz. Bu durumda ;
LOW PortB.2 komutuna ihtiyaç yoktur.
Devre Şeması :
Ekran kullanımında en çok karşılaşılan şekillerden birisi sabit bir karakter dizisinden sonra bir değişkene bağlı olarak değer gösterme işi dir. Diyelim ki ortam sıcaklığını ölçüyorsunuz ve bunu ekranda gösteriyorsunuz.
Bu durumda ekranda “SICAKLIK : 23,3 oC” ibaresine benzer bir görüntü olacaktır. Genelde 23 değeri bir değişkende tutulur ve 0,3 değeri ise ayrı bir değişkende tutulur. Şimdi ISI=23 ve ONDA=3 olduğunu kabul ederek bunun ekranda gösterilme şeklini inceleyelim.
LCDOUT “SICAKLIK :” komutu ekrana SICAKLIK : ibaresini yazacaktır.
Devamı için LCDOUT “ SICAKLIK : “,#ISI şeklinde bir ifade yazılır ise;
Ekrana çıkan şekli < SICAKLIK : 23 > olacaktır. Geriye ondalık kısmını yazdırmak kalıyor.
Bunun için LCDOUT “SICAKLIK : “,#ISI,”,”,DEC1 ONDA ifadesini yazmamız gerekiyor.
#ISI komutundan sonra gelen virgül peşine ikinci bir komut geleceğini gösteriyor. Arkasında yer alan “,” ifadesi ekrana 23 rakamından sonra bir virgül koyacaktır. Peşinden gelen DEC1 ise sonraki gelen ifadenin Desimal bir sayı olduğunu ve 1 hanesinin yazılacağını gösterir. Daha sonraki ise zaten ONDA değişkeni olup 3 sayısını tutmaktadır. Sonuç olarak ekranda;
SICAKLIK : 23,3 olarak görülür.
Bu ifadelerin devamına derece işareti ve C karakterini ilave edince işlem tamam olacaktır. Ancak LCD karakterleri içinde derece işareti yoktur. Bunun nasıl oluşturulduğunu ileride göreceğiz. Şimdilik yalnızca C karakterini koymaya çalışalım. Komutun tamamı;
LCDOUT “SICAKLIK : “,#ISI,”,”,DEC1 ONDA, “ C” şeklinde verilir.
Ekranda gösterilecek sayı formatlarını verdikten sonra ikinci örneğimize geçeceğiz.
Sayılarımız Desimal , Hexadesimal ve Binary olarak gösteriliyorlardı.
Bunları LCD de göstermek için aşağıdaki formatları kullanıyoruz.
Desimal Sayılar :
Sayıyı direkt olarak göstermek için başına # ilave edilir. #ISI gibi.
Çok haneli sayılarda hane sayısını kısıtlamak için DEC komutu kullanılır. DEC1 tek hane, DEC2 iki hane DEC3 üç hane gösterir. Olmayan haneler yerine akrana sıfır çıkar. Örneğin ISI=23 ise ve biz ekrana DEC3 ISI yazmış isek ekrandaki görüntüsü 023 olarak izlenir.
HEX Sayılar.:
Değişken veya sayı başına HEX veya HEX1 veya HEX2 gibi ifadeler yazılır. Rakamlar gösterilecek hane sayısını ifade etmektedir.
Binary Sayılar:
Binary sayılar başların BIN (veya BIN1-BIN2 – BIN3..) ifadesi koyularak gösterilirler.
Proje 2b :
Bu örneğimizde değişkenlere bağlı sayıların ekranda gösterilmesi konusunu işleyeceğiz.
16F84 işlemci ve 2X16 LCD kullanarak Bazı sayı formatlarını ekranda izleyelim.
Program önce bir SAYI değişkenini kullanacak ve sıfırdan başlayıp sayı değerini her seferinde bir artırarak oluşan yeni SAYI değerini üst satırda Desimal alt Satırda Binary olarak gösterecek.
İkinci adımda ise Yine sıfırdan başlayarak bir SAYI değişkeni değeri 10’ar artırılacak ve elde edilen yeni değer üst satırda Desimal, alt satırda ise HEX olarak gösterilecektir. İzleyelim.
DEFINE LCD_DREG PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 3 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTB ‘LCD RW Bacağı PortB de bağlı
DEFINE LCD_RWBIT 2 ‘LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 1 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 ‘LCD 2 sıra olarak çalışıyor.
TRISA=0 ‘A portu çıkış olarak ayarlandı.
TRISB=0 ‘B portu çıkış olarak ayarlandı.
SAYI VAR BYTE ‘Sayı değişkenini Byte olarak ayarladık . Maksimum 255 değeri
LOW PORTB.2 ‘RW bacağı ekrana yazmaya imkan vermek için LOW yapıldı.
PAUSE 200 ‘ LCD nin kullanıma hazır hale gelebilmesi için gerekli süre
LCDOUT $FE,1 ‘ Ekran silindi
SAYI=0 ‘SAYI ilk değeri sıfır olarak verildi.
‘-------------------------------ANA PROGRAM BAŞLANGICI ---------------------------------------------
BASLA:
LCDOUT “ SAYI = “,#SAYI ‘ilk satıra Sayı Desimal olarak yazıldı
LCDOUT $FE,$C0,” Binary = “,BIN SAYI ‘ikinci sıraya Binary olarak yazıldı.
PAUSE 500 ‘500 ms bekliyoruz.
SAYI=SAYI+1 ‘SAYI bir artırıldı.
IF SAYI<100 THEN BASLA ‘SAYI mız 100 den küçük ise tekrar başla
‘bu satırda sayı=100 olacaktır . Burada sayı değişkenini tekrar sıfırlıyoruz.
SAYI=0
ARA: LCDOUT “ SAYI = “,#SAYI ‘ilk satıra Sayı Desimal olarak yazıldı
LCDOUT $FE,$C0,” Hex = “,HEX2 SAYI ‘ikinci sıraya Hex olarak yazıldı.
PAUSE 500
SAYI=SAYI+10 ‘Sayı değeri 10 artırıldı
IF SAYI<250 THEN ARA ‘sayı değeri 250 den küçük ise ARA’ ya git
END ‘SAYI=250 olunca programı bitir.
Bu kadar LCD bilgisi yeterli olur sanırım. Birazda özel karakterlerin yaratılması işini inceleyelim.
LCD lerde 8 adet yeni karakter yaratmamıza izin verilir. Karakterler 5 x 7 formatında oluşturulur ve 8 adet data halinde özel karakter hafızasına yerleştirilirler. Normalde LCD de Türkçe karakterlerin olmadığını biliyorsunuz. İşte bu karakterleri toplam 8 adet olmak şartı ile kendimiz oluşturup kullanabiliriz.
Önce özel karakter hafıza adreslerini verelim sonra karakterlerin nasıl yaratıldığını açıklayalım.
LCD de 1 . karaktere ait adresin başlangıcı $40 dır. Bu adresten itibaren sırası ile 8 adet adrese 8 bitlik karakter dataları yerleştirilir ise bu karakterin numarası 0 (sıfır) olur ve datalara bağlı olarak yeni karakter ekranda gösterilir.
LCD de 2. karakter hafızası $48, üçüncü $50, dördüncü $58, beşinci $60, altıncı $68,
yedinci $70 ve sonuncu da $78 adresinde yer almaktadır. Oluşturulacak karakterler soldan sağa 5 ve yukardan aşağıya 7 olmak üzere 5X7 matriks te oluşturulmaktadır. Son data (8.ci) daima sıfırdır.
Şimdi ilk Türkçe karakterimizi oluşturalım. Oluşturacağımız karakter Ö harfi olacaktır. Önce kendimize 5 x 7 ebadında bir matriks çizelim. Çizdiğimiz matriks içine ü harfini oluşturacak şekilde Kareleri kapatalım veya açalım. Sonuçta aşağıdaki sisteme göre dataların değerlerini satır satır hesaplayalım.

Data Değeri
|
4. bit
|
3. bit
|
2. bit
|
1. bit
|
0.bit
|
Bit Değerleri
|
16
|
8
|
4
|
2
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
17
|
1
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
17
|
1
|
0
|
0
|
0
|
1
|
17
|
1
|
0
|
0
|
0
|
1
|
17
|
1
|
0
|
0
|
0
|
1
|
31
|
1
|
1
|
1
|
1
|
1
|
Görüldüğü gibi 1 olan bitlere karşılık gelen bit değerleri soldan sağa doğru toplanarak o sıraya ait data elde edilmektedir. İşte ilk sıradaki Binary değeri olan %10001 değeri nin Desimal karşılığı için 16 + 1 değerleri toplanarak 17 değeri bulunmaktadır.
İşte bu şekilde elde edilen datalar daha sonra programın başında bir yerde LCD ye verilir. Nasıl mı şöyle;
LCDOUT $FE,$40,0,17,0,17,17,17,31,0
Böylece sıfır nolu karakteri oluşturmuş oluyoruz. Data adedinin 8 adet olmasına dikkat ediniz. Son data daima sıfır olmalı.
Şimdi Derece işaretini oluşturalım
Hesapladığımız Data lar ise
LCDOUT $FE,$40, 6,9,9,6,0,0,0,0
Şeklinde olacaktır.
Şimdi Derece işaretini 1. karakter olarak oluşturalım.
LCDOUT $FE,$48, 6, 9, 9, 6, 0, 0, 0, 0
Yeniden Karakter üretmeyi öğrendik. Şimdi bunların program içinde nasıl kullanıldıklarına bakalım.
Diyelim ki Sıcaklık göstergesi örneğimize geri dönelim ve ekrana;
SICAKLIK : 23,3 oC şeklinde bir ifade yazmaya çalışalım.
Derece işareti 1 nolu karakterimiz olduğunu varsayıyoruz.
Komut şöyle olacaktır;
LCDOUT “SICAKLIK : “,#ISI,”,”,DEC1 ONDA,” “,1,”C”
ONDA isimli değişkeni verdikten sonra tırnak içinde 2 karakterlik boşluk bırakıyoruz. Daha sonra virgül koyup 1 yani 1. karakteri yazdırıyoruz. Sonra tekrar virgül koyup tırnak içinde C karakterini yazdırıyoruz.
Buradan şu sonuç çıkmaktadır. Oluşturulan karakterler ekrana karakter numarası ile getirilirler.
İkinci örneğimiz 0 (sıfır) nolu karakterimizi ilk satır 5. haneye yazdıralım.
LCDOUT $FE,$84,0
Buraya kadar LCD kullanımını her yönü ile öğrenmiş olduk. İleriki programlarımızda bol bol LCD kullanacağız ve bilgimizi geliştireceğiz.