[LinuxFocus-icon]
Ev  |  Erişimdüzeni  |  İçindekiler  |  Arama

Duyumlar | Belgelikler | Bağlantılar | LF Nedir
Bu makalenin farklı dillerde bulunduğu adresler: English  Castellano  ChineseGB  Deutsch  Francais  Italiano  Nederlands  Turkce  Polish  

convert to palmConvert to GutenPalm
or to PalmDoc

[jan.svenungson]
tarafından Jan Svenungson
<jan.svenungson(at)linux.nu>

Yazar hakkında:

Jan 1996'dan ve kasıtsız yere iki defa reboot yaşadığından beri GNU/Linux kullanıyor. (güç hatalarında reboot belirlenemiyor).



Türkçe'ye çeviri:
Ceyhun Elmas <ceyhun.elmas(at)linuxfocus.org>

İçerik:

 

HD44780 uyumlu LCD-Ekran'ları anlamak

[HD44780]

Özet:

Bu yazı HD44780 uyumlu LCD-display üzerine bir iki şey öğretmeyi amaçlıyor.
Pararlel portunuza bağlantının nasıl yapılacağını ve LCDInfo adını verdiğimiz küçük bir programla nasıl programlanacağını anlatacağız.
Yalnızca görüntüye bağlantıyı değil, aynı zamanda programı çalıştırarak istediğiniz her türlü bilgiye nasıl ulaşacağınızı, donanımın bunu nasıl yaptığını da anlayarak öğreneceksiniz.

_________________ _________________ _________________

 

Giriş

İlk olarak belli bir donanıma ve yazılıma sahip olmalısınız. Standart paralel porta (yazıcı portu) sahip, üzerinde GNU/Linux koşan ve gcc ile glibc bulunan bir bilgisayara sahip olduğunuzu varsayıyoruz.
Ayrıca HD44780 uyumlu LCD ekrana, paralel port kablosuna ve eğer parlaklığı değiştirmek istiyorsanız potentiometer'e gereksiniminiz bulunuyor. Görüntü için standart +5V'luk bir güç bağlantısı gerekecek ( disk-sürücü, sabit-sürücü, vb için ayrılmış kaynaklardan birisini kullanabilirsiniz).

LCD ekrana bağlandığınızda bunun nasıl çalıştığını bilmelisiniz. Normalde bu yazının konusu bu olmamasına rağmen programa yardımcı olacak bileşenlerini anlatacağım.

Son olarak epeyce kullanışlı ekran çıktıları alacağız. Bunu LCDInfo isimli küçük program üzerinden anlatacağım. Bu program HD44780'in pek çok özelliğini destekliyor ancak bu an için çok fazla çıktı vermiyor. Bu program henüz alfa sürümünde ve zaman buldukça bu programı geliştireceğim.
Eğer daha önce C ile program yazmadıysanız biraz C üzerine okumayı düşünmelisiniz. Sizi benim de şu anda olduğum gibi en azından başlangıç seviyesinde varsayıyorum.

 

Nasıl bağlanılacak ?

[schematic] İlk olarak LCD üzerindeki farklı pinlere ve bunların ne yaptığına bakalım.
Pin 1'ye VSS denir ve GND' ye gitmeye yarar.
Pin 2'ye VDD denir ve +5V'luk güç destek pinidir.
Pin 3'e VLC denir ve potentiometer bağlanarak parlaklık için karar vermeye yarar.
Pin 4'e RS denir ve ekranın instructions ya da data'yı getirmesi bu pine bağlıdır.
Pin 5'e R/W denir ve LCD'nin sending ya da receiving yaptığını denetler.
Pin 6'e Enable denir. Bu alçaktan yükseğe ya da tekrar alçağa gittiğinde LCD 4,5 ya da 7-14 okur.
7-14 pinleri data bus line'dır ve DB0-DB7 olarak adlandırılır. Bunlar LCD'ye ana data bitlerini gönderirler ve ekranda nereye ne yazıldığını denetlerler.
15 ve 16 pinleri yalnızca ekran üzerindeki arka ışığı, +5V 'u ve pin 15 ile +5V arasındaki 3.8 Ohm'la GND'ye karşılık gelir.

