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.

test_output-20514

Ö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).

1
Embedded Systems Book (Muhammed Ali Mazidi)

 

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; .

2
Embedded Systems Book (Muhammed Ali Mazidi)

 

Şimdi assembly dilindeki lk programımızı yazalım. LCD yi Pic’imize şu şekilde bağlıyoruz;

3
Embedded Systems Book (Muhammed Ali Mazidi)

 

 

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.

 

 

2 YORUMLAR

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz