LCD den okuma?

Başlatan Ankaralı, 08 Mayıs 2010, 20:00:42

Ankaralı

Herkese selamlar...

Bugüne kadar hep lcd ye yazdırdık peki lcd de yazan bir şeyi pice nasıl okutabiliriz?Proton basic kullanıyorum.

Teşekkürler...
@ NEXYS2

SpeedyX

Hazır kod bekliyorsun galiba ama...

Okuma yapılabilen LCD lerin içinde ram adresleri bulunur, bu adreslere R/W pininin durumuna göre yazabiliriz de okuyabiliriz de...
Mesela text lcd lerde busy biti beklenir, o da okumadır aslında, status registerını okuyup busy bitine bakarız, eğer lcd artık meşgul değil ise vakit kaybetmeden başka veri yazarız... Bazıları da lcd den okumak yerine 10-20ms lik gecikmeler koyarlar.
LCD nin datasheetinde hazır kod hariç tüm sorulara cevap var.

Ankaralı

Hocam yol gösterici oldu muhakkak ama kodlar üzerinden anlamak benim açımdan daha hızlı ve güvenilir olur.
@ NEXYS2

Tagli

Daha önce bu başlıkta konu hakkında bir soru sormuş ve sonradan cevabını kendim bulmuştum. Bir incele. Orada kod yok ama mantığını anlattım. İstersen assembly kodu verebilirim, bilmiyorum işine yarar mı...
Gökçe Tağlıoğlu

Ankaralı

@Tagli

Mantığını az çok kavradım hocam.Asm örneklerden yola çıkarak protona uyarlayabilirim galiba.Zahmet olmassa alayım hocam kodları.
@ NEXYS2

Tagli

#5
Malesef kod MPLAB'da görüldüğü gibi düzenli çıkmadı kopyala yapıştır yapınca. Yine de okunabileceğini sanıyorum. Pin bağlantılarında PORTB kullanıldı. B7, B6, B5, B4 sırasıyla LCD'deki 14, 13, 12, 11 bacaklarına gidiyor. B3, B2, B1 de LCD'deki 6, 5, 4 bacaklarına gidiyor.

Öncelikle BF'yi (Busy Flag) okuyup LCD hazır olana kadar bekleyen kodu vereyim:
LCD_BEKLE				;LCD'nin işlemini bitirmesini bekler
	banksel	TRISB		;Bank 1'e geçildi
	movlw	b'11110001'		;Ayar değeri W'ye atıldı
	movwf	TRISB		;PORTB yönü ayarlandı
	bcf	STATUS,RP0		;Bank 0'a dönüldü
	movlw	b'00000100'		;Komut W'ye yüklendi
	movwf	PORTB		;Komut ayarlandı
	call	BEKLE1US		;1 us bekleniyor
	bsf	PORTB,3		;E açıldı
	call	BEKLE1US		;1 us bekleniyor
	movf	PORTB,W		;PORTB W'ye yedeklendi
	movwf	lcdbuf2		;W geçici değişkene atıldı
	bcf	PORTB,3		;E kapatıldı
	call	BEKLE1US		;1 us bekleniyor
	bsf	PORTB,3		;E açıldı
	call	BEKLE1US		;1 us bekleniyor
	bcf	PORTB,3		;E kapatıldı

	btfsc	lcdbuf2,7		;BF 1 mi? (LCD hala işlem yapıyor mu?)
	goto	LCD_BEKLE		;Meşgulse beklemeye devam et
	bsf	STATUS,RP0		;Bank 1'e geçildi
	movlw	b'00000001'		;Ayar değeri W'ye atıldı
	movwf	TRISB		;PORTB yönü ayarlandı
	bcf	STATUS,RP0		;Bank 0'a dönüldü
	return			;Çağrılan yere dönülüyor


Bu da okuma yapan kod. İmleç konumunu okuyan ile çoğu yeri aynı, o yüzden kodu iki kez yazmayıp ortak kullandım. Kod açıklamalarında görebilirsin. Ayrıca BF'yi okuyan kodla benzerliği de dikkatini çekecektir. Yanlış hatırlamıyorsam kopyala yapıştır yapıp sonradan bir iki yerini değiştirmiştim.
LCD_OKU				;LCD'deki değeri (imleçteki) okur, lcdbuf2'ye yazar
	call	LCD_BEKLE		;Verinin hazır olması bekleniyor
	banksel	TRISB		;Bank 1'e geçildi
	movlw	b'11110001'		;Ayar değeri W'ye atıldı
	movwf	TRISB		;PORTB yönü ayarlandı
	bcf	STATUS,RP0		;Bank 0'a dönüldü
	movlw	b'00000110'		;Komut W'ye yüklendi (okuma)
	goto	LCD_NERDE_0		;Gerisi LCD_NERDE ile aynı, tekrar yazmaya gerek yok

LCD_NERDE				;LCD adres değerini (ve aslında BF'yi de) okur
	banksel	TRISB		;Bank 1'e geçildi
	movlw	b'11110001'		;Ayar değeri W'ye atıldı
	movwf	TRISB		;PORTB yönü ayarlandı
	bcf	STATUS,RP0		;Bank 0'a dönüldü
	movlw	b'00000100'		;Komut W'ye yüklendi
LCD_NERDE_0	movwf	PORTB		;Komut ayarlandı (Buraya LCD_OKU'dan kaynak var)
	call	BEKLE1US		;1 us bekleniyor
	bsf	PORTB,3		;E açıldı
	call	BEKLE1US		;1 us bekleniyor
	movf	PORTB,W		;PORTB W'ye alındı
	andlw	h'F0'		;Gelen değerin son 4 biti sıfırlandı
	movwf	lcdbuf2		;W geçici değişkene atıldı
	swapf	lcdbuf2,F		;Sonraki değere yer açmak için yer değiştiriliyor

	bcf	PORTB,3		;E kapatıldı
	call	BEKLE1US		;1 us bekleniyor
	bsf	PORTB,3		;E açıldı
	call	BEKLE1US		;1 us bekleniyor
	movf	PORTB,W		;PORTB W'ye alındı
	andlw	h'F0'		;Gelen değerin son 4 biti sıfırlandı
	iorwf	lcdbuf2,F		;İki değer birleştirildi
	swapf	lcdbuf2,F		;lcdbuf2 normal hale çevrildi
	bcf	PORTB,3		;E kapatıldı

	bsf	STATUS,RP0		;Bank 1'e geçildi
	movlw	b'00000001'		;Ayar değeri W'ye atıldı
	movwf	TRISB		;PORTB yönü ayarlandı
	bcf	STATUS,RP0		;Bank 0'a dönüldü
	return			;Çağrılan yere dönülüyor
Gökçe Tağlıoğlu

Ankaralı

Eyvallah hocam.Kodların üzerinde biraz çalışıp tekrardan sizi rahatsız edebilirim çok teşekkür ettim.
@ NEXYS2