lcd sürmenin incelkleri

enexs

Üye
Katılım
4 Kas 2008
Mesajlar
99
Puanları
1
Yaş
39
merhaba arkadaşlar
isis te değil gerçek board üzerinde jhd162A lcd sini sürmek için VDD yi +5v vss toprak ve vee ile arasına pot koymak tan başka yapmamız gereken nedir mesala picle lcd arasına direnç bağlamak gerekiyormu yada 15 ile 16. pinlere +led -led falann demiş katoloğunda bunlara falan ihtiyaç varmı
kurban olduğumun isisi takıyodun canavar gibi çalıştırıyordu bilgisayarda ama gerçek hayatta işler feğişiyor demekki
inş kafayı yemeden yardım eden biri çıkar
 
Şimdi öncelikle şunu bilmen gerekir arkadaşım bu tür lcd ler pic ile iki şekilde bağlanır
a: 8 bit data bağlantısı ile
b: 4 bit data bağlantısı ile
Ben bu tür lcdleri kullanırken daima 4 bit data bağlantısı yaparak kullanırım çünki picde fazladan 4 bit kullanmam.
Gelelim LCD nin bağlantı şekline datasheetine bakınca LCD nin normal HD44780 yapısı ile aynı olduğunu gördüm bu da demektir ki lcd yi pice 4 bit ile bağlarken lcd pinlerini aşağıdaki gibi bağlaman gerekir.
1-VSS pini : Bu pin lcd nin negatif besleme pinidir şaseye direk bağlanır
2-VCC pini : Bu pin lcd nin pozitif besleme pinidir +5V gerilim e bağlanır
3-VEE pini : Bu pin lcd nin kontrast ayar pinidir bu pin bağlantısını yaparken VCC ile VSS arasına bir potansiyomtre bağlanır 5Kohm civarında ve potansiyometrenin orta ucu bu pine girilir ve bu pot ile lcd nin kontrast ayarını yapmış olursun.
Ama bana kontrast ayarı lazım değil dersen direk olarak potansiyomtre falan bağlamadan bu pini şaseye bağlayabilirsin hiç bir problem olmaz
4-RS pini : Register select regisyer yani yazmaç seçme pinidir bu pini picin I/O pinlerinden birisine illa ki bağlaman gerekir aşağıda örneğini vereceğim
5-R/W pini : bu pin okuma ve yazma pinidir 0-1 yapılarak lcd ye yazı mı yazdırılacak lcd den veri mi okunacak olduğuna karar vermek için kullanılır ama genellikle uygulamalarda lcd den veri okunmadığı için direk şaseye bağlanır yani direk şaseye bağlaman lazım sadece lcd ye yazı yazdıracaksan
6-E pini : Enable pini LCD yi enable etmeye yarar bu pini de yine RS pini gibi picin I/O pinlerinden birine mutlaka bağlaman lazım örneğini bunun da vereceğim.
7-14 arası pinler lcd nin data pinleridir 7=DB0--8=DB1--9=DB2--14=DB7 olarak geçer 8 bitlik bağlantıda bu pinleri picin bir portuna komple bağlamak gerekir örnğin DB0 pini picin RB0 pinine DB1 pini pinin RB1 pinine gibi
Fakat 8 bitlik bağlantı pek kullanılmadığı için 4 bitlik bağlantı modunda kullanmanı tavsiye ederim fazladan 4 bit elinde kalır başka şeyler için kullanırsın.
4 bitlik bağlantıda ise lcd nin ilk 4 biti yani DB0-DB3 boş bırakılır ve DB4 pini picin RB4 pinine DB5 pini RB5 pinine DB6=RB6 pinine DB7 pini RB7 pinine bağlanır tabii ki picin RB0 pininden bağlanmaya da başlanabilir ama ben daima bu bağlantıyı kullanıyorum hiç bir sorun da olmuyor.
15- Bu pin lcd nin ekran aydınlatması için pozitif besleme pinidir +5V gerilime bağlanabilir uygun görülürse bir direnç ile de akımı sınırlandırılabilir ben direk değil de 10 ile 22ohm arası 2w gibi bir direnç ile +5V a bağlarım az sönük yansa da fazla akım çekip regüle mi ısıtmaz
16- Bu pin de lcd nin ekran aydınlatması için gerekli olan negatif besleme pinidir direk şaseye bağlanır.

Bu konu ile ilgili olarak sana iki çeşit komutlu örnek vereceğim birinci çeşit proton basic ile yazılmıştır ve çalışır şekilde denenmiştir ikinci çeşit ise pic basic ile yazılmış yine çalıştığı denenmiştir.

1-proton basic ile yapılmış program:

Declare LCD_DTPIN PORTB.4 'data pinleri portbye bağlı ve rb4 den başlıyor
Declare LCD_ENPIN PORTB.3 'E pini portb.3e bağlı
Declare LCD_RSPIN PORTB.2 'Rs pini portb.2 ye bağlı
Declare LCD_INTERFACE 4 'LCD pic e 4 bit data bağlantısı ile bağlı
Declare LCD_LINES 4 'LCD 4 satırdan oluşuyor
delayms 500 ' LCD nin açılmasını bekle
print At 1,1,"merhaba"
print At 2,1,"dunya"
DONGU:
GOTO DONGU

2-picbasic ile yapılmış deneme





DEFINE LCD_DREG PORTA 'LCD data bacakları hangi port a baglı?



DEFINE LCD_DBIT 0 'LCD data bacakları hangi bitten baslıyor?



DEFINE LCD_EREG PORTA 'LCD Enable Bacagı Hangi Port a baglı?



DEFINE LCD_EBIT 4 'LCD Enable Bacagı Hangi bite baglı ?



'define LCD RWREG PORTA 'LCD R/W Bacagı Hangi Port a baglı?



'define LCD_RWBIT 2 'LCD R/W Bacagı Hangi bite baglı ?



DEFINE LCD_RSREG PORTA 'LCD RS Bacagı Hangi Port a baglı ?



DEFINE LCD_RSBIT 5 'LCD RS bacagı Hangi Bite baglı ?



DEFINE LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak baglı?



DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor

LCDOUT $FE,1,"MERHABA"
LCDOUT $FE,$C0,"DUNYA"
DONGU:
GOTO DONGU

eğer çizimleri de lazım dersen haber ver onları da çizip yollamaya çalışırım şu anda proteus programı yüklü olmadığı için çizimlerini yapamadım.

Bu arada LCD nin datasheetini :
http://www.alldatasheet.com/datasheet-pdf/pdf/127934/ETC1/JHD162A.html
adresinden indirebilirsiniz buraya upload ettim.

Yukarıda sözünü ettiğiniz direnç mirenç bağlamanıza falan hiç bir gerek duymaması gerekir ve direk çalışması gerekir.Yukarıda elimden geldiğince düzgün ifadeler ile anlatmaya çalıştım fazlası lazım olursa haber verin çizimlerini de yapalım.
saygılarımla
 
bu ayrıntılı ve açıklayıcı anlatımın için teşekkür eder siz tecrübeli ve paylaşımcı üyelerin hepsine saygılar sunarım. çok faydalı olduğunu söylememe bile gerek yok lcd ile ilgili bi problem kalmadı çok şükür. Bundan sonraki problemlerde de sizlerden faydalanmak isterim .
saygılar
 
teşekkür ederim kardeşim yanlız bende şunu istiyorum protonla olur dendi ben basic kullanıyorum..
16f877 lcd ekranı sürüyorum Fakat 2.satırda şunu olsun istiyorum.. gelen analog veriyi dijital olarak okurken sayı olarak 5.00 volt degilde bu şekilde > kademeli olarak ilerlemesini istiyorum..yani giriş düşükken > bu şekilde yükselirken >>> gibi kadememeli olarak ilerlemesini istiyorum ama
bir türlü içinden çıkamadım bir çok örneklerden faydalandım ama olmadı..yardımcı olursanız çok sevinecem..herkese allah kolaylık versin.şimdiden telekkür ederim..
 
Bu yararlı yazı için has_artvin_li arkadaşa sonsuz teşekkürler - sayesinde başağrılarım dindi.
Yazıyı yazdırdım ekrana fakat her iki satırda da 8-er karakter yazılabiliyor, 16 karakterin tamamını kullanabilmem için ne yapmam gerekiyor?
Kullandığım pic 16F84A.
Tanımlamalarım şu şekilde:

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 2
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

şimdiden teşekkürler
 
"xxxxx" tırnak içindeki yere xxx ile gösterildiği şekilde 16 karakter yazıyorsunuz ama çıktı olarak çıkmıyor mu ? eğer harfler çıkıyor fakat 16 karakter çıkmıyorsa ya TÜRKÇE karakterler kullanıyorsunuz yada tam olarak 16 karakter yazmıyorsunuz yazdığınız programı burada paylaşırsanız üzerinde yorumlar yapabiliriz.....
 
Evet aynen dediğiniz gibi "xxxxxxxxxxxxxxxx" yazıyorum fakat xxxxxxxx çıkıyor ekranda ve arkası yok :(
Proteusta herşey ok fakat uygulamada olmuyor :(


Program şu şekilde:

DEFINE LCD_DREG PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 3 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTB 'LCD RW Bacağı PortB de bağlı
DEFINE LCD_RWBIT 2 'LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 1 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 'LCD 2 sıra olarak çalışıyor.

TRISA=1 'A portu giriş olarak ayarlandı.
TRISB=0 'B portu çıkış olarak ayarlandı.

SYMBOL TUS=PORTA.0
SYMBOL TUS1=PORTA.1
symbol TUS2=PORTA.2
symbol TUS3=PORTA.3
SYMBOL RELE=PORTB.0

LOW PORTB.0
LOW PORTB.2 'RW bacağı ekrana yazmaya imkan vermek için LOW yapıldı.
PAUSE 200 ' LCD nin kullanıma hazır hale gelebilmesi için gerekli süre


LCDOUT $FE,1 ' Ekranı temizle
LCDOUT " HAZIR"
LCDOUT $FE,$C0," TERM. 2 GERIDE "

BASLA:
low PORTB.0
IF TUS=1 then

TEST:

LCDOUT $FE,1 'Önce Ekranı siliyoruz.
LCDOUT " TEST BASLADI" 'ilk sıra baştan itibaren yazdırıyoruz. Aslında bu komutu başka bir şekilde de yazabiliriz, şöyle
PAUSE 150
'==== yamuk terminal testi ====



'IF TUS1=0 then BUTON

BUTON:
IF TUS1=0 and TUS2=1 and TUS3=1 then BITIR
IF TUS1=0 and TUS2=0 and TUS3=1 then TH
IF TUS1=0 and TUS2=1 AND TUS3=0 then TX
IF TUS1=0 and TUS2=0 and TUS3=0 then TA
IF TUS1=1 and TUS2=0 AND TUS3=0 then TU
IF TUS1=1 and TUS2=1 AND TUS3=1 then TU
IF TUS1=1 and TUS2=1 AND TUS3=0 then TU
IF TUS1=1 and TUS2=0 AND TUS3=1 then TU

TH:
LCDOUT $FE,1 'Ekranı siliyoruz.
LCDOUT " HATA"
LCDOUT $FE,$C0," TERM. 1 GERIDE" 'ikinci satıra yazdırıldı.
While TUS1=0 and TUS2=0 AND TUS3=1
WEND
GOTO basla
TX:
LCDOUT $FE,1 'Ekranı siliyoruz.
LCDOUT " HATA"
LCDOUT $FE,$C0," TERM. 2 GERIDE" 'ikinci satıra yazdırıldı.
While TUS1=0 and TUS2=1 AND TUS3=0
WEND
GOTO basla
TA:
LCDOUT $FE,1 'Ekranı siliyoruz.
LCDOUT " HATA"
LCDOUT $FE,$C0,"TERM.1-2 GERIDE" 'ikinci satıra yazdırıldı.
While TUS1=0 and TUS2=0 AND TUS3=0
WEND
GOTO basla
TU:
LCDOUT $FE,1 'Ekranı siliyoruz.
LCDOUT " HATA"
LCDOUT $FE,$C0," TERMINAL YAMUK" 'ikinci satıra yazdırıldı.
WHILE TUS1=1
WEND
goto basla

ENDIF

GOTO BASLA
BITIR:
LCDOUT $FE,1 'Ekranı siliyoruz.
LCDOUT " test"
LCDOUT $FE,$C0," OK"
HIGH PORTB.0

While TUS=1
WEND
GOTO HAZIR

HAZIR:
LCDOUT $FE,1 ' Ekranı temizle
LCDOUT " HAZIR"
GOTO basla

End 'Program sonu


eğer proteusta ki devre şemasını da buraya yüklemeye başarabilirsem onu da paylaşacağım.
 
DEFINE LCD_DREG PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 3 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTB 'LCD RW Bacağı PortB de bağlı
DEFINE LCD_RWBIT 2 'LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 1 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 'LCD 2 sıra olarak çalışıyor.

TRISA=1 'A portu giriş olarak ayarlandı.<<<<a portu giriş olarak ayarlanmadı sadece a portunun 1.biti giriş oldu..
TRISB=0 'B portu çıkış olarak ayarlandı.

SYMBOL TUS=PORTA.0
SYMBOL TUS1=PORTA.1
symbol TUS2=PORTA.2
symbol TUS3=PORTA.3
SYMBOL RELE=PORTB.0

LOW PORTB.0
LOW PORTB.2 'RW bacağı ekrana yazmaya imkan vermek için LOW yapıldı.
PAUSE 200 ' LCD nin kullanıma hazır hale gelebilmesi için gerekli süre


LCDOUT $FE,1 ' Ekranı temizle
LCDOUT " HAZIR"
LCDOUT $FE,$C0," TERM. 2 GERIDE "

BASLA:
low PORTB.0

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>bu if in endifi yok :)
IF TUS=1 then

TEST:

LCDOUT $FE,1 'Önce Ekranı siliyoruz.
LCDOUT " TEST BASLADI" 'ilk sıra baştan itibaren yazdırıyoruz. Aslında bu komutu başka bir şekilde de yazabiliriz, şöyle
PAUSE 150
'==== yamuk terminal testi ====



'IF TUS1=0 then BUTON

BUTON:
IF TUS1=0 and TUS2=1 and TUS3=1 then BITIR
IF TUS1=0 and TUS2=0 and TUS3=1 then TH
IF TUS1=0 and TUS2=1 AND TUS3=0 then TX
IF TUS1=0 and TUS2=0 and TUS3=0 then TA
IF TUS1=1 and TUS2=0 AND TUS3=0 then TU
IF TUS1=1 and TUS2=1 AND TUS3=1 then TU
IF TUS1=1 and TUS2=1 AND TUS3=0 then TU
IF TUS1=1 and TUS2=0 AND TUS3=1 then TU

TH:
LCDOUT $FE,1 'Ekranı siliyoruz.
LCDOUT " HATA"
LCDOUT $FE,$C0," TERM. 1 GERIDE" 'ikinci satıra yazdırıldı.
While TUS1=0 and TUS2=0 AND TUS3=1
WEND
GOTO basla
TX:
LCDOUT $FE,1 'Ekranı siliyoruz.
LCDOUT " HATA"
LCDOUT $FE,$C0," TERM. 2 GERIDE" 'ikinci satıra yazdırıldı.
While TUS1=0 and TUS2=1 AND TUS3=0
WEND
GOTO basla
TA:
LCDOUT $FE,1 'Ekranı siliyoruz.
LCDOUT " HATA"
LCDOUT $FE,$C0,"TERM.1-2 GERIDE" 'ikinci satıra yazdırıldı.
While TUS1=0 and TUS2=0 AND TUS3=0
WEND
GOTO basla
TU:
LCDOUT $FE,1 'Ekranı siliyoruz.
LCDOUT " HATA"
LCDOUT $FE,$C0," TERMINAL YAMUK" 'ikinci satıra yazdırıldı.
WHILE TUS1=1
WEND
goto basla

ENDIF

GOTO BASLA
BITIR:
LCDOUT $FE,1 'Ekranı siliyoruz.
LCDOUT " test"
LCDOUT $FE,$C0," OK"
HIGH PORTB.0

While TUS=1
WEND
GOTO HAZIR

HAZIR:
LCDOUT $FE,1 ' Ekranı temizle
LCDOUT " HAZIR"
GOTO basla


Sadece bir hata bulduk gibi onuda yazdım ama şemada şart tabi...
 
"TRISA=1 'A portu giriş olarak ayarlandı.<<<<a portu giriş olarak ayarlanmadı sadece a portunun 1.biti giriş oldu.."

Programcılık konusunda okadar iddalı değilim usta ama
TRISA=1 dediğimiz zaman tum A portları ğiriş olduğunu biliyorum ben
satece tek port ayarlamamız için
TRISA=%00001 olarak tanımlamamız gerekmiyor mu?

Neyse - devre bu şekilde fonksiyonlarını içra ediyor - tek roblem ekrana gelen çıktılar yarım olması.
Bu konuda da yardımcı olursan bana devremi eksilsiz tamamlamış olacağım :)
Yoksa ya çıktıları kısaltmam gerekecek ( ki ozaman operatör hatayı tespit etmekte zorlanacak)
ya da başka pic ile deneyeceğim.
 
vdd ile vee yi yer değiştirirsen o işi çözersin gibi bir his var içimde çünkü vdd lcd beslemesi vee de kontrast ucudur sen kontrasa +5v vermişsin beslemeyide potun orta ucundan almışsın o iki pini yer değiş işin çözülecektir...
Birde R/W yi direk olarak şaseye bağlayıp tanımlama satırlarından da

DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 2

komutlarını kaldır

Şimdilik görünen probleminiz bu...
 

Forum istatistikleri

Konular
128,381
Mesajlar
917,140
Kullanıcılar
450,262
Son üye
EminFurkan

Yeni konular

Çevrimiçi üyeler

Geri
Üst