Yazıcı portu üzerinde nereye bağlantı yapılacağını sağ taraftaki şekil ile göstermeye çalıştım. Üzerine klikleyerek daha büyükce görebilirsiniz.
Eğer ekran parlaklığını değiştirmek isterseniz şemata gözatabilirsiniz. Ben basitçe pin 3 ve pin 1'i GND'ye bağladım ve bu bende çalıştı. eğer sizde garip renkler oluşuyorsa potentiometer eklemeyi düşünmelisiniz.

PC'den güç getirirken lütfen dikkatli olun. Eğer gücü yanlış kablodan getirirseniz, +12V gelecektir ve bu da LCD'nizi bozacaktır. İstediğimiz kablo kırmızı olanı. Sarı +12V ve siyah ise GND'dir.
Eğer doğru kabloyu bağladıysanız bilgisayarı ilk açtığınızda LCD ilk satırda (ve eğer varsa üçüncüde) siyahı göstermeli.

 

LCD nasıl çalışır ?

LCD siz söyleyinceye kadar bişey yapmaz, basitçe doğru yükselme ve düşüş tanımlanıncaya kadar bekler (bu biz enable pinine yüksek değeri verdiğimizde ve sonra pin düşük değeri geri alırken geçen sürede beklemedir.) Bu noktada ekran hangi verinin işlendiğini okur ve sonrasında bilbiyi alır ya da gönderir.Son olarak data bitleri gönderir ya da alır.
Bu yazıda LCD'den bilgi almayacağız. Dolayısıyla R/W pini yazma anlamı taşıyan düşük değerde olacak.
RS pini de karakterlerin yazılması dışında düşük değerde olacak. Herşey düşünülmüş bir yapıda.
Bu programı gerçekten kolay yapıyor.

Bunu bilirsek ekranı açmakla ve bilgiyi almaya hazır hale getirmekle başlamak isteriz. Bu işlemin gerçekleşme sürecinde, biz ekrana bir fonksiyon setiyle ya da benzeri bir şekilde açıl dediğimizde yapılır.
Eğer güç kablosunu bilgisayar içinden getirdiyseniz güç herzaman açık olmalı aksi durumda bu yapmanız gereken ilk şey.
Sonraki "Function set" nasıl bir ekrana sahip olduğunuza bağlı.
Anlamayı kolaylaştırmak için fonksiyon setini kullanırken ne yaptığımızı tam olarak açıklayacağım.
DB2 Karakter Font bitidir ve low olmalıdır bu 5x7 dot matrix anlamına gelir.
BD3 Display Lines bitidir ve high olmalıdır bu 2 çizgi anlamındadır. Eğer ekranda 4 çizgiye sahipseniz ne olur? Önemsenecek bir durum yok, ekran belleğinde birinci ve üçüncü çizgiler aynıdır yani "high" kullanmalısınız.
DB4 Data Length bitidir ve 4 ya da 8 DB olduğuna karar verir. Eğer benim şemadaki gibi ekrana bağlandıysanız bu DB'yi high yapmalısınız.
Sonra DB5'i high yaparak ekrana bunun gerçekten bir "Function Set" yapısı olduğunu söylemeliyiz. Sonra RS ve R/W'nin low ve yükselme ve düşüşün "enable" olduğundan emin olmalıyız. Zamanlamayı elle denetleyin, yalnızca mikrosaniye için dondurduğumuzu varsayıyorum ki bu gerek duyduğumuzdan daha fazla.
 

Kaynak Kod

Burada LCDInfo programının parçalarından bahsedeceğim. Bu sayede HD44780 arayüzünün nasıl çalıştığını daha kolay anlayabilirsiniz. LCDInfo programını sayfanın sonunda ya da doğrudan bu adresten (iolcd.c ve lcdinfo.c) indirebilirsiniz.

Yukarıdaki yapıyı C programı ile yazmak için ne gerekiyor ? İnanın bana bu çok kolay. Adım adım kodu anlatacağım ve C'ye başlangıç seviyeinde bile olsanıy anlayacaksınız.
İlk olarak bazı başlık dosyaları ve fonksiyonlar tanımlıyoruz. (bilgi için kaynağa göz atın). Sonra eğlenceli kısım geliyor.
#define D_REGISTER 0
#define I_REGISTER 2
#define WRITE_DATA 8
#define BASE 0x378

int main(void)
{
  ioperm(BASE,3,1);
  [CUT]
}
Burası paralel porta erişim hakkı sağlayan ana fonsksiyondaki ilk yapı. BASE 0x378 ya da benzeri olmalı ve "3" parçası 0x378, 0x379 ve 0x380'e erişebileceğimiz anlamına geliyor ki bu temelde tüm yazıcı portudur.
Üç adres olmasının nedeni portun data status ve control arasında bölünmesidir. Bunun bizim için anlamı önce data pinini sonra control pinini kur ve bunu bir komutla yapamıyoruz.
Yapacağımız sonraki şey yukarıdaki fonksiyon setini açıklamak.
void function_set(void)
{
  outb(56, BASE);
Bu DB pinini 5x7 dot matrix'e kurar, 2 çizgi vs.
  outb(I_REGISTER + WRITE_DATA, BASE + 2);
Bu RS ve R/W pinlerini yönlendirmeye ve yazmaya kurar. Ben genel değişkenler tanımladım ; I_REGISTER ve WRITE_DATA ve bunlar 2 ve 8' eşit.
Sonra yükselmeyi ve düşüşü tanımlıyoruz.
  outb(ENABLE + I_REGISTER + WRITE_DATA, BASE + 2);
  usleep(0);
  outb(I_REGISTER + WRITE_DATA, BASE + 2);
}
Bu kod basitçe yükselmeyi tanımlar ardından bekler ve düşmeyi tanımlar.usleep(0); komutu gerçekten ideal olanı değil ama ekran için zamanlama kodunu bitirmedim.
Belki bazılarınız RS ve R/W'nin yapı içinde düşük olmaları gerektiğini söylediğimde kod içinde neden on olduğunu merak edebilirsiniz. Çünkü 1, 14 ve 17 pinleri "hardware inverted" dir. Bunun anlamı eğer pin14 "off" ise bu yazıcı portu ile ilişkilidir, pin yüksek değerdedir.
Kolay olduğunu söylemiştim, öyle değil mi ?
 

Karakterleri nasıl görüntüleriz ?

Belki ekranınıda yazı gibi bazı basit şeyleri görüntülemek istiyorsunuz.Problem değil.
Kod (komut kısımları) karakter çıktısı ve fonksiyonlar için aynıdır. Yalnızca bazı değişkenleri değiştirmeliyiz. RS'yi yönlendirmeye kurmak istemiyoruz ancak veriye birlikte başlamak istiyoruz. Bunu print_character() fonksiyonu aşağıdaki gibi yapar :
void print_character(int character)
{
  outb(D_REGISTER + WRITE_DATA, BASE + 2);
  outb(character, BASE);
  outb(ENABLE + D_REGISTER + WRITE_DATA, BASE + 2);
  usleep(0);
  outb(D_REGISTER + WRITE_DATA, BASE + 2);
}
Görebildiğiniz gibi "I_REGISTER" 'ı "D_REGISTER"'a ve "56"'yı "character"'e değiştirdik ancak bu ne anlama geliyor ? Eğer karakter kodlarına bakarsanız bunu anlayacaksınız.
Yalnızca karakter fonksiyonuna gereksinimimiz var (C kullandığımızdan beri ilk olarak tam sayı yapma zahmetine girmemize bile gerek yok ) ve karakterler ekranda toplanacak.

Bu kod ile ile temel bir LCD program yapısına sahipsiniz , kullanın ve dilediğiniz şeyi görüntüleyin, boş ekran belleği, aktif http bağlatıları vs... Bazı örnekler bu adreste bulunuyor : LCDInfo programı bir GNU/Linux bilgisayarda proc dosya sistemi içindeki bazı şeyleri görüntülüyor.
 

Kaynaklar

 

Bu yazı için görüş bildiriminde bulunabilirsiniz

Her yazı kendi görüş bildirim sayfasına sahiptir. Bu sayfaya yorumlarınızı yazabilir ve diğer okuyucuların yorumlarına bakabilirsiniz.
 talkback page 

Görselyöre sayfalarının bakımı, LinuxFocus Editörleri tarafından yapılmaktadır
© Jan Svenungson, FDL
LinuxFocus.org
Çeviri bilgisi:
en --> -- : Jan Svenungson <jan.svenungson(at)linux.nu>
en --> tr: Ceyhun Elmas <ceyhun.elmas(at)linuxfocus.org>

2002-09-23, generated by lfparser version 2.31