LCD'yi nasıl okuyabilirim?

Başlatan Tagli, 08 Kasım 2008, 01:02:25

Tagli

ASM ile yazmakta olduğum bir LCD uygulamasında satır kaydırmak için LCD'nin hafızasını okuma ihtiyacı duyuyorum. Bunu yapmak için kullanılması gereken komut belli aslında ama sorun şu: BF'yi okurken bu işlem bir anda oluyor. Yani R/W ve RS'i ayarladıktan sonra E'yi açtığımızda pinlerden anında okuma yapabiliyoruz çünkü "BF Okuma Komutu"nun işlenme süresi 0 us olarak ifade edilmiş (yani anında okunabiliyor). Ama hafıza okuma komutu işlenmesi için bir süreye ihtiyaç duyuyor. Ben R/W ve RS'i ayarladıktan sonra E'yi açtım diyelim. Sonra ne olacak? Verinin hemen belireceğini sanmıyorum, işlemin yapılmasını beklemek gerekecek. Ama bu sırada BF'yi nasıl kontrol edebilirim?

Ayrıca komut gönderimi nasıl olacak? Normalde komutları gönderirken pin ayarlamalarını yaptıktan sonra E'yi açıp kapatıyoruz. BF okurken ise E'yi 1 yaptığımız anda pinlerde okunacak değer beliriyor. Peki veri okuma, E'nin kontrolü açısından veri göndermeye mi yoksa BF okumaya mı benziyor?

Kafam baya karışmış durumda. LCD'ye diğer komutların nasıl gönderileceğini ve BF'nin nasıl okunacağını biliyorum. Ama hafızadan nasıl veri okuyacağım konusunda hiçbir fikim yok. Ayrıntılı olarak anlatabilirseniz sevinirim...
Gökçe Tağlıoğlu

Tagli

Sorunu çözdüm.
Alıntı yapılan: "HD44780 Datasheet"Registers:

The HD44780U has two 8-bit registers, an instruction register (IR) and a data register (DR).

The IR stores instruction codes, such as display clear and cursor shift, and address information for display data RAM (DDRAM) and character generator RAM (CGRAM). The IR can only be written from the MPU.

The DR temporarily stores data to be written into DDRAM or CGRAM and temporarily stores data to be read from DDRAM or CGRAM. Data written into the DR from the MPU is automatically written into DDRAM or CGRAM by an internal operation. The DR is also used for data storage when reading data from DDRAM or CGRAM. When address information is written into the IR, data is read and then stored into the DR from DDRAM or CGRAM by an internal operation. Data transfer between the MPU is then completed when the MPU reads the DR. After the read, data in DDRAM or CGRAM at the next address is sent to the DR for the next read from the MPU. By the register selector (RS) signal, these two registers can be selected (Table 1).
Burdan da anlaşılacağı üzere biz eğer imleç kaydırma veya adrese gitme emri verirsek LCD "Bu adam veri okumak isteyebilir" diyerek o adresteki veriyi kendi DR (data register)'sine koyuyor. Ve sanırım bu koyma işlemi bir miktar vakit alıyor. Eğer normal bir komut veya yazma gerçekleştirilirse bu veri bizim yolladığımız tarafından siliniyor. Anlaşılan o yüzden veri okumadan önce mutlaka adres ayarlama veya imleç kaydırma komutlarına ihtiyaç duyulduğu söylenmiş, tabi sadece ilk okuma için, takip eden diğer okumalarda buna gerek yok. Biz hafızadan okuma emri verdiğimizde bu veri zaten hazır durumda oluyor ve doğrudan okuyabiliyoruz. Ancak, okuma sonrası güncellenen adres değerindeki yeni verinin tekrardan DR'a aktarılması için de yine belli bir süre beklenmesi gerekiyor. Bu durumda programcı olarak bizim yapmamız gereken şey okuma yapmadan önce BF'yi test edip LCD'nin boş olduğundan emin olmak. LCD meşgul değilse zaten istediğimiz veri DR'de hazır ve hemen okunabilir demektir.

Bu arada, veri okuma sırasında E'nin zamanlaması BF okuma ile aynı. Değişen tek şey RS pini.
Gökçe Tağlıoğlu

XX_CİHAN_XX

Alternatif fikir:
Okumak istediğiniz satırı yada lcd nin tüm satırlarını registerlerde tutup lcd ye yeni yazı yazılacağı zaman önce bu registerlere ardından lcd ye data gönderirseniz, her seferinde lcd de en son yazan değerler ekran registerlerinde kopyalanmış olacaktır. Özellikle lcd de yazı kaydıracağım zaman hep böyle yaparım.
Kolay gelsin.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Tagli

Aslında amacım seri porttan gelen değerleri bir buffer'da tutup sığdığı kadarını ekrana bastırmak idi (daha sonra geri dönülebilecek). Ama bunun hangi formatta basılacağını kullanıcı seçecek, yani hex, ASCII, 10'luk veya 2'lik olabilecek. Ben de her biri için ayrı kod yazmak istemediğim için böyle bir yöntem denedim. Şimdiki program da alt satırı komple okuyup (sadece görünen alanı) 16 byte'lık bir alana atıyor ve sonra bu alandan tekrar okuyarak üst satıra yazıyor. Gerçi senin dediğin gibi yapmak daha mantıklı olurdu ama o sırada kafam gelen veriye odaklandığı için bahsettiğin çözümü göremedim, çünkü ben ekrana yazılacak bilgileri byte olarak saklıyorum ve 1 byte'lık veri ekrana farklı şekillerde basılabiliyor (daha doğrusu basılabilecek...).
Gökçe Tağlıoğlu

swat

Tagli
gerşekten asm dilini kullanıyorsan böyle bişey yapmana gerek yok. istediğin herşeyi o anda kontrol etme imkanın var zaten. dier diller için bunu söyleyemem.

Tagli

@swat, dediklerini biraz daha açabilir misin?
Gökçe Tağlıoğlu