Piyasa da çok çeşitli LCD (Liquid Crystal Display) ler satılıyor. Bu gün 2*16 satır LCD nin Assembly dilindeki örnek programını yazıp açıklamaya çalışacağım.
Öncelikle LCD nin pin konfigrasyonunu bilmek gerekiyor. 2*16 LCD lerin 3 tane kontrol, 8 tane veri ve 3 tane Suppy pini olmak üzere toplam 14 pini bulunuyor.
VCC=+5V , VSS=GND, VEE= Contrast bacakları. RS= Kaydedici seçme bacağı(Select Register), R/W= Okuma yazma bacağı(Read/Write), E=Anahtar bacak(Enable). Diğerleri ise D0-D7= veri yazma ve ya veri okuma bacakları(DATA BUS).
LCD ye yazı yazma mantığı kaba taslak şu şekilde oluyor; ilk önce RS yani kaydedici seçme pinini RS=1 yaparak LCD içerisindeki DATA kaydedicisi seçiyoruz. Daha sonra R/W yani okuma yazma pinini R/W=0 yaparak LCD ye veri göndereceğimizi belirtiyoruz. Bu işlemden sonra verileri DATA BUS yani D0-D7 pinlerine gönderiyoruz. Burada verileri gönderirken dikkat etmemiz gereken şey “E” pininin her yolladığımız 8 bit veri için en az 450 ns zaman içerisinde 1 ve 0 yapılması gerekiyor. yani yükselen kenarda E pinine sinyal göndermemiz gerekiyor.
Bir de LCD den veri okuyabiliyoruz. Bu işlem için ise RS=1 yaparak yine veri kaydedicisini seçiyoruz. R/W=1 yaparak okuma yapacağımızı belirtiyoruz ve E pinine bu sefer düşen kenarda sinyal gönderiyoruz. Yani 450 ns boyunca 0 yapıp daha sonra 1 yapıyoruz.
LCD nin kontrol kaydedicisi LCD ye yazacağımız yazının pozisyonunu ve ya LCD üzerindeki kontrol işlemlerini yapabilmemizi sağlar. Bu yüzden LCD ye yazı göndermeden önce LCD nin kontrol kaydedicisini seçerek (RS=0) LCD yi açarız, yazacağımız yazının pozisyonunu düzenleriz ve LCD üzerinde çeşitli işlemler yapabiliriz. LCD nin kontrol kaydedicisi seçili iken LCD nin Data pinlerine(D0-D7) gönderdiğimiz bazı veriler şu LCD üzerinde şu işler yapmamıza yarar; .
Şimdi assembly dilindeki lk programımızı yazalım. LCD yi Pic’imize şu şekilde bağlıyoruz;
RS EQU RB0 ; RB0 RS olarak tanımlanıyor RW EQU RB1 ; RB1 RW olarak tanımlanıyor EN EQU RB2 ; RB2 EN olarak tanımlanıyor COUNTER EQU 0X20; Sayacının Ram adresi tanımlanıyor CLRF TRISD CLRF TRISB CLRF PORTD CLRF PORTB BASLA ; Sonsuz döngü başlığı MOVLW 0x38 ; LCD 2*16 satır ve 5X7 çözünürlüğünde ayarlama komutu. CALL KOMUTGONDER; bu komutu gönderiyoruz. CALL DELAY ; lcd komutu işlemesi için zaman tanıyoruz. MOVLW 0x0E ; LCD ekranını ve cursoru açma komutu CALL KOMUTGONDER; LCD ye komutu gönderiyoruz CALL DELAY ; LCD ye komutu işlemesi için zaman tanıyoruz. MOVLW 0x01 ; LCD ekranı temizleniyor CALL KOMUTGONDER; LCD ye komutu gönderiyoruz CALL DELAY ; LCD ye komutu işlemesi için zaman tanıyoruz. MOVLW 0x80 CALL KOMUTGONDER; LCD ye komutu gönderiyoruz CALL DELAY ; LCD ye komutu işlemesi için zaman tanıyoruz. MOVLW D 'E' ; E harfini gondermek üzere wreg'e yazıyoruz CALL VERIGONDER ; LCD ye komutu gönderiyoruz CALL DELAY ; LCD ye komutu işlemesi için zaman tanıyoruz. MOVLW D 'L' ; L harfini gondermek üzere wreg'e yazıyoruz CALL VERIGONDER ; LCD ye komutu gönderiyoruz CALL DELAY ; LCD ye komutu işlemesi için zaman tanıyoruz. MOVLW D 'E' ; E harfini gondermek üzere wreg'e yazıyoruz CALL VERIGONDER ; LCD ye komutu gönderiyoruz CALL DELAY ; LCD ye komutu işlemesi için zaman tanıyoruz. MOVLW D 'K' ; K harfini gondermek üzere wreg'e yazıyoruz CALL VERIGONDER ; LCD ye komutu gönderiyoruz CALL DELAY ; LCD ye komutu işlemesi için zaman tanıyoruz. MOVLW D 'T' ; T harfini gondermek üzere wreg'e yazıyoruz CALL VERIGONDER ; LCD ye komutu gönderiyoruz CALL DELAY ; LCD ye komutu işlemesi için zaman tanıyoruz. MOVLW D 'R' ; R harfini gondermek üzere wreg'e yazıyoruz CALL VERIGONDER ; LCD ye komutu gönderiyoruz CALL DELAY ; LCD ye komutu işlemesi için zaman tanıyoruz. MOVLW D 'O' ; O harfini gondermek üzere wreg'e yazıyoruz CALL VERIGONDER ; LCD ye komutu gönderiyoruz CALL DELAY ; LCD ye komutu işlemesi için zaman tanıyoruz. MOVLW D 'N' ; N harfini gondermek üzere wreg'e yazıyoruz CALL VERIGONDER ; LCD ye komutu gönderiyoruz CALL DELAY ; LCD ye komutu işlemesi için zaman tanıyoruz. MOVLW D 'I' ; I harfini gondermek üzere wreg'e yazıyoruz CALL VERIGONDER ; LCD ye komutu gönderiyoruz CALL DELAY ; LCD ye komutu işlemesi için zaman tanıyoruz. MOVLW D 'K' ; K harfini gondermek üzere wreg'e yazıyoruz CALL VERIGONDER ; LCD ye komutu gönderiyoruz CALL DELAY ; LCD ye komutu işlemesi için zaman tanıyoruz. GOTO BASLA ; Programı en başa dönderiyoruz. KOMUTGONDER MOVWF PORTD ; Wregdeki veri PORTD ye yazılıyor BCF PORTB,RS ; LCD nin RS pini 0 yapılarak komut kayedicisi seçliyor BCF PORTB,RW ; LCD nin RW pini 0 yapılarak yazma işlemi yapılacağı söyleniyo BSF PORTB,EN ; Yazma işlemi için En pini H-L yapılıyor CALL DELAY BCF PORTB,EN RETURN VERIGONDER MOVWF PORTD ; Wregdeki veri PORTD ye yazılıyor BCF PORTB,RS ; LCD nin RS pini 1 yapılarak veri kayedicisi seçliyor BCF PORTB,RW ; LCD nin RW pini 0 yapılarak yazma işlemi yapılacağı söyleniyo BSF PORTB,EN ; Yazma işlemi için En pini H-L yapılıyor CALL DELAY BCF PORTB,EN RETURN DELAY MOVLW 0X255 ; 255 SAYISI SAYILMAK ÜZERE WREG E YAZILIYOR MOVWF COUNTER ; bU SAYI COUNTER ADRESİNE KAYDEDİLİYOR AGAIN ; NOP ; BOŞ DECFSZ COUNTER; counter bir azaltılıyor ve 0 olduğunda döngüden çıkılıyor. GOTO AGAIN RETURN
Yazma işlemi yapılırken EN pini ilk önce 1 daha sonra 0 yapılır. Bu sürenin en az 450 ns olması gerekiyor. LCD üzerinden okuma yapılırken ise EN pini ilk önce 0 daha sonra 1 yapılır. Yine 450 ns ye ihtiyaç duyuluyor.
Çok fazla hata var tekrar kontrol edip öyle yükleyin.
Ahmet bey Yusuf kontrol etmeden yazı yayınlamaz pek.