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.
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.
This information is very interesting. hdmi touch screen display manufacturer
YanıtlaSil