LCD Ekran Kullanımı (Dot Matrix) Bölüm 1


Sıkça kullanılan 2x16 yanı sıra 4x16 ve 4x20 gibi farklı satır-sütun sayıları olan ekranlar mevcut. Bu ekranların farklı kontrol/sürücüleri bulunmaktadır. Bunlardan bazıları; HD44780U, ST7032, ST7066U, KS0066, NT7603 ve SPLC780 gibi birçok ürün mevcut. Datasheet incelediğimde kullanım olarak farklarını göremedim. Bazı komutların gerçekleşme hızları farklı bu fark mikro saniye biriminden olduğu için önemli görmüyorum. Elimden geldiğince tüm farklı ürünlerin özelliklerine yer vereceğim fakat elinizde bulunan modülde kullanılan kontrolcüye göre komut oluşturmanız daha iyi olacaktır. Kullanıma yönelik teknik olmayan ve benim kullandığım dolayısıyla öğrendiğim bilgileri aktarmaya çalışacağım.

LCD modüller menü tuşları üstünde olan, i²C haberleşme modülü olan veya ekran ile birlikte kontrolcünün bulunduğu modüller olarak piyasada bulunmakta. I²C haberleşme modülü olanlar bu anlatımın dışındadır. Aşağıdaki şematik gösterim pin isimlerini göstermektedir. İlk olarak bu pinlerin ne işe yaradıklarını anlatamaya çalışacağım.



VSS: Gnd negatif pini.

VCC: +5 volt pozitif besleme.

VEE (VE): Yazı karakterlerinin zıtlık ayar pini. Vcc ve Gnd arasına bağlı potansiyometre ile ayar yapılabilir.

LED-:Arka aydınlatma led negatif pini.

LED+: Arka aydınlatma led pozitif besleme, Aydınlatma şiddetini ayarlamak için direnç, potansiyometre, foto direnç veya PWM kullanılabilir.

D0-D7: Veri (data) pinleri. 8bit veri aktarımı için tümü veya 4bit için D4-D7 kullanılır. Bu pinlerin "1"-"0" olmasına göre modül yönetilir.

RS: Register (saklayıcı) seçimini yaptığımız pin, detaylı anlatımını yapacağım.

RW: Okuma ya da yazma (read-write) seçimini yaptığımız pin, detaylı anlatımını yapacağım.

EN (E): Veri alıp verirken modüle saat darbelerinin gönderildiği pin.

Detaylı anlatıma başlamadan önce Register Nedir? konusuna göz atmak isteyebilirsiniz. 8 bit veri aktarımının bazı modüllerde D0-D3 pinleri boşta olduğu için yapılamayacağından 4 bit veri aktarımı üzerinden ilerleyeceğim yine RW pini Gnd'ye bağlı yani "0" olduğundan okuma (read) fonksiyonlarını gerçekleştiremiyoruz. Deneme şansım olmadığı için kabaca değineceğim meşgul (busy flag) bayrağı okumasına örnek olarak taslak fonksiyon paylaşacağım.



Yukarıdaki resimde veri alış-verişi gösterilmiştir. EN pini saat darbeleri gönderdikçe modüle veri yazılmış, okunmuş veya komutlar gönderilmiş. Veri gönderirken EN "1" olduğunda data pinleri (D4-D7) "1" ya da "0" olarak saklayıcıya yazılmış. Aynı şekilde saklayıcıdan okunarak veri alınmış. RW "0" olduğunda veri ve komut yazılmış,  "1" olduğunda okunmuş. RS "1" olduğunda veri saklayıcısı ile "0" olduğunda komut saklayıcısı ile veri alış-verişi yapılmış.

Şimdiye kadar bahsettiğim giriş bilgileri üzerinden detaylara inelim. LCD modülde bulunan kontrolcülerde 2 adet saklayıcı bulunmaktadır. Bunlardan biri veri okuyup yazdığımız veri (data register) saklayıcısı diğeri ekran ile ilgili ayarların yapıldığı talimat, komut (Instructions register) saklayıcısıdır. Komutlar kontrolcülerde aynı isim ve adresteler. İşleme süreleri arasında farklar bulunmakta bu komutlardan sonra bekleme yapmak gerekiyor. Aksi halde gönderilen verilere cevap verememekte hatalı işlemler oluşmaktadır. İşte burada bekleme yerine busy flag kontrol edilerek döngüye girilebilir ve bu daha doğru bir uygulama olacaktır. Ne yazık ki satılan modüller arduino için yapılmış gibi RW pini Gnd ye bağlanıp "0" yapılmış



Öncelikle tabloda ve yukarıda söylediğim gibi komut gönderirken RS "0" yazma yapacağımız için RW "0" olmalıdır. Tabloda 8bit D0-D7 arası bitler bulunmakta fakat biz 4bit veri ile bu işlemleri yapacağız sonuçta aynı (Dec, Bin ya da Hex format) veriyi göndereceğiz. Tek farkı 8bit veri yollarken tek seferde gönderdiğimiz veriyi ikiye bölerek önce yüksek sonra düşük bit veriyi göndererek yapacağız.

Clear display: Ekranı temizleme komutu (Dec=1, Bin=0b00000001, Hex=0x01) verisini gönderdiğimizde ekranı siler. Tabloda komut sonrası 1,53ms işlem süresi gösterilmiş meşgul durumu okunamıyorsa en az 2ms bekleme yapılmalıdır. Bu ve Return home komutu dışında mikro saniye biriminde işlem süresi olduğu için diğer komutlarda bekleme programın işleyiş hızına bağlı olarak kullanılmayabilir.

Return Home: İmleci başlangıç adresine "DDRAM 00" getirir. (Dec=2, Bin=0b00000010, Hex=0x02)

Entry Mode Set: İmleç yönü ve ekran hareketi ayarlar. 0b00000110=0x06 olduğunda başka deyişle I/D "1" olduğunda imleç sağa doğru, 0b00000100=0x04 I/D "0" olduğunda imleç sola doğru hareket eder. 0b00000111=0x07 veya 0b00000101=0x05 yani SH "1" olduğunda ekran hareket eder. İmleç sağa doğru ve ekran kaydırma açıkken imleç pozisyonunu belirtmezseniz ilk pozisyondan geriye doğru gideceğinden görünen adrese gelene kadar ekranda bir şey göremezsiniz.

Display ON/OFF: D ekranın açık "1" ya da kapalı "0", C imlecin açık "1" ya da kapalı "0" ve B blink imlecin kutu şeklinde belirmesi "1" ya da "0" çizgi olarak görünmesi ayarlanır. Örn:0b00001110=0x0E Ekran açık imleç açık blink kapalı.

Cursor or Display Shift: Sadece ekrana karakter yazdırırken kullanılabilir. Ekran kaydırma yapılırken ekranda DDRAM adresleri değişmez. S/C "1" imleci "0" ekranı kaydırır. R/L Kaydırmanın yönünü "1" sağ "0" sol belirler.

Function Set: DL “1”  8bit veri “0” ise 4bit veri aktarımı, N “1” ekran iki satır “0” ise tek satır, F “1” karakterlerin 5x10 nokta “0” ise 5x8 nokta olduğunu ayarlar. Örn:0b00101000=0x28 4bit veri 2 satır ekran ve 5x8 noktalı karakter.

Lcd modüllerde ASCII kodlarına göre adreslenmiş karakterlerin bulunduğu CGROM ve bizim özel karakterlerimiz oluşturup görüntülememize imkân veren CGRAM ve ekranda karakterlerin bulunduğu yeri belirleyen DDRAM bellek bölümleri bulunmaktadır. Bu kısa açıklamadan sonra anlatıma devam edelim.

Set CGRAM Address: 8 adet özel karakter kaydetmemize imkân tanıyan bellek adresidir. Oluşturduğumuz karakterleri hafızaya almak için önce CGRAM komutunu kullanmamız gerekir. 0b01000000=0X40 ilk adrestir. Her karakter 5 yatay 8 düşey noktadan oluşur.


  




Yukarıda büyük A harfinin internette çok bulunan karakter oluşturan bir sitede yapılmış görüntüsü ve ikilik sayı sisteminde tanımlanmış hali bulunmaktadır. “1” olanlar koyu “0” olanlar açık renk olarak kalmıştır. Gördüğünüz gibi her satır 5 bit ve her karakter 8 satır ile tanımlanır. Sonuç olarak her karakter için 8 byte adres ayrılır. İlk karakterin adresi 0b01000000=0X40=64 ise 2. Karakterin adresi 0b01001000=0x48=72 olması gerekir. 3. Karakterin adresi 0b01010000=0x50=80 şeklinde devam ederek 7. Karakter 0b01111000=0x78=120 adresine yazılır.

Set DDRAM Address: Ekranda imlecin ya da yazılan karakterin adresini belirleyen komuttur. Satır sayısı tek olarak girildiğinde ekranda 80 karakter yazılır( ilk adres "00" son adres "4F"), 2 satır girildiğinde her satıra 40 karakter yazılır. (Üst satır ilk adres "00" son adres "27", alt satır ilk adres "40" son adres "67") Ekranı kaydırarak yazılan karakterleri görebilirsiniz.
Aşağıda 4x20 karakterli bir ekranın adres verisi bulunmaktadır. İlk adres “00” ile başlar 16 sütun olan bir ekranda “0F” ile biter, 20 sütun olan ekranda ise “13” ile biter. Alt satır ise “40” ile başlar bu rakamlar (Hex) 16lık sayı sistemi formatındadır. DDRAM açıklamasında 1Ac6-Ac5….Ac0 şeklinde gösterilmiştir. İlk adres “00” olan aslında 0b10000000=0x80=128’dir. 


0b10000001=0x81=129, 0b10000010=0x82=130 şeklinde 1 artarak devam eder.

2. Satır ilk adresi “40” 0b11000000=0xC0=192 yani 0x80+0x40 sonucudur ve bir artarak devam eder

3. Satır ilk adresi “14” 0b10010100=0x94=148

4. Satır ilk adresi “54” 0b11010100=0xD4=212’dir.

Read Busy Flag: Bu komuta kadar tüm komutlarda RS ve RW “0” olarak veri gönderdik. Bu komut okuma yaptığı için RW “1” olacak ve EN pininden gönderdiğimiz saat darbeleriyle D7-D4 pinlerinden önce yüksek bitleri sonra düşük bitleri okuyacağız. Alınan 8 bit verinin (BF-A6-A5-A4-A3-A2-A1-A0) 7 numaralı bit “1” ise kontrolcü meşgul ve veri alamaz “0” ise veri alabilir demektir. Fonksiyon denenmemiştir.


void lcd_kontrol(){
         uint8_t okdata;
         DDRD&=~0xF0;//portd7-4 data pinleri giriş yapıldı      
         RW_HIGH;// RW pini "1" yapıldı okumaya hazır           
      do
         {EN_HIGH;
         okdata=(PIND<<4);//yuksek   bit okundu
         _delay_us(1);
         EN_LOW;
         _delay_us(1);
         EN_HIGH;
         okdata|=(PIND&0x0F);// düşük bit okundu
         _delay_us(1);
         EN_LOW;
         _delay_us(4);
     } while (okdata&0x80); //Bit 7 "1" ise döngüde kalır
                  
         DDRD|=0xF0;//portd7-4 data pinleri çıkış yapıldı
         RW_LOW;//RW pini "0" yapıldı yazmaya hazır
}

Write Data to Ram:  Şimdiye kadar tüm bilgileri komut saklayıcısına gönderdik. CGRAM ve DDRAM adres bilgilerini gönderdikten sonra veri saklayıcısına bilgi göndereceğiz. Bu yapılan artık komut gönderimi değildir. Bu yüzden RS (register seçiciyi) “1” ve yazma yapacağımız için RW “0” olacaktır. Data pinleriyle yüksek bit önce olmak koşuluyla veri göndereceğiz. Veri gönderimi yaparken yine modüle saat darbeleri göndereceğiz. Bu şekilde büyük “A” harfini yazdırmak için CGROM bellekteki adresi göndermemiz yeterli olacaktır. Bu adres aynı zamanda ascii kodlarına karşılık gelir. Aşağıdaki tabloda “A” için yüksek bit (upper 4bits) “0100” ve düşük bit (lower 4bits) “0001” dir. Yüksek ve düşük bitleri birleştirdiğimizde: 0b01000001=0x41=65 sayısını buluruz. Ekranda yazdırmak istediğimiz her şeyi karakter olarak göndermemiz gerekir. Bazı kontrolcülerde CGROM ilave karakterler olabilir. Bu nedenle elinizde bulunan modelin datasheet' ini okumanız gerekir.



Şimdilik burada bitiriyorum devamında örnek bir programla ve fonksiyon açıklamasıyla devam edeceğim.




1 yorum